Feature Engineering
特徴量エンジニアリングは、ドメイン知識を用いて生データをモデルが学習しやすい入力に変換します。主要な手法、データリークの落とし穴、用途、コードについて解説します。
特徴量エンジニアリングとは、ドメインとデータに関する知識を使って、機械学習モデルが学習する入力変数、つまり特徴量を作成、変換、選択するプロセスです。生のタイムスタンプを時刻や曜日に変換し、カード取引の一覧を顧客の直近30日間の支出にまとめ、移動距離と所要時間から速度を算出します。適切に選んだ特徴量によって、シンプルなモデルでも見逃してしまうパターンを捉えられます。モデルが与えられた列しか利用できない表形式データや時系列データでは、特に重要です。深層学習モデルは画像、音声、テキストから独自の特徴量を学習します。そのため、これらの分野では、特徴量エンジニアリングの重点がデータの準備やモデル出力からの特徴量作成へと移りました。
一般的な手法#
- スケーリングと正規化: 特徴量を平均0、分散1に標準化すると、単位の大きな特徴量が距離ベースのモデルや勾配ベースの学習を支配するのを防げます。また、対数変換によって所得や価格などの偏った値の範囲を圧縮できます。
- カテゴリエンコーディング: ワンホットエンコーディングでは、色などのカテゴリをバイナリ列に変換します。ターゲットエンコーディングでは、カテゴリごとにターゲットの平均値を割り当てます。エンコーディングによって各行のラベルが漏洩しないよう、平均値は別々のフォールドで計算します。
- 比率と相互作用: 負債対所得比、平方フィートあたりの価格、ボディマス指数は、2つの生の値を結果に実際に影響する量にまとめます。
- 日付と時刻の特徴量: 時刻、曜日、月、祝日フラグによって周期性を捉えられます。また、時刻を正弦と余弦でエンコードすると、23:00と00:00を近い値として表せます。
- ラグとローリングウィンドウ: 過去の値、移動平均、直近のウィンドウ内の件数により、センサー、アカウント、製品の直近の履歴をモデルに与えられます。
- ビニング: 年齢層などの範囲に連続値を分類すると、段階的な影響を捉え、極端な値の影響を抑えられます。
- PCAによる次元削減: 主成分分析では、相関のある多数の特徴量を、相関のない少数の特徴量に圧縮します。
- 特徴量選択: フィルター法ではターゲットとの相関や相互情報量に基づいて特徴量を順位付けし、ラッパー法ではモデルを使って特徴量のサブセットをテストします。L1正則化などの埋め込み法では、学習中に特徴量を削除します。
比率特徴量は、これが有効な理由を示します。深さに制限のある決定木は一度に1つの特徴量しか分割できないため、距離と所要時間だけから「平均速度が時速90 kmを超える」というルールをうまく近似できませんが、速度を計算すれば正確に判定できます。
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 1,000 trips: raw distance (km) and duration (h); label = average speed above 90 km/h
rng = np.random.default_rng(0)
distance = rng.uniform(10, 300, 1000)
hours = rng.uniform(0.5, 4.0, 1000)
y = (distance / hours > 90).astype(int)
raw = np.column_stack([distance, hours])
engineered = (distance / hours).reshape(-1, 1) # domain knowledge: speed = distance / time
tree = DecisionTreeClassifier(max_depth=2, random_state=0)
for name, X in [("Raw distance and duration", raw), ("Engineered speed", engineered)]:
print(f"{name}: accuracy {cross_val_score(tree, X, y, cv=5).mean():.3f}")同じ深さ2の木でも、交差検証精度は距離と所要時間の生データでの0.861から、作成した速度特徴量では1.000に上昇します。距離と所要時間の空間における対角線状の境界が、速度に対する単一のしきい値になるためです。
データリークのない特徴量の検証#
特徴量の値が予測時点で分かっている場合に限り、その特徴量は有効です。「解約後の1か月間のサポートへの問い合わせ件数」を使う解約予測モデルや、データセット全体で計算したターゲットエンコーディングは、テストでは高いスコアを出しても本番環境では機能しません。これはデータリークの一種です。そのため、スケーラーの平均値やカテゴリのエンコーディングなど、学習済みパラメーターを持つ変換はすべて学習用のフォールドだけで適合させます。scikit-learnのパイプラインはこれを自動的に行います。また、新しい特徴量は交差検証スコアが向上する場合に限って残します。本番システムでも、学習時とまったく同じ方法で各特徴量を計算する必要があります。特徴量ストアは、両方に同じ特徴量定義を提供することでこれを実現します。
コンピュータビジョンにおける特徴量エンジニアリング#
従来のコンピュータビジョンでは、エッジマップ、SIFTキーポイント記述子、方向勾配ヒストグラムなどの手作業で設計した特徴量に頼り、サポートベクターマシンなどの分類器がそれらをラベル付けしていました。2012年にAlexNetがImageNetチャレンジで優勝して以来、畳み込みニューラルネットワークはピクセルから独自の特徴マップを学習するようになり、エンジニアリングの労力はデータ拡張による学習データの改善や、ビジョンモデルの出力へと移りました。UltralyticsのSpeedEstimatorは、YOLO26の物体追跡出力から速度特徴量を作成します。トラックの位置が5つ得られると、最初と最後の位置間のピクセル変位をmeter_per_pixelスケールでメートルに変換し、経過時間で割ってkm/hを報告します。
用途#
- 信用リスク:貸し手は、口座の生記録から負債対所得比率、信用利用率、最後に支払いを延滞してからの月数を導出します。これらの特徴量は、生の残高よりも債務不履行を適切に予測します。
- 予知保全:振動や温度のストリームから算出した移動平均、変化率、周波数帯域エネルギーにより、生の測定値が警報しきい値を超える前に進行中の摩耗を検出できます。
- 不正検知:過去1時間のカード取引件数や、購入場所とカード所有者の通常の所在地との距離などの頻度特徴量によって、不正利用と通常の支出を区別できます。
- 需要予測:小売モデルでは、店舗と商品ごとに、過去の売上、移動平均、価格変動、販促フラグ、休日指標を組み合わせます。










