変数の変換
#データの理解と前処理
変数はそのまま使えない?
説明変数(特徴量)や目的変数として用意した変数も、そのまま使ってはいけなかったり、そのまま使うと効果的でなかったり、そもそもプログラムが動かなかったりする
データの特徴に応じて、適切な変換を行うことが重要
大きく、量的変数(数値変数)の場合と、質的変数(カテゴリ変数)の場合で、とるべき方法が異なる
まずはデータの型と尺度を確認し、データの分布のようすを見たうえで、適切な方法をとる
→変数の尺度とデータ型、記述統計・可視化
量的変数(数値変数)の変換
数値変数は、適切に変換・加工することで、より有効な変数(特徴量)になることがある
標準化(standardization)
scikit-learn.preprocessingモジュールのStandardScalerクラス
平均0, 標準偏差1となるように変換する
複数の変数でスケール(データがとる範囲)が大きく異なる場合に用いる
ロジスティック回帰などの線形モデルやニューラルネットワークなど、変数同士のスケールの差が大きくなく、平均0に近いほうがよいモデルも多い
変換式:$ x' = \frac{x - \mu}{\sigma}
Min-Maxスケーリング(正規化:normalization)
scikit-learn.preprocessingモジュールのMinMaxScalerクラス
変数の最大値と最小値をもとに、0から1の間に変数を単純に正規化する
変換式:$ x' = \frac{x - x_{min}}{x_{max} - x_{min}}
非線形変換
対数をとる、$ \log(x+1)をとる、絶対値の対数をとる
右に裾の長い分布の場合、など
Box-Cox変換、Yeo-Johnson変換
skicit-learn.preprocessingモジュールのPowerTransformerクラス
対数変換を一般化したもので、データの分布を正規分布に近づける変換(パラメータはライブラリが推定してくれる)
Box-Cox変換は正の値のみをとる変数に使える
Yeo-Johnson変換は負の値をとる変数にも使える
https://gyazo.com/a1d49391d51b09da382617db23bb306d
図は(『Kaggleで勝つデータ分析の技術』より引用
ほかにもいろいろなテクニックがあります…
Clipping
Binning
順位への変換
RankGauss など
質的変数(カテゴリ変数)の変換
基本的に、機械学習は入力→出力の写像(関数)を学習するプログラム(教師あり学習)なので、数値でない質的変数(カテゴリ変数)は適切に数値の変数に置き換えないといけない
状況に応じてさまざまな方法がある
One-hot encoding
最も代表的な方法
変数の各水準(ラベル)に対して、その値かどうかを表す二値変数(0 or 1)を用意する方法
https://gyazo.com/b3202f5134b0ecdb50b38595dcb0ccc5
図は(『Kaggleで勝つデータ分析の技術』より引用
重回帰分析などでも同様にダミー変数を作ったりするので、機械学習に限ったテクニックというわけではない
pandasのget_dummies、あるいはskicit-learn.preprocessingモジュールのOneHotEncoderクラスで実行可能
変数の水準(ラベル)の数だけダミー変数(特徴量)が増えてしまうデメリットもある
Label encoding
各水準を単純に数値に順次置き換える
https://gyazo.com/46d9821240e8e30f1e421b6b07abe801
図は(『Kaggleで勝つデータ分析の技術』より引用
もともと名義尺度であれば各水準の間には大小関係はないので、数値の大きさには意味がないはずだが、アルゴリズムは数値の大きさ(順番)に影響を受けた関数を学習する可能性があるので、普通のカテゴリ変数にこれを適用するのは本来望ましくはない
とくに決定木系のモデルなど、実際的にはこれでもうまくいく場合は多いかもしれない…
目的変数の数値化にはこれが役立つ
ほかにもいろいろなテクニックがあります…
Feature hashing
Frequency encoding
Target encoding
Embedding など
なお、質的変数(カテゴリ変数)には、名義尺度と順序尺度がある(→変数の尺度とデータ型)
順序尺度(大きさの順番のみ決定できる)の場合は、本来は大きさの順に数値化すべき
その場合は、変数の値と変換する数値との対応関係を明示的に定義しないといけない
変換する際に気をつけないといけないこと
モデルの評価のために、手持ちのデータセットを学習データとテストデータに分けるが、学習データとテストデータそれぞれを個別に変換器にかけてはいけない
学習データをもとに導かれた変換式で、テストデータも変換しないといけない
カテゴリ変数の場合、学習データにはないがテストデータにはある値があり得るので、その対応を考えておかないといけない