前処理で精度は上がるのか?~後半~

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

前半からの続き
前処理の目的のひとつに、精度向上があるようです。
今回は実際に試してみました。

cancer.datasetsを使って試しみた

Pythonではじめる機械学習 P.136
cancer.datasetsの中身はこちらを参照ください。

qiita.rb

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から。

qiita.rb

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で試しみよう!

qiita.rb

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を。

qiita.rb

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)

qiita.rb

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を。

やり方はこれまでと全く同じ。

qiita.rb

from sklearn.preprocessing import Normalizer
scaler=Normalizer()
scaler.fit(X_train)

こんなアプトプットが出ました。Normalizer(copy=True, norm=’l2′)
norm=12の意味は後で調べるとして、先に進もう。

qiita.rb

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データあたりを使って特別編をやろうと思います(いつか)


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