第6回「データセット変換」(連載:scikit-learnで学ぶ機械学習)

はじめに

連載「scikit-learnで学ぶ機械学習」を始めますに書いた通り、scikit-learnを用いて機械学習について学んで行きたいと思います。

前回の記事第5回「可視化」では、ROC曲線について学びました。

本記事のテーマは、「データ変換」です!

機械学習モデルの学習を行う際は、

生のデータを用いるのではなく、適切な前処理を行うことによって精度が向上するケースがよくあります。

(そもそも、前処理をしないと学習が行えない場合もある。)

そこで、今回は「データセット変換」について学んでいきましょう。

標準化

標準化は代表的な前処理手法の一つです。

データの平均が0に、分散が1となるように変換する操作のことを標準化と言います。

標準化をすることで

  • 学習の安定
  • 速い収束

が期待できます。

デメリットはほとんどないといっていいでしょう。

統計量の計算をするときに、テストデータを使わないこと

よくやりがちなミスは、

標準化するために統計量(平均と分散)の計算をする際に、

テストデータを用いてしまうことです。

実際にはテストデータは未知のデータですので、統計量の計算時にが学習データのみを利用します。

つまり、下記のような手順となります。

  1. 学習データを用いて統計量を計算する
  2. 統計量を用いて学習データを変換する
  3. 統計量を用いてテストデータを変換する

コードを動かそう

第3回「モデル選択と評価」でも利用した、breast_cancerという乳がんのデータセットを利用します。

コードの全体像

先に、完成後のソースコードを貼り付けておきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import preprocessing
breast_cancer = load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
clf = LogisticRegression()
clf.fit(X_train, y_train)
print (clf.score(X_test, y_test))

scaler = preprocessing.StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
clf = LogisticRegression()
clf.fit(X_train_scaled, y_train)
print (clf.score(X_test_scaled, y_test))

コードの大部分は第1回「教師あり学習」で解説しています。

初出のコードについて解説します。

preprocessingのインポート

1
from sklearn import preprocessing

標準化StandardScalerpreprocessinに実装されています。

X_trainの統計量を計算

1
scaler = preprocessing.StandardScaler().fit(X_train)

X_train, X_testの変換

1
2
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

先ほどX_trainfitしたscalerをどちらにも使うのがポイント。

結果

コード全体を実行すると二つのスコアが出力される

  • 標準化なし
  • 標準化あり
    の2パターンである。
    場合によるが、標準化した場合の方がスコアがよかったのではないでしょうか。
    このようにたった3行のコードで標準化を行うだけで、スコアが良くなります。

まとめ

今回は、scikit-learnでの標準化にチャレンジしました。

次回のテーマは「データセット読み込みユーティリティ」です。お楽しみに!

記事情報

  • 投稿日:2020年3月7日
  • 最終更新日:2020年3月22日