前半からの続き
前処理の目的のひとつに、精度向上があるようです。
今回は実際に試してみました。
#cancer.datasetsを使って試しみた
Pythonではじめる機械学習 P.136
cancer.datasetsの中身はこちらを参照ください。
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
#わかりやすようにX,yで代替する。
X=cancer.data
y=cancer.target
#train_test_splitで分割
X_train,X_test,y_train,y_test=train_test_split(X,y,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)))
rawデータのTest set accuracyは0.63。
##では、MinMaxScaleから。
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 accuray:{:.2f}".format(svm.score(X_test_scaled,y_test)))
MinMaxScaler処理でのTest set accuracyは0.97!
こんな上がるものなのか??すごい!
ほかも同じか?たまたまMinMaxScalerだけか?
##次はStandardScalerで試しみよう!
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
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 accuray:{:.2f}".format(svm.score(X_test_scaled,y_test)))
StandardScaler処理でのTest set accuracyは0.96!
う~ん、すごいなー。やっぱり効果があるのかなぁー。
##続いて、RobustScalerを。
from sklearn.preprocessing import RobustScaler
scaler=RobustScaler()
scaler.fit(X_train)
ちなみにRobustScalerは中央値と四分位を取るので下記アウトプットが出てきます。
RobustScaler(copy=True, quantile_range=(25.0, 75.0), with_centering=True,
with_scaling=True)
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 accuray:{:.2f}".format(svm.score(X_test_scaled,y_test)))
RobustScaler処理でのTest set accuracyは0.95!
##最後に、Normalizerを。
やり方はこれまでと全く同じ。
from sklearn.preprocessing import Normalizer
scaler=Normalizer()
scaler.fit(X_train)
こんなアプトプットが出ました。Normalizer(copy=True, norm='l2')
norm=12の意味は後で調べるとして、先に進もう。
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 accuacy:{:.2f}".format(svm.score(X_test_scaled,y_test)))
Normalizer処理でのTest set accuracyは0.90!
結果の一覧:
このように、前処理を行った方が43%~54%も精度は向上するようです。特に前者3つは非常に高くなっていますね。
test method | test accuray | increase rate |
---|---|---|
raw data | 0.63 | 100% |
MinMaxScale | 0.97 | 154% |
StandardScaler | 0.96 | 152% |
RobustScaler | 0.95 | 151% |
Normalizer | 0.90 | 143% |
でも、これってなぜなんだろう?理由がわからないから素直に喜べない(泣
もっと言えば、他のデータでも同様のことが言えるのかなー、という疑問も。
ということで、bostonデータあたりを使って特別編をやろうと思います(いつか)