データ分析・中級問題チェック

問題 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)