ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

スケール変換してからSVMを使う

スケール変換とは、特徴量をある基準によって正規化し、特定の範囲に収めることを言います。ここでは、SVMを例に取り、スケール変換の効果を検証します。

スケール変換の種類

  1. StandardScaler: 平均0,分散1になるよう変換。
  2. RobustScaler: 中央値と四分位数を用いて変換(外れ値を無視)。
  3. MinMaxScaler: データが0〜1の間に収まるよう変換。
  4. Normalizer: 特徴量ベクトルがユークリッド長1になるよう変換。

ここでは、MinMaxScalerを用います。

注意: スケール変換は、訓練データに対して適用した基準を保持したままテストデータに適用する必要があります。つまり、訓練データとテストデータを別々にスケール変換してはなりません。

スケール変換の効果を見る

In[1]:

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)
X_test_scaled = scaler.transform(X_test)

In[2]:

from sklearn.svm import SVC

svm = SVC(C=100)
svm.fit(X_train, y_train)
print(svm.score(X_test, y_test))

svm.fit(X_train_scaled, y_train)
print(svm.score(X_test_scaled, y_test))
0.615384615385
0.965034965035

このように、スケール変換してSVMすると精度が高まります。

おわりに

スケール変換自体の数学は非常に簡単ですが、訓練データとテストデータは必ず同一の基準で変換しなければなりません。fitメソッドで訓練データの変換基準を構築した後、テストデータでfitを使ってはなりません。必ず、transformメソッドを適用しましょう。

参考

  1. sklearn.preprocessing.MinMaxScaler — scikit-learn 0.19.0 documentation

  2. Feature scaling - Wikipedia