Python 機械学習 第4章 データ前処理
機械学習で使用するデータは、ほとんどといってよいほどそのまま学習機に入れることのできるデータではない。
そのため学習機に入れる前処理としてデータを加工する必要がある。
欠測データの対処
データの中には表示がNaN, Nullになっているデータが存在することが多々ある。
このようなデータは排除しなくてはならない。
主にpandasと呼ばれるデータ解析ライブラリを用いて実装を行う
pandas.read_csv
DataFrame型でcsvを生成する。
isnull().num()
欠測値をカウントする。
dropna()
欠測値が存在する行を削除
欠測値を削除しすぎてしまうとデータを失いすぎてしまったりする。
こうなってしまうと、分析に影響がでてしまう場合があるのである程度補完する必要がある。
良く使われる補完方法として、平均値補完(mean imputation)がある。
これは欠測値のデータをその列の特微量の平均値であてがうというものである。
カテゴリデータの処理
数値ではなく、カテゴリ値を持った特微量データの分類をする
名義特微量と順序特微量
- 順序特微量
順番が存在する特微量
ex) Tシャツのサイズ XL > L > M - 名義特微量
順序が存在しない特微量
ex) Tシャツの色 赤, 青, 黄
名義特微量はデータを扱いやすくするために、sklearnのLabelEncoderを使う。
one-hot エンコーディング
名義特微量をエンコードすると特微量が数値に変換される。
これにより、データの区別をつけることができるが数値として順序がついてしまうことが問題である。
例としてTシャツの色という特微量に青/赤/緑という要素が存在する。
これにエンコーディングを実施すると
blue → 0
red → 1
green → 2
という形になる。
これだとblue < red < greenとなってしまい値の優劣がついてしまうことで学習機が誤作動してしまう場合がある。
これを防ぐのが、one-hotエンコーディングでダミー特微量をもちいてエンコードを行う。
ランダムフォレスト/決定木以外のほとんどの学習モデルは特微量の尺度が、学習の精度に影響する。
ある一つの特微量の範囲が1~100なのに対して、もう一つの特微量の範囲が1~10000などの値だった場合、その値の違いによって学習するモデルが出す結果が影響してしまう。
この場合だと学習モデルにも寄るが、1~10000の範囲の特微量の方が絶対値として大きくなってしまうので、1~100の範囲の特微量が誤差として認識されてしまう場合がある。
これを防ぐために正規化、標準化が存在する。
正規化/標準化により全ての特微量の範囲を一定にすることで、特微量ごとの値の差をなくすことで正しいデータを取得する事ができる。
正規化
min-max スケーリング
その値のmin-maxでスケールさせる。これにより特微量を[0, 1]にスケーリングし直すことができる
標準化
平均値を0, 標準偏差を1となるように数値を変換する。
標準化と正規化の最大の違いは外れ値を考慮するかどうかである。
正規化だと外れ値が存在する場合、その値が大きな影響をもつのに対して、標準化の場合はそこまで影響を受けない。
そのため、外れ値が存在する場合は標準化を使用する事が多い。
テストデータと訓練データセットを比べたときに、訓練データセットの方がデータセットとしてはるかに優れている場合、その学習が過学習になってしまう場合がある。
このモデルを「バリアンスが高い」ということがある。
これを防ぐ方法として、以下のような例がある。
- より多くの訓練データを集める
- 正則化によりペナルティを課す
- パラメータの少ない単純なモデルを選択する
- データの次元数をへらす
L2正則化
特微量の複雑さにペナルティを課すために正則化
各特微量に重み付けをすることによって、その特微量の値を小さくすることで精度を上げる事ができる。
もう一つの方法として、L1正則化がある
これは重みの絶対値を取るものであり、ペナルティを足すことにより大体の特微量の重みが0になってしまう。このため、L1正則化は無関係な特微量の個数が多い高次元のデータセットのときに使用される事が多い。