1.質問内容
有名なboston住宅価格で、重回帰分析や他の回帰手法を勉強しております。
外れ値の影響度合いを調べて、mse(二乗誤差)とr2値でモデルの評価をしました。
1)外れ値を外したデータによる結果
mseについては、trainが18.20、testが10.70となりました。
モデルのあてはまりやすさの指標であるr2値は、0.738になりました。
2)外れ値を外していないデータ(全データ)による結果
mseについては、trainが19.33、testが33.45となりました。
モデルのあてはまりやすさの指標であるr2値は、0.773になりました。
上記のように、外れ値を外したデータによる結果では、testのmseでは、
大きく誤差が少なくなりますが、モデルのあてはまりやすさは
少しあてはまりがよくない結果になりました。
自分の考えでは、予測のターゲット値が外れ値の範囲に及ぶ場合は、
外れ値を外していないデータ(全データ)による結果のモデルを使い、
予測のターゲット値が、3σの範囲内にある場合は、外れ値を外した
データによる結果のモデルを使うというのが妥当と感じました。
外れ値に対して知識をお持ちの方のご意見をお聞かせください。
2.参考コード(外れ値を外したデータによる結果のモデル)
python3
1# ライブラリのインポート 2%matplotlib inline 3import matplotlib.pyplot as plt 4import numpy as np 5import pandas as pd 6from sklearn.linear_model import LinearRegression 7from sklearn.preprocessing import StandardScaler 8from sklearn.model_selection import train_test_split 9from sklearn.metrics import mean_squared_error 10 11df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+') 12 13df.columns=['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 14cols=df.columns 15 16_df=df 17mean=df.mean() 18sigma=df.std() 19for col in cols: 20 low=mean[col]-3*sigma[col] 21 high=mean[col]+3*sigma[col] 22 _df=_df[(_df[col]>=low)&(_df[col]<=high)] 23 24print(low) 25print(high) 26print(len(df)) 27print(len(_df)) 28 29# 全ての特徴量を選択 30X=_df.iloc[:, 0:13].values 31# 正解に住宅価格(MDEV)を設定 32y =_df['MEDV'].values 33 34X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 35print('X_trainの形状:',X_train.shape,' y_trainの形状:',y_train.shape,' X_testの形状:',X_test.shape,' y_testの形状:',y_test.shape) 36 37# 特徴量の標準化、元データの平均を0、標準偏差を1に変換する正規化 38sc = StandardScaler() 39# 訓練データを変換器で標準化 40X_train_std = sc.fit_transform(X_train) 41# テストデータを作成した変換器で標準化 42X_test_std = sc.transform(X_test) 43 44# 線形回帰モデルを作成 45model = LinearRegression() 46# モデルの訓練 47model.fit(X_train_std, y_train) 48#モデルの当てはまり具合 49model.score(X_train_std, y_train) 50 51# 訓練データ、テストデータの住宅価格を予測 52y_train_pred = model.predict(X_train_std) 53y_test_pred = model.predict(X_test_std) 54 55# MSEの計算 56print('MSE train: %.2f, test: %.2f' % ( 57 mean_squared_error(y_train, y_train_pred), 58 mean_squared_error(y_test, y_test_pred))) 59
3.補足情報(FW/ツールのバージョンなど)
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz
あなたの回答
tips
プレビュー