DS講座 機械学習講座

【機械学習講座7】STEP4:特徴量エンジニアリング

こんにちは,shun(@datasciencemore)です!!

今回は予測モデリングのSTEP4,特徴量エンジニアリングについてやっていきます.

STEP4:特徴量エンジニアリングは,図の赤点線枠で囲った部分に該当します.

0.特徴量エンジニアリングってなに??

特徴量エンジニアリングってなんですか??

特徴量エンジニアリングは,元のデータをアルゴリズムに適した形に変形する処理のことだよ!
アルゴリズムを適用できるように特徴量のデータ型を変えたり,アルゴリズムがいい結果を出してくれるように特徴量を変換,もしくは追加したりするんだ!

予測モデリングと人間の学習プロセスの比較を見てください.

特徴量エンジニアリングは,人間の学習プロセスでは,

過去問や問題集をそのまま使うのではなく,本番試験で出題されそうな箇所をまとめること.

に該当していました.

まぁ当然ですよね,本番試験で過去問や問題集から全く同じ問題が出題されるってことはまずないですから笑

予測モデリングでも同様に元データそのままでは,アルゴリズムに適用できなかったり,適用できても精度が悪かったりと様々な問題があります.

そこで,いい感じに元データを変形してアルゴリズムがいい結果を出してくれるようにする必要があります.

この処理のことを特徴量エンジニアリングって呼んでいます.

特徴量エンジニアリングは学習データと評価データ,同じルールで変形する必要があります.

さて,STEP2:データ分割で,学習データをそのまま使用するのではなく,analysisとassessmentに分割して間接的に評価データの予測精度を評価するという話をしました.

これは間違いではないのですが,実は少しだけ正確ではありません.

より正確に説明すると,学習データをanalysisとassessmentに分割した後に,特徴量エンジニアリングにより,analysisとassessmentも同じルールで変形してあげる必要があります.

こうして,analysisとassessmentの関係を学習データと評価データの関係に類似させることにより,間接的に評価データの予測精度を見積もることができるのです!

それでは,特徴量エンジニアリングの具体例を見ていきましょう!

1.数値変数の変換

数値変数は変換しなくてもアルゴリズムを適用することはできますが,適切に変換すると予測精度が向上します.

特にlinear系のアルゴリズムは標準化を必ずする必要があります.

1.1.標準化(正規化)

線形変換によって各変数の平均を0,標準偏差を1になるようスケールを揃える変換です.

数式は以下のとおり(μ:平均 σ:標準偏差)

$$y = \frac{x - μ}{σ}$$

この数式の意味は,

平均から何個の標準偏差分離れているか

という意味です.

1標準偏差を基準にして,平均からの離れ具合を数値化しているのですね.

linear系のアルゴリズムは,各変数のスケールが揃っている必要があるので,標準化は必須です!

逆にtree系のアルゴリズムは,数値の絶対的な大きさではなく,大小関係に依存するため,数値変数の変換はあまり影響を与えません.(変換したほうがいいかはデータに依存します.)

1.2.対数変換

変数に偏りがある(ある値が極端にでやすいなど)とうまく学習できないことが多いです.

対数化は偏りを少なくする効果があります.

基本的に対数をとる($log(x)$)だけですが,0が含まれる場合は,$log(x + 1)$と変換することもあります.

また,負の数が含まれる場合は,絶対値を取り,正にした後,対数を取り,最後に元の符号をつけるといった処理もあります.(使用頻度は低いです)

1.3.Yeo-Johnson変換

上述の対数変換は,0が含まれていたり,負の数があると工夫をしなければなりませんでした.

Yeo-Johnson変換は,そんな対数変換の進化版です.

Yeo-Johnson変換は0が含まれていたり,負の数があってもOKです.

数式は複雑なので省略します.
また,同様の変換にBox-Cox変換という変換もありますが,負の値に適用できず汎用性が低いため,省略します.

2.カテゴリ変数の変換

カテゴリ変数のままでは多くのアルゴリズムで使用することができません.

どうすればいいのかというとカテゴリ変数の情報を残しつつ,数値変数に変換してあげるのです.

2.1.one-hot encoding

