機械学習のための特徴量エンジニアリング
―その原理とPythonによる実践
これはなに?
特徴量エンジニアリングについての基本的な部分をまとめ中・・のもの。
日付・時刻を表す変数の変換
年
月
日
年月・月日など → カウント値に変換する
曜日・祝日・休日
特別な日
時・分・秒
時間差
欠損値の処理
欠損値の種類
- 値が存在しないケース
- 何らかの意図があるケース
- 値を取得するのに失敗したケース
処理方法
- 欠損値のまま扱う
- 欠損値を代表値で埋める
- 欠損値を他の変数から予測する
- 欠損値から新たな特徴量を作成する
- ・レコードごとに欠損している変数の数をカウントする
- ・複数の変数の欠損を組み合わせ、もしそれらがいくつかのパターンに分類できるのであれば、どのパターンであるかを特徴量とする
カテゴリ変数の取り扱い
カテゴリ変数=非順序データ
単純にエンコーディングすると1からkまでの数値を当てはめる方法を用いるとカテゴリ値を順序づけてしまう。順序づけはカテゴリ変数を扱う上で適切ではない
カテゴリ変数のエンコーディング
One-Hotエンコーディング
全てのbit和は1になる
ダミーコーディング
k-1個のbit特徴量を利用し、余分な自由度を取り除いている
Effectコーディング
-1も使う
カテゴリ変数のエンコーディング方法の長所と短所
One-hotエンコーディングは冗長な表現がある一方、欠損値を全て0で表現できるため、便利。
ダミーコーデインングは欠損値に対応できない
Effectコーディングは欠損値に対応している
膨大なカテゴリ数を持つカテゴリ変数の取り扱い
- 気にしない→One-Hotエンコーディング
- 圧縮
- a. 特徴量ハッシング:線型モデルにおいてよく利用される
- b. ビンカウンティング:線型モデルだけなく、決定木に基づくモデルにおいてもよく利用される
特徴量ハッシング
多様な入力をより小さいm次元のベクトルに圧縮する
※同じ入力は同じハッシュ値になる
ビンカウンティング
One-hotエンコーディングによって生成された大規模でスパースで二値表現を非常に密で小さな実数値に変えることができる
・・・K-meansによる特徴量生成
目的変数も合わせて、クラスタリングし、結果を特徴量として利用する=モデルスタッキングの一例となる
→K-means+ロジスティック回帰で分類性能が向上する
数値データの取り扱い
線形関数は正規化が必要。論理関数は必要ない。
カウントデータの取り扱い
- 二値化
- 2倍スキなどの数値に意味がない時は0, 1に変換してしまう。
- 離散化
- 複数の桁にまたがるカウントデータにおいて、大きな値はユークリッド距離はその要素が支配的になり、他の影響をかき消してしまう。
- →階級の順序データ
- 固定幅による離散化
- 分位数による離散化
対数変換
正の数値データが裾の重い分布を持つ場合に強力な武器となる
べき変換(分散安定化変換)
Box-Cox変換(対数変換を一般化)
Yeo-Johnson変換→負の値を持つ変数にも適用可能
Clipping
上限と下限を設定し、外れ値を置き換える処理
スケーリングと正規化
Min-Maxスケーリング
最小値を0, 最大値を1に押し込める
標準化(分散スケーリング)
平均0, 標準偏差1とする
L2乗正規化
L2ノルムで割り算
交互作用特徴量
二つの特徴量の積などをとる
特徴選択
順位への変換
→特定のカテゴリのみが大きい場合などに、順位だけを抽出する方法
RankGauss
数値変数を順位に変換したのち、順序を保ったまま無理やり正規分布となるように変換する手法
参考
オライリー
「機械学習のための特徴量エンジニアリング」
その原理とPythonによる実践
以上。(20231111)