データ分析・中級問題チェック
問題 34 /40
scikit-learnの特徴量の正規化について、誤った説明はどれか。
選択 1
特徴量の正規化とは、特徴量のデータを揃える処理である。
選択 2
分散正規化とは、特徴量の平均が0、分散が1となるように特徴量を変換する処理である。
選択 3
最小最大正規化とは、特徴量の最小値が0、最大値が1をとるように特徴量を正規化する処理である。
選択 4
分散正規化はLabelEncoderクラス、最小最大正規化はMinMaxScalerクラスを使う。
解説
選択肢4が正解です。
分散正規化はLabelEncoderではなく、StandardScalerを使います。
scikit-learnのStandardScalerは、確率・統計の標準正規化と同じ処理を行います。
標準正規化は平均0、分散1のデータに変換する処理で、次の式で求めます。
StandardScalerも標準正規化と同じ式で、データを一つずつ変換します。
選択肢1、2、3は正しい説明です。
scikit-learnに用意されている乳癌のデータを使って、正規化の実例を紹介します。
乳癌のデータは569のサンプルがあり、良性が357、悪性が212で分かれています。各サンプルには面積や滑らかさなどの30の特徴量(説明変数)がありますが、各特徴量の単位がバラバラです。
まず、スケールをそろえずにそのまま学習する例です。
-------------------------------
# 乳癌データをインポート
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# データの最小値は0、最大値は4254(スケール変換前)
X_train
▶︎ array([[1.185e+01, 1.746e+01, 7.554e+01, ..., 9.140e-02, 3.101e-01, 7.007e-02]...)
# サポートベクタマシンで分類の学習モデルを作成
svm = SVC(C=100)
svm.fit(X_train, y_train)
# 良性と悪性を判定
print('正解率: {:.2f}'.format(svm.score(X_test, y_test)))
▶︎ 正解率: 0.63
-------------------------------
scikit-learnのバージョンによって数値は変わりますが、63%の正解率のため精度は低いです。そこで、MinMaxScalerで特徴量のスケールを合わせてから学習します。
-------------------------------
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# MinMaxScalerで訓練用データの特徴量を学習
scaler.fit(X_train)
# 訓練用データとテストデータの特徴量をスケール変換
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# データの最小値は0、最大値は1(スケール変換後)
X_train_scaled
▶︎ array([[0.23044157, 0.32157676, 0.21940433, ..., 0.31484671, 0.30277942, 0.09858323]...)
svm.fit(X_train_scaled, y_train)
print('スケール変換後の正解率: {:.2f}'.format(svm.score(X_test_scaled, y_test)))
▶︎ スケール変換後の正解率: 0.97
-------------------------------
精度が97%に上がりました。このデータの場合はStandardScalerを使っても同様の精度が得られます。
StandardScalerとMinMaxScalerのどちらを使うかはデータによります。外れ値を含めて一定範囲に収めるならMinMaxScalerを選択し、外れ値は外れ値として扱うならStandardScalerを選択します。
(公式書籍 p.221-225)
StandardScalerも標準正規化と同じ式で、データを一つずつ変換します。
選択肢1、2、3は正しい説明です。
scikit-learnに用意されている乳癌のデータを使って、正規化の実例を紹介します。
乳癌のデータは569のサンプルがあり、良性が357、悪性が212で分かれています。各サンプルには面積や滑らかさなどの30の特徴量(説明変数)がありますが、各特徴量の単位がバラバラです。
まず、スケールをそろえずにそのまま学習する例です。
-------------------------------
# 乳癌データをインポート
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# データの最小値は0、最大値は4254(スケール変換前)
X_train
▶︎ array([[1.185e+01, 1.746e+01, 7.554e+01, ..., 9.140e-02, 3.101e-01, 7.007e-02]...)
# サポートベクタマシンで分類の学習モデルを作成
svm = SVC(C=100)
svm.fit(X_train, y_train)
# 良性と悪性を判定
print('正解率: {:.2f}'.format(svm.score(X_test, y_test)))
▶︎ 正解率: 0.63
-------------------------------
scikit-learnのバージョンによって数値は変わりますが、63%の正解率のため精度は低いです。そこで、MinMaxScalerで特徴量のスケールを合わせてから学習します。
-------------------------------
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# MinMaxScalerで訓練用データの特徴量を学習
scaler.fit(X_train)
# 訓練用データとテストデータの特徴量をスケール変換
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# データの最小値は0、最大値は1(スケール変換後)
X_train_scaled
▶︎ array([[0.23044157, 0.32157676, 0.21940433, ..., 0.31484671, 0.30277942, 0.09858323]...)
svm.fit(X_train_scaled, y_train)
print('スケール変換後の正解率: {:.2f}'.format(svm.score(X_test_scaled, y_test)))
▶︎ スケール変換後の正解率: 0.97
-------------------------------
精度が97%に上がりました。このデータの場合はStandardScalerを使っても同様の精度が得られます。
StandardScalerとMinMaxScalerのどちらを使うかはデータによります。外れ値を含めて一定範囲に収めるならMinMaxScalerを選択し、外れ値は外れ値として扱うならStandardScalerを選択します。
(公式書籍 p.221-225)