本日のまとめ(データ前処理)

欠測値のとりあつかい

欠測値の削除

  • scikit-learnはNumpy配列に対応しているが、前処理には、pandasのDataFrameの方が便利なことがある
  • dropnaメソッドで、欠測値を含む行を削除できる.削除の方法は色いろ。

欠測値の補完

  • 削除しすぎると、有益な情報が失われる場合がある。このような場合は、別の補完法を用いる
  • 代表的なものは、平均値補完である。scikit-learnのImputerクラスを使用すると便利 参考, scikit-learn
  • SimpulImputerは、変換器クラス(transformer)に属している
  • scikit-learnの変換器(transformer)クラスは、fittransformの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スケーリングは以下のように計算できる。

x_{norm}^{(i)} = \frac {x^{(i)} - x_{min}}{x_{max} - x_{min}} \\
x_{max}が1, x_{min}が0になる

  • 訓練データの正規化は、訓練データをモデルとして、テストデータの正規化も訓練データをモデルとするのがポイント
  • 標準化は、平均値を0, 標準偏差を1となるように変換する。特徴量の列が正規分布に従うため、重みを学習しやすくなる。標準化の式は以下の通り。

x_{std}^{(i)} = \frac {x^{(i)} - \mu}{\sigma_{x}}