はじめに
連載「scikit-learnで学ぶ機械学習」を始めますに書いた通り、scikit-learnを用いて機械学習について学んで行きたいと思います。
前回の記事第5回「可視化」では、ROC曲線について学びました。
本記事のテーマは、「データ変換」です!
機械学習モデルの学習を行う際は、
生のデータを用いるのではなく、適切な前処理を行うことによって精度が向上するケースがよくあります。
(そもそも、前処理をしないと学習が行えない場合もある。)
そこで、今回は「データセット変換」について学んでいきましょう。
標準化
標準化は代表的な前処理手法の一つです。
データの平均が0に、分散が1となるように変換する操作のことを標準化と言います。
標準化をすることで
- 学習の安定
- 速い収束
が期待できます。
デメリットはほとんどないといっていいでしょう。
統計量の計算をするときに、テストデータを使わないこと
よくやりがちなミスは、
標準化するために統計量(平均と分散)の計算をする際に、
テストデータを用いてしまうことです。
実際にはテストデータは未知のデータですので、統計量の計算時にが学習データのみを利用します。
つまり、下記のような手順となります。
- 学習データを用いて統計量を計算する
- 統計量を用いて学習データを変換する
- 統計量を用いてテストデータを変換する
コードを動かそう
第3回「モデル選択と評価」でも利用した、breast_cancer
という乳がんのデータセットを利用します。
コードの全体像
先に、完成後のソースコードを貼り付けておきます。
1 | from sklearn.datasets import load_breast_cancer |
コードの大部分は第1回「教師あり学習」で解説しています。
初出のコードについて解説します。
preprocessingのインポート
1 | from sklearn import preprocessing |
標準化StandardScaler
はpreprocessin
に実装されています。
X_trainの統計量を計算
1 | scaler = preprocessing.StandardScaler().fit(X_train) |
X_train, X_testの変換
1 | X_train_scaled = scaler.transform(X_train) |
先ほどX_train
でfit
したscaler
をどちらにも使うのがポイント。
結果
コード全体を実行すると二つのスコアが出力される
- 標準化なし
- 標準化あり
の2パターンである。
場合によるが、標準化した場合の方がスコアがよかったのではないでしょうか。
このようにたった3行のコードで標準化を行うだけで、スコアが良くなります。
まとめ
今回は、scikit-learnでの標準化にチャレンジしました。
次回のテーマは「データセット読み込みユーティリティ」です。お楽しみに!
記事情報
- 投稿日:2020年3月7日
- 最終更新日:2020年3月22日