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


前処理って何だろう?目的のひとつに精度向上があるらしいが・・・。

Pythonで始める機械学習 第3章P127~ 

rawデータを使うより、データを前処理したほうが精度が上がらしい。まずは、掲載されている4つの前処理がどんなものかcacer_deatasetsを使って調べてみる。
あ、4つってこちらのことです。

・MinMaxScaler:データが0~1に入るよう変換
・StandardSclare:平均0、分散1になるように変換
・RobustSclaer:中央値と四分位数で変換。外れ値を無視できる変換方法
・Normalize:特徴量ベクトルがのユークリッド長1になるように変換。う~ん、わかったようなわからんような。

qiita.rb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer=load_breast_cancer()

cacerのdatasetsの中って何だったかな?

qiita.rb
dir(cancer)

['DESCR', 'data', 'feature_names', 'target', 'target_names']

ふむふむ、説明変数のdataと目的変数のtargetがあるのね。で、数を調べるのならこちら。

qiita.rb
print(cancer.data.shape,cancer.target.shape)
(569, 30) (569,)

569個のサンプル、30の説明変数と目的変数があるのだね。よしよし。
じゃ、変数名と目的変数の中身も知っておこう。

qiita.rb
print(cancer.DESCR)

(長いので大切な箇所だけ抜粋)
目的変数(class):
- WDBC-Malignant(悪性) 字面だけで怖いよ(ガクブル)
- WDBC-Benign(良性)

説明変数:30種類

これでデータ構成がだいたい理解できた。では、いよいよ前処理を。

MinMaxScaler

テキストではダイレクトにcancer.data,cancer.targetを使用しているが、わかりやすいようにX,yで指定した。(慣例でXは大文字らしい)

qiita.rb
X=cancer.data
y=cancer.target
#train_test_splitで訓練データとテストデータに分割。
#test_size=0.3のように数値指定がなければdefoは75:25。

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)

print(X_train.shape)
print(X_test.shape)
(426, 30)
(143, 30)

#前処理としてMinMaxScalerを用いる。まずはMinMaxScalerのインスタンスを作る。
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()

#スケール変換機のfitメソッドにはデータ(X_train)のみを与え、y_trainは与えない。
scaler.fit(X_train)
#こんなアウトプット。特徴量のレンジが0~1になっている。
MinMaxScaler(copy=True, feature_range=(0, 1))

#データを変換
#重要!前処理ではscaler.fitメソッドとscaler.transformメソッドはセット!
X_train_scaled = scaler.transform(X_train)

#データの形式を調べよう。
print("transformed shape: {}".format(X_train_scaled.shape))
print("per-feature minimum before scaling:\n {}".format(X_train.min(axis=0)))
print("per-feature maximum before scaling:\n {}".format(X_train.max(axis=0)))
print("per-feature minimum after scaling:\n {}".format(
    X_train_scaled.min(axis=0)))
print("per-feature maximum after scaling:\n {}".format(
    X_train_scaled.max(axis=0)))

アウトプットは本当に長いので省略。

1点疑問点が・・。テストセットの場合、最小値と最大値が0-1の範囲を超える。
これは訓練データのレンジで割るから?rawデータの形状が変化するから?(P133)
う~ん、よくわからん。だれか教えてください。

他3つも同様に、MinMaxScalerの部分をStandardSclare、RobustSclaer、Normalizeに変えると挙動します。
但し、fitとtransoformメソッドの両立は忘れずに。

後半へ