LoginSignup
11
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-01

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

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種類
cancer_expla_values.png

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

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メソッドの両立は忘れずに。

後半へ

11
16
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
11
16