LoginSignup
9
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-05

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

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

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11