はじめに
AWS 認定 Machine Learning Engineer - Associate を取得したので、その学習過程で得た知見を記事としてまとめます。
機械学習のライフサイクルには、モデルの構築から本番運用に至るまでにさまざまな工程があります。中でも、データ準備や特徴量エンジニアリングはモデル性能を大きく左右する重要なステップです。
特徴エンジニアリングとは?
特徴量エンジニアリング(Feature Engineering)とは、生データをモデルが学習に利用できる形(特徴量)へ変換するプロセスのことです。
特徴量とは、アルゴリズムが入力として扱うデータの属性のことを指します。数値・カテゴリ・テキストなど、形式はさまざまですが、いずれも対象問題に関連する重要な側面を表します。
例: 住宅価格予測における「寝室数」「所在地」「築年数」など。
特徴量エンジニアリングが重要とされるのは、具体的に次のような理由があります。
- 教師あり学習: 適切に設計された特徴量は、入力変数とラベルの関係を正しく学習させ、予測精度を高める
- 教師なし学習: クラスタリングでは、特徴量の品質がデータ構造や隠れたパターンの発見につながる
特徴エンジニアリングの重要性
効果的な特徴量設計は、モデル性能を大きく左右します。主な効果は次の通りです。
-
精度の向上:
- 意味のある特徴を選択・構築することで、予測性能が改善される
-
過学習の削減:
- 関連性の高い特徴に集中することで、汎化性能が高まる
-
解釈性の向上:
- 明確な特徴は、モデルの意思決定を理解・説明しやすくする
-
効率の向上:
- 不要な特徴を減らすことで、計算コストが削減され、学習・推論が高速化する
特徴エンジニアリングの主要プロセス
特徴量エンジニアリングは、データをモデルが学習しやすい形に整えるための一連のステップです。代表的なプロセスを整理します。
1. 特徴量の作成(Feature Creation)
既存のデータから新しい特徴を作ります。
- ドメイン知識に基づく派生: 年齢を「10代 / 20代 / 30代」といったカテゴリに変換
- データ駆動での生成: 購買履歴から「1日あたり平均購入額」を作成
- 相互作用特徴: 「価格 × 数量」から「合計金額」を作る
2. 特徴量の変換(Feature Transformation)
形式や分布を整えて、学習しやすくします。
- スケーリング: 値の範囲を揃える(例: 0〜1に正規化)
- カテゴリ変数のエンコード: 「男性 / 女性」を数値に変換(例: One-hot エンコーディング)
- 数値変換: 対数や平方根で分布の偏りを抑える
3. 特徴量の抽出(Feature Extraction)
重要な情報を残しつつ、データを圧縮・要約します。
- PCA(主成分分析): 似たような特徴をまとめ、少数の指標に圧縮
- 集約: ユーザーごとの「平均購入額」や「合計利用時間」を計算
4. 特徴量の選択(Feature Selection)
すべての特徴を使うのではなく、役立つものだけを残します。
- フィルタ法: 相関や統計的な指標で選ぶ
- ラッパー法: 実際にモデルを動かして精度が良い組み合わせを選ぶ
- 組み込み法: 決定木やランダムフォレストが出す「特徴量の重要度」を利用
5. 特徴量のスケーリング(Feature Scaling)
特徴ごとの単位の違いを揃えます。
- Min-Maxスケーリング: 値を0〜1に変換
- 標準化(Zスコア): 平均0・分散1に揃える
このプロセスを繰り返すことで、データは「そのままでは使えない生データ」から「モデルが理解しやすく、予測精度の高い学習データ」へと変わっていきます。
よく使われるテクニックと例
1. ワンホットエンコーディング
カテゴリ(文字データなど)を機械学習モデルが扱える数値に変換する方法です。
ポイントは「大小関係を持たせずにベクトルとして表す」ことです。
例えば「性別 = 男性 / 女性」を単純に数値化すると:
- 男性 = 0
- 女性 = 1
この場合、モデルは「女性 > 男性」という誤った大小関係を学習してしまう可能性があります。
ワンホットエンコーディングでは、次のようにベクトル(行列)で表現します。
顧客ID | 性別(男性, 女性) |
---|---|
101 | [1, 0] (男性) |
102 | [0, 1] (女性) |
103 | [0, 1] (女性) |
これなら「男性」と「女性」は ただ異なるラベル として表現され、大小関係を持たずに数値化できます。
2. 数値スケーリング
数値の大きさ(スケール)がバラバラだと、学習に偏りが出ます。
例えば「年齢(20〜60)」と「年収(数百万〜数千万)」を一緒に学習させると、桁が大きい「年収」が強く影響してしまい、「年齢」の効果が無視されることがあります。
これを防ぐために、数値を一定の基準に揃える処理が「スケーリング」です。
入力データ:
年収(円) = 3,000,000, 6,000,000, 9,000,000
代表的な方法
-
Min-Max 正規化
- 値を 0〜1 の範囲に収める方法
- 例:
3,000,000 → 0.0, 6,000,000 → 0.5, 9,000,000 → 1.0
- ニューラルネットワークなど「値の範囲」が重要なモデルでよく使う
-
Zスコア正規化(標準化)
- 平均を0、標準偏差を1に変換する方法
- 例: 平均が 6,000,000 の場合 →
3,000,000 → -1
6,000,000 → 0
9,000,000 → +1
- データの「ばらつき」を揃えるのに有効
- 線形回帰やロジスティック回帰など、統計的なモデルでよく使う
-
対数変換(Log Transformation)
- 値が極端に偏っているときに使う方法
- 例: 「1,000円」「10,000円」「1,000,000円」 →
log
を取ると差が縮まる - 金額やアクセス数など「一部が極端に大きい」データに有効
こうしてスケールを揃えることで、すべての特徴量を「公平に」扱えるようになります。
3. 日付特徴の抽出
日時データはそのままでは「ただの文字列」や「連続した数字」として扱われてしまい、
機械学習モデルにとって意味を持ちません。
そこで、日付や時刻から「学習に役立つ要素」を取り出すのが日付特徴の抽出です。
入力データ:
2023-07-01 14:32:00
抽出後:
- 年 = 2023
- 月 = 7
- 日 = 1
- 曜日 = 土
- 時間 = 14
活用例
- 曜日 → 平日か休日かで購買行動が変わる
- 月 → 季節やキャンペーンによる売上変動を捉えられる
- 時間 → 朝と夜でアクセス数に違いが出る
ポイント
- 「日時」をそのまま使うと大小関係(例: 20230701 < 20230702)だけが学習されてしまう
- 「年・月・曜日・時間」といった意味のある要素に分解することで、時間的なパターンをモデルが学習できるようになる
4. 集計特徴
複数のデータをまとめて、よりシンプルで意味のある特徴を作る方法です。
個々のデータをそのまま使うのではなく「平均」「合計」「最大値」などを算出することで、全体の傾向を表現できます。
入力データ:
顧客ID 301 の購入履歴 = 100, 200
集計後:
平均購入額 = (100 + 200) / 2 = 150.0
活用例
- ユーザーごとの 平均購入額 → 顧客の購買力を表せる
- 過去1週間の 合計アクセス数 → ユーザーの活動量を把握できる
- 1日の 最大利用時間 → ヘビーユーザーかどうかを判断できる
集計特徴を使うことで、個々のバラつきを減らし、特徴を「要約」して扱いやすくできます。
5. 相互作用特徴
2つ以上の特徴を組み合わせて、新しい特徴を作る方法です。
単体では弱い特徴も、組み合わせることで予測に役立つ強い特徴になることがあります。
入力データ:
価格 = 20, 数量 = 2
生成後:
合計金額 = 20 × 2 = 40
活用例
- 価格 × 数量 = 売上金額
- 年齢 × 運動時間 = 活動強度の指標
- 滞在時間 ÷ ページ数 = 1ページあたりの閲覧時間
相互作用特徴は、変数同士の関係性をモデルに学習させることができ、予測性能を高めやすくなります。
まとめ
特徴量エンジニアリングは、機械学習モデルの性能を大きく左右する重要な工程です。
どのアルゴリズムを選ぶかと同じくらいに、どの特徴量を作り、どのように整えるかによって結果は大きく変わります。
適切に設計された特徴量は、モデルの精度を高め、過学習を防ぎ、計算効率や解釈性の向上にもつながります。