質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

2回答

16727閲覧

ダミー変数に特徴量の標準化を使うべきかについて

kouji_39

総合スコア164

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/05/07 11:44

線形回帰で、住宅価格予測回帰モデル(データはscikit-learnの付属データボストン市の住宅価格
データ)を作成しています。
そこで、ダミー変数に特徴量の標準化を使うべきかという点でご意見をいただきたいです。
下記のデータセットで、CHAS(チャールズ川によるダミー変数、1が川周辺、0がそれ以外)
がダミー変数ですが、このCHASは「訓練データを変換器で標準化」をする必要がないのでは
と考えます。ここで、標準化は「平均が0、標準偏差が1になるようにデータを加工(スケー
リング)」であり、ダミー変数は正規化に近く、「最低が0、最高が1になるようにデータを
加工(スケーリング)」したものと考えることができ、これを標準化すると予測がうまくいか
ないのではと、考えました。教科書的なものでは、chasも他の12項目の説明変数と同じく
、下記のように標準化して回帰モデルにfitさせていました。ご回答をよろしくお願いいたします。

# ライブラリのインポート %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 住宅価格データセットの読み込み df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+') df.columns=['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] # データフレームの形状 print('dfの形状', df.shape) # 全ての特徴量を選択 X=df.iloc[:, 0:13].values # 正解に住宅価格(MDEV)を設定 y = df['MEDV'].values # 特徴量と正解を訓練データとテストデータに分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) print('X_trainの形状:',X_train.shape,' y_trainの形状:',y_train.shape,' X_testの形状:',X_test.shape,' y_testの形状:',y_test.shape) # 特徴量を2次多項式に変換 POLY = PolynomialFeatures(degree=2, include_bias = False) X_train_pol = POLY.fit_transform(X_train) X_test_pol = POLY.transform(X_test) X_train_pol.shape, X_test_pol.shape # 特徴量の標準化 sc = StandardScaler() # 訓練データを変換器で標準化 X_train_std = sc.fit_transform(X_train_pol) # テストデータを作成した変換器で標準化 X_test_std = sc.transform(X_test_pol) # 線形回帰モデルを作成 model = LinearRegression() # モデルの訓練 model.fit(X_train_std, y_train)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

それによって良くなるかどうかはケースバイケースですが、ダミー変数でも0と1の値の比率によって分散が変わるので、一応やることには意味があります。

どうせ大した違いがないと判断するなら、面倒くさいので他の変数と一緒に扱ってしまうというのも一つの割り切りとしてありです。

また、今回は違いますが、スパースなデータをそのまま標準化するとスパース性を失うので、スパース性を活かしたデータ型で処理したい場合は中心化を行わず分散だけ整える「標準化」を行うことがあります。

This scaler can also be applied to sparse CSR or CSC matrices by passing with_mean=False to avoid breaking the sparsity structure of the data.

sklearn.preprocessing.StandardScaler — scikit-learn 0.22.2 documentation

投稿2020/05/07 13:29

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouji_39

2020/05/07 16:18 編集

##input # 全ての特徴量を選択 X=df.iloc[:, 0:13].values # 正解に住宅価格(MDEV)を設定 y = df['MEDV'].values # 特徴量と正解の先頭3行を表示 X[:1] ##output (array([[6.3200e-03, 1.8000e+01, 2.3100e+00, 0.0000e+00, 5.3800e-01, 6.5750e+00, 6.5200e+01, 4.0900e+00, 1.0000e+00, 2.9600e+02, 1.5300e+01, 3.9690e+02, 4.9800e+00], #4番目の項目( 0.0000e+00)がダミー変数 ##input # 特徴量と正解を訓練データとテストデータに分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) print('X_trainの形状:',X_train.shape,' y_trainの形状:',y_train.shape,' X_testの形状:',X_test.shape,' y_testの形状:',y_test.shape) # 特徴量の標準化(データを平均0、標準偏差が1になるように変換する正規化,[-1, 1]の範囲内) sc = StandardScaler() # 訓練データを変換器で標準化 X_train_std = sc.fit_transform(X_train) # テストデータを作成した変換器で標準化 X_test_std = sc.transform(X_test) # 標準化された訓練データ X_train_std[0] ##output array([-0.37257438, -0.49960763, -0.70492455, 3.66450153, -0.42487874, 0.93567804, 0.69366877, -0.4372179 , -0.16224243, -0.56165616, -0.48463784, 0.3716906 , -0.41100022]) #4番目のダミー変数が3.6645・・ 私の質問時コードの前段階での重回帰での標準化のものですが、 ダミー変数も0から3.6645・・のように変化するんですね。 そのまま0または1なのかと思っていました。
kouji_39

2020/05/07 15:54

<スパースなデータをそのまま標準化するとスパース性を失うので、スパース性を活かしたデータ型で処理したい場合は中心化を行わず分散だけ整える「標準化」を行うことがあります。 上記のスパース性については、まだ勉強不足でよく理解できていません。今後の課題ですね。
guest

0

そこで、ダミー変数に特徴量の標準化を使うべきかという点でご意見をいただきたいです。

まず、標準化が有効かどうかは、アルゴリズムによります。
今回の LinearRegression の場合、アルゴリズムの仕組み上、標準化しても、しなくても結果は変わりません。

SGD のような標準化が効いてくるアルゴリズムの場合、ダミー変数もそうでない変数も一律に標準化します。

ダミー変数は正規化に近く、「最低が0、最高が1になるようにデータを

加工(スケーリング)」したものと考えることができ

ダミー変数化の目的は、スケーリングではなく、カテゴリ変数を数値で表すことが目的です。
例えば、晴れ、曇、雨という3つの値をとるカテゴリ変数があったとき、これを晴れ=0、曇=1、雨=2と数値で表すと、これら3つには本来ないはずの大小関係ができてしまいます。
そのため、それぞれ3つのダミー変数に分けて、それぞれの変数を0, 1 で表すことでそうならないようにします。

投稿2020/05/07 11:53

編集2020/05/07 12:12
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouji_39

2020/05/07 15:36 編集

>今回の LinearRegression の場合、アルゴリズムの仕組み上、標準化しても、しなくても結果は変わりません。 そうなんです。mse計算結果はtrain、testとも同じです。掲載コードの前の段階での重回帰予測では、 標準化前は、各説明変数の傾き(係数)は大小で10^4の差がありますが、標準化すると、各説明変数の傾きは大小で10^2の差となり、なにより正の相関、負の相関が各説明変数の傾きで理解できるメリット があります。このために、標準化しているのだなと感じました。
kouji_39

2020/05/07 15:42

あと、ダミー変数を正規化したものというのは、私の見解違いでした。確かに、カテゴリ変数(晴れ、曇り、雨)のように順序のないカテゴリを、数値に置き換えるための変数がダミー変数でした。
tiitoi

2020/05/07 16:15

ここでいう結果が変わらないというのはモデルの性能のことなので、標準化したデータで学習すると、傾きや切片の値はもちろん変わりますね。 SGD などのアルゴリズムは標準化するかどうかがモデルの性能にも影響します。 LinearRegression で標準化することで性能が悪くなるということはないので、標準化しといても問題ないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問