one-hot encodingはカテゴリ変数の各水準に対して,それらの水準に合致する場合は1,合致しない場合は0とする変換です.

これらの2値変数(0 or 1)のことをダミー変数と呼びます.

言葉だと何言ってるのかよくわからないと思うのでイメージを見てみましょう.

この例ではカテゴリ変数classをone-hot encodingしています.

classは,カテゴリ(A,B,C,D)を持っています.

これら4つのカテゴリを図のように4列にして,その各列に0か1を入れることによって,元データがどのカテゴリに属していたかがわかるように変換するのですね!

このone-hot encodingはtree系以外のアルゴリズムで使用します.

察しがいい方は気づいたかもしれませんが,実はone-hot encodingは冗長です.
カテゴリ変数の水準がn個であれば,n - 1個のダミー変数があれば一意に特定できるからです.
例えば,上の例だとカテゴリ変数の水準が4個なので,3個のダミー変数があれば一意に特定できます.
class_Dのダミー変数がなくてもclass_A,class_B,class_Cがあれば元データの値が何かがわかりますよね?
※class_A,class_B,class_Cが全部0であれば,Dと判断すればいい.
ただ,以下の理由で冗長なダミー変数を削除せず,普通にone-hot encodingをすることのほうが一般的です.
・1つのダミー変数があろうとなかろうと,予測にはさほど影響がない.
・ダミー変数がないと特徴量の重要度を見るときに困る.

2.2.label encoding

label encodingはカテゴリ変数である各水準を数値にする変換です.

簡単ですね!

label encodingはtree系のアルゴリズムで使用されます.

逆にlabel encodingはtree系のアルゴリズム以外(linear系など)では使用してはいけません.

なんでlabel encodingはtree系のアルゴリズムでしか使用しちゃいけないんですか?

tree系のアルゴリズムは分岐を繰り返すことにより,カテゴリ毎の特徴を抽出できるからなんだ!
(例えば,3より小さいか⇒2より小さいかとすると1の特徴を抽出できる.)
一方,linear系などtree系以外のアルゴリズムは,数値の大きさがダイレクトに影響するため,うまく学習することができないんだ!
(例えば,Aを1,Bを2と変換するとBがAの2倍というわけではないのに,アルゴリズムは,BはAの2倍の値と認識するため,意図したとおりに動作してくれない.)

3.欠損値の補間

欠損値がある場合,欠損値を良さげな値に補間します

XGBoostなど特定のパッケージでは欠損値をそのまま扱うことできます.

3.1.代表値補間

欠損値をその変数の代表値で補間します.

一番多く使用されるのは平均値です.

中央値でもいいですし,何かしらのカテゴリ変数で分類し,水準毎に平均をとるなど様々なパターンが考えられます.

3.2.予測補間

欠損している変数を目的変数,他の変数を説明変数とみなし,予測することで補間します.

本来の目的変数を使用するとテストデータの補間ができないので,予測補間をするときは本来の目的変数は説明変数に含めないようにしましょう.

4.新特徴量の作成

与えられた説明変数の情報から新たな特徴量(説明変数)を作成します.

例えば,マンションの家賃を予測する場合を考えましょう.

目的変数にマンションの家賃,説明変数の一部に最寄り駅とマンションの住所があるとします.

ここで最寄り駅とマンションの住所から,最寄り駅からマンションまで徒歩何分かという特徴量を作成すると,予測精度が上がりそうですね.

こんな感じで予測に効果がありそうな特徴量をたくさん使用し,どんどん予測精度を高めていくのです!

まとめ

今回は特徴量エンジニアリングをやりました!

  1. 数値変数の変換
    • 標準化(正規化)
    • 対数変換
    • Yeo-Johnson変換
  2. カテゴリ変数の変換
    • one-hot encoding
    • label encoding
  3. 欠損値の補間
    • 代表値補間
    • 予測補間
  4. 新特徴量の作成

ここで紹介したのは特徴量エンジニアリングのほんの一部です.

実にたくさんのテクニック(frequency encodingやtarget encodingなどなど)があるので,興味がある方はぜひ勉強してみてください!

(特徴量エンジニアリングについては今後,当ブログでももう少し詳細に解説する予定です.)

それでは,お疲れさまでした!

-DS講座, 機械学習講座