〜9/28まで Kaggle本第3章途中まで
こんにちは。
自分でもよくわからないですが、いろいろ用事があってデータ分析精進ができなくなっていました。
今日から頑張りたいと思います。
第3章 特徴量の作成
モデルと特徴量
特徴量を考える前にどのモデルの入力として特徴量を用いるかを考える必要がある。
よく使われるモデルがGBDT(勾配ブースティング木)とニューラルネットである。
GBDTのライブラリで有名なのがxgboost,lightgbmである。
GBDTの特徴
・数値の大きさ自体には意味がなく、大小関係のみ影響
・欠損値をそのまま扱える
・決定木の分岐の繰り返しで変数間の相互作用を反映する
ニューラルネットの特徴
・数値の大きさが影響
・欠損値を埋めなきゃいけない
・前の層の出力を結合する計算などによって変数間の相互作用を反映する
欠損値の扱い
1. 欠損値のまま扱う
2. 欠損値を代表値で埋める
3. 欠損値を他の変数から予測する
4. (欠損の発生に意味がある時)欠損値から新たに特徴量を作成する
数値変数の変換
1. 標準化→変数同士のスケールの差が大きいとき、スケールを変えるために使う
2. Min-Maxスケーリング→変数のとる範囲を0から1の区間に押し込める。外れ値の影響を受けやすいので、標準化の方がよく使われる
3. 非線形変換→変数の分布の形状を変えて、偏りをなくす
4. clipping→上限と下限を設定し、外れ値をそれに適用させることで外れ値をなくす
5. binning→数値変数を区間ごとにグループ分けして、カテゴリ変数として扱う
6. 順位に変換する→スタバの人気店舗を調べるとき、休日に来店者多いとその重みが大きくなる。だから、平日と休日それぞれで順位に変換してから集約する
7. RankGauss→数値変数を順位にしたあと無理やり正規分布に変換する、ニューラルネットだと標準化よりもいい性能を示す
*数値変換を用いる時に、学習データのみを用いるかテストデータも用いるかの検討→実務では前者を使うが、過学習の危険があるため後者でも良い。しかし、学習データとテストデータそれぞれ別で数値変換を用いるのはだめ。
カテゴリ変数の変換
1. one-hot encoding→最も代表的。特徴量の数がカテゴリ変数の水準数に応じて増加するのが難点。
2. label encoding→n個の水準があるカテゴリ変数を各水準が0〜n-1までの数値で変換する。
3. feature hashing→ハッシュ関数による計算で、one-hot encodingによる変換後の特徴量の数を自分の好きな数に減らすことができる。
4. frequency encoding→各水準の出現回数でカテゴリ変数に置き換える。
5. target encoding→カテゴリ変数の各水準(ex.A1,A2...)における目的変数の平均値を学習データで集計し、その場で置換する。時系列的なデータだとあまりうまく行かないかもしれない。自身のレコードの目的変数を使わないようにすることが必要。(リークを防ぐため)
6. embedding→自然言語処理に使う。
目的変数の平均の取り方
・回帰の場合は目的変数の正例をとる
・二値分類の場合は、正例の場合を1、負例を0とすると良い
・多クラス分類(マルチクラス+マルチラベル)の場合は、クラスの数だけ二値分類があると考えて、クラスの数だけtarget encodingによる特徴量を作る。
・外れ値が多い場合は、そもそも平均値ではなく、中央値をとる
*target encodingについて
・target encodingである水準に属するレコードが1つしかない場合、それが目的変数の値そのものになってしまう。
・fold数を大きくしすぎてもダメで、少ないデータで変換してしまうことになるから。