本日のまとめ(データ前処理)
欠測値のとりあつかい
欠測値の削除
- scikit-learnはNumpy配列に対応しているが、前処理には、pandasのDataFrameの方が便利なことがある
- dropnaメソッドで、欠測値を含む行を削除できる.削除の方法は色いろ。
欠測値の補完
- 削除しすぎると、有益な情報が失われる場合がある。このような場合は、別の補完法を用いる
- 代表的なものは、平均値補完である。scikit-learnの
Imputer
クラスを使用すると便利 参考, scikit-learn SimpulImputer
は、変換器クラス(transformer)に属している- scikit-learnの変換器(transformer)クラスは、
fit
とtransform
の2つのメソッドがある fit
は、トレーニングデータセットから、パラメータを学習するのに使用するtransform
は、学習したパラメータに基づいて、データを変換するのに使用する- データ配列に含まれる特徴量の数は、モデルの適合に使用されたものと同じでなければならない。
- 決定木などの分類器は、推定器(estimator)に属している
カテゴリデータの処理
- カテゴリデータは、名義特徴量(赤、青など)かと順序(サイズのXL > L > Mなど)を区別する必要がある。
- 順序特徴量のマッピングは、明示的に定義してやる必要がある
- DataFrameの
map
メソッドに、辞書を指定することで区別可能 - 分類用の推定器は、クラスラベルを内部で整数に変換するが、ミスを回避するには内部的に変換させるのではなく、あらかじめクラスラベルを整数の配列として提供するのがよい。(どの値を割り当てるかは重要ではない)
- ラベルを反転させるには、mapとkey, valueを反転させて再変換するか、
LabelEncoder
を使用するかの方法がある - 名義特徴量を、順序づけてエンコードしてしまうと、順序があると勘違いしてしまう!!!
- このような場合、one-hot エンコーディングという手法を使用する!!
- green, redなどを名義特徴量の列の一意な値ごとにダミー特徴量を新たに作成する
- これには、
scikit-learn preprocessing
の'OneHotEncoder`を用いる - OneHotEncoderの
categorical_features
は廃止されているので、ColumnTransformer
を使用する 参考, 参考 - pandasの
get_dummies
は文字列のみを、ダミー特徴量に変換する - ダミー特徴量は、赤、青、緑を表すには2つで十分(計算量減らしたい)。このような場合、drop_first=Trueにする
トレーニングデータとテストデータセットを分割する
- 分割にはtrain_test_split関数を使用する
特徴量のスケーリング
- 特徴量のスケーリング(feature scaling)
- 決定木やランダムフォレストでは不要
- 勾配降下法などは、複数の特徴量の尺度が同じである場合がうまく動作する -- 単純な例では、スケーリングされていないと、、、誤差平方和もK近傍法も、誤差が大きなところに引っ張られる!!!
- よく実施されるスケーリングは、正規化(normalization)と標準化(standardization)の2つ
- 正規化・・・[0,1]の範囲にスケーリング。min-maxスケーリングは以下のように計算できる。
- 訓練データの正規化は、訓練データをモデルとして、テストデータの正規化も訓練データをモデルとするのがポイント
- 標準化は、平均値を0, 標準偏差を1となるように変換する。特徴量の列が正規分布に従うため、重みを学習しやすくなる。標準化の式は以下の通り。