Python scikit-learn preprocessingでデータセットのスケール処理を行う

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

sklearn.preprocessingの各メソッドを利用してデータセットのスケール処理を行えます。

スケール処理とは、標準化のようにデータ分布の性質を変えずにデータの値の増減を行うこと。

各メソッドは以下の通り。


StandardScaler

標準化、平均値を0、分散を1にする。

RobustScaler

中央値と四分位数でスケールを行う。

極端に他の値と異なるようなハズレ値を無視する。

MinMaxScaler

データセットを0〜1の値に収まるよう変換する。

Normalizer

データポイントを半径1の円(高次元なら球面)に投射する。ベクトルの長さではなく角度を問題とする時に用いる。

各処理の分布図

左が元のデータセット、右の散布図が各メソッドでスケール処理した時の散布図となる。

f:id:letitride:20200723225904p:plain:w500


MinMaxScalerでのスケール処理の例

MinMaxScaler().fit(data_set)でスケール比を学習します。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=1)

scaler = MinMaxScaler()
scaler.fit(X_train)
# スケールを行う
X_train_scaled = scaler.transform(X_train)
print(X_train_scaled)

MinMaxScalerの場合、0〜1の間に収まる数値にスケールされる。

[[0.23044157 0.32157676 0.21940433 ... 0.31484671 0.30277942 0.09858323]
 [0.20062473 0.42116183 0.19452699 ... 0.06965208 0.34042973 0.06677161]
 [0.62232003 0.76929461 0.60403566 ... 0.56079917 0.19850187 0.07431457]
 ...
 [0.11619102 0.35726141 0.11077327 ... 0.17402687 0.17524147 0.17263545]
 [0.12963226 0.35311203 0.11706171 ... 0.         0.06780997 0.06919848]
 [0.21434995 0.59004149 0.21235575 ... 0.33251808 0.10782574 0.21172767]]


スケール処理の効果を確認

スケール処理の効果を確認するには、スケールすることによって精度に差が出るサポートベクタマシンで確認すると分かり易い。

from sklearn.svm import SVC

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
svm = SVC(C=100)
svm.fit(X_train, y_train)
print("Test set accuracy: {:.2f}".format(svm.score(X_test, y_test)))

精度は出ない

Test set accuracy: 0.63
スケールしたデータポイントで学習する
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
svm.fit(X_train_scaled, y_train)

print("Scaled test set accuracy: {:.2f}".format(svm.score(X_test_scaled, y_test)))

大幅に精度が向上し、スケール時の効果が確認できる

Scaled test set accuracy: 0.97