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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

0回答

1211閲覧

重回帰分析時での外れ値を外したモデル評価

kouji_39

総合スコア164

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/03/06 22:25

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

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

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

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

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

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

toast-uz

2021/03/06 23:42 編集

やられていることの意図が十分理解できていないので、回答ではなくコメントに記述します。 「外れ値」かどうかは正解ラベルが判明してはじめて分かることだと思います。よって、「外れ値」かどうかによって予測の方法を変える、というのは、リーク(推論すべき正解ラベルの情報を推論前に得てしまっている状態)しており、正しい予測にはなりません。 という指摘が的を射ているでしょうか?それとも、違う意図を考えられていますでしょうか? なお、外れ値かどうかを、正解ラベルを含まない特徴量だけで判別できるのであれば、言われている手法は一種のアンサンブルであり、正しいやり方です。ただし、外れ値に対して有効な正規化・標準化手法というものが存在しますので、そういった手法で前処理をするのが一般的です。
kouji_39

2021/03/06 23:59

toast-uzさん、コメントありがとうございます。 toast-uzさんのコメントで、「「外れ値」かどうかは正解ラベルが判明してはじめて分かることだと 思います。」とあります。boston住宅価格の場合、全データ(不動産価格モデルの正解ラベル有)から、 不動産価格モデルの3σ(σ:標準偏差)を外れる価格を取り除きました。よって、この場合、正解ラベル があっての外れ値です。 加えて、自分なりに調べたことを述べます。(参考文献:Chris Albin(著)、中田秀基(訳)、「Python 機械学習クックブック」、オライリー・ジャパン発行、pp.72) ・外れ値の取り扱いは、機械学習の目的により異なる。 ・不動産価格モデルの場合、3σ(σ:標準偏差)を外れる価格を取り除き、一般的でない住宅価格は取り除かれたモデルが得られる。 ・よって、一般的な住宅の価格を知りたい場合は、外れ値を外したデータによる結果のモデルが妥当と考えます。 (追伸)参考文献中に、外れ値がある場合に標準化変換が適切に機能しない場合があり、その場合に、 RobustScalerのような外れ値にあまり影響を受けないスケール変換手法を用いるとよいとありました。 まだまだ、「外れ値問題対応」は奥が深そうです。
meg_

2021/03/07 00:55

> 不動産価格モデルの3σ(σ:標準偏差)を外れる価格を取り除きました。 目的変数(住宅価格)のことでしょうか?
kouji_39

2021/03/07 01:14

meg_さん、お久しぶりです。コメントありがとうございます。 不動産価格モデルの3σ(σ:標準偏差)を外れる価格(=目的変数(住宅価格))、および外れ値の目的変数をとった説明変数群(13項目)は、取り除いたという意味です。
meg_

2021/03/07 01:55

> ・不動産価格モデルの場合、3σ(σ:標準偏差)を外れる価格を取り除き、一般的でない住宅価格は取り除かれたモデルが得られる。 そうなんですね。ただ、ボストン住宅価格のデータ(私はsklearnから取得)を見ると上限が5万ドルで固定?されているようなので、その値を除外してしまうと良くないかもしれませんね。
toast-uz

2021/03/07 02:17

私の主張は、予測対象となるテストデータにおいて正解ラベルである住宅価格が外れ値かどうかは考慮してはいけない、ということです。引用された書籍は学習データからモデルを作る手法として外れ値を切り離すことも有用である、と主張しており、私の主張とは矛盾していません。 それに対して、質問者様は、「予測のターゲット値が外れ値の範囲に及ぶ場合は、外れ値を外していないデータ(全データ)による結果のモデルを使い」と書かれており、予測対象となるテストデータが外れ値かどうかで処理を変えようとしています。これはリークであり、本の主張とは異なります。 この点は、質問者様はどのように考えていますでしょうかか?私の(質問者様の意図の)解釈が正しいかどうか自信がなく、それを確認するために、最初のコメントを記載しております。
kouji_39

2021/03/07 02:40

toast-uzさん、再度のコメントありがとうございます。 そうですね。予測対象となるテストデータ(=私は予測用のデータと認識しました。モデル作成時での訓 練データとテストデータとは別物)は、住宅価格がないものです。 よって、一度、外れ値を外したデータによる結果のモデルで、いくつかの予測用データをモデルに食わせて、目的変数が外れ値(ここでは、3σを外れるものを基準)とみなせるような住宅価格結果となった段 階で、再度、外れ値を外さない全データによるモデル作成を行い、目的変数が外れ値となった説明変数群をモデルに食わせるという方法でどうでしょうか。
toast-uz

2021/03/07 02:46

質問者様、コメントありがとうございます。それであれば、私の最初のコメントの後半が該当すると思います。 「なお、外れ値かどうかを、正解ラベルを含まない特徴量だけで判別できるのであれば、言われている手法は一種のアンサンブルであり、正しいやり方です。ただし、外れ値に対して有効な正規化・標準化手法というものが存在しますので、そういった手法で前処理をするのが一般的です。」 補足ですが、正しいやり方であっても、それが効果のあるやり方かどうかは、一般論では言えずに、やってみるしかないと思います。よって、質問者様の手法は正しいですが、効果があるかどうかはわかりません。
aokikenichi

2021/03/07 06:35

toast-uz さんのご意見に賛成です。 bostonデータの場合はこのデータしかありませんが、実務上は どうして、一見外れ値と思われるような値が出るのか?説明変数にない+要素(緑が多い、買い物至便etc)、-要素(事故物件etc)を探るなどがより重要であり、 外れ値の取り扱いの一般ルールを決めることはあまりなじまないと思います。 一般化をするのではなく、ただあるデータの中だけで仮説を立てていろいろ検証してみるということであれば、学ぶ上で有用と思います。
kouji_39

2021/03/07 10:08

toast-uzさん、aokikenichiさん、コメントありがとうございます。参考にしたいと思います。 統計webというネットページで以下のような記述がありました。 「外れ値には、外れ値の探索には次のような方法があります。なお外れ値が見つかった場合、目的に応じ て除外したり、データを変換(対数変換など)を行ったりすることがあります。1)箱ひげ図を描く2) 外れ値検定を行う3)クラスター分析を行う」 以上のように、多角的に外れ値を考える必要があるかもしれません。また、予測モデルをどのように使う か等での外れ値判定も変化するようなものと感じます。
toast-uz

2021/03/07 22:56 編集

aokikenichi様、コメントありがとうごさいます。 kouji_39様、最初の質問回答としては「一般論としてご質問の手法が妥当であるかはわかりません。やってみてください。」となります。 なお、私はしては「ご質問の手法は妥当ではない」可能性が高いと考えています。 この質疑で「外れ値」とは、目的変数である不動産価格の外れ値を意図しているが、それは正解ラベルのリーク(y_true)ではなく予測値(y_pred)である、と理解しました。一方、もともとの質問意図では、MSE(y_true, y_pred)が大きい要素を外れ値として除外しようとしています。すなわち、「外れ値」の場合、y_trueとy_predの乖離が大きいことになります。これは、y_trueは外れ値であってもy_predはそうではない、ということです。すなわち、y_predを用いて外れ値を判定しようとしていることが、効果が無さそうである、ということを示していると思います。 一般的に「外れ値」の処理はx_trainといった説明変数側を対象したものであると思います。ご質問の手法が妥当であるには、「説明変数が「穏健」で推論した目的変数が「外れ値」になる」ケースがそれなりにある必要があります。ちょっと考えにくい状況です。普通は、説明変数側が「外れ値」であるから予測も外れ値になりますので、説明変数側の外れ値対処で十分です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問