2017-05-11 12 views
0

目的:フィッティングした多変量線形回帰モデルによる予測のテスト誤差を計算したいと思います。統計モデル予測と実際のy値の比較(インデックス問題)

問題:ここに私のコードです。トレーニングデータに線形回帰モデルをフィットし、その後X_test変数に基づいてy値(価格)を予測するために意図されています

X.insert(0, 'constant', 1) # insert constant column 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) 
lm_sm = sm.OLS(y_train, X_train).fit() 

y_pred = pd.DataFrame() # dataframe for predictions vs actual y-values 
y_pred['predictions'] = lm_sm.predict(X_test) 

print y_test.sort_index().head() 
print y_pred.sort_index().head() 

コードは次のように出力します

 price 
6 257500.0 
17 485000.0 
23 252700.0 
25 233000.0 
26 937000.0 
    predictions 
0 509428.615367 
1 324403.584917 
2 477385.431339 
3 484962.235105 
4 827039.820936 

予測の比較と実際の価格、これは明らかに正しくはありません。 predict()メソッドは、私のtrain/test splitからのインデックスを保持しません。だから、実際の価格と予測価格を比較すると、私は正しい値を比較しているとは確信できません。

私が考えた唯一の解決策(これが正しいと思うかどうかはわかりません)は、予測を行うときにX_testを並べ替えることです。すなわち、y_pred['predictions'] = lm_sm.predict(X_test.sort_index())です。

 price 
6 257500.0 
12 310000.0 
18 189000.0 
25 233000.0 
29 719000.0 
    predictions 
0 259985.788272 
1 590648.478023 
2 339621.126287 
3 316402.199424 
4 635513.611634 

私は、これらのソートデータフレームに基づいてテスト誤差計算を実行します:予測はもう少し(これがそう全く機能エンジニアリングがまだ適用されていない最初の線形回帰/ベンチマークであることに注意)私の期待に合わせ見えます。これは正しいですか?これを行うためのよりクリーンな方法がありますか?私が知らない方法?どのような助けや考えがありがとう、ありがとう!

答えて

2

実際に注文に間違いはないと思います。複雑な指数y_predと比較した場合、混同指数y_testが混乱の原因となります。

あなたのデータセット(X, y)train_test_splitを使用

が、明らかに y_testは、インデックスのシャッフルサブセットを持っている理由である、周りのものをシャッフルするだろう。

lm_sm.predict(X_test)を実行すると、出力は単純な数値配列になります。これは、インデックスを持つパンダオブジェクトではないので、インデックス情報は既に失われています。さらに、あなたのコードでは、新しいy_predデータフレームに結果を保存します。そして、その新鮮y_predで、インデックスは新鮮な自動インクリメントされます:0、1、2 ...

だからsort_index()を使用していない、とあなたはy_predは、あなたが持っているとして、それが並ぶことを確認することができますX_testおよびy_testである。

EDIT。うまくいけば、これは物事をより良く説明します。

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from statsmodels.regression.linear_model import OLS 

X = pd.DataFrame(np.random.random((60, 3))) 
y = pd.DataFrame(np.random.random((60, 1))) 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) 

print(X_test) 

テスト・セットの機能:

  0   1   2 
2 0.547993 0.479149 0.495539 
48 0.332964 0.857635 0.501391 
23 0.380500 0.377257 0.088766 
35 0.045725 0.432096 0.239523 
52 0.254861 0.207215 0.985722 
37 0.099525 0.205250 0.054000 
22 0.426227 0.253524 0.336110 
43 0.716443 0.006443 0.423447 
49 0.146820 0.803366 0.390921 
6 0.127666 0.848561 0.936604 
46 0.303034 0.548064 0.852688 
33 0.516726 0.977396 0.829725 

そして、テスト・セットのターゲットprint(y_test)を持つ:

  0 
2 0.123253 
48 0.494307 
23 0.312021 
35 0.939558 
52 0.958955 
37 0.681215 
22 0.181427 
43 0.907552 
49 0.589316 
6 0.613305 
46 0.947220 
33 0.696609 

指標がシャッフルされているが、彼らは同意します。今すぐ実行します。

lm_sm = OLS(y_train, X_train).fit() 
y_pred = pd.DataFrame() # dataframe for predictions vs actual y-values 
y_pred['predictions'] = lm_sm.predict(X_test) 

# Print this directly 
print(lm_sm.predict(X_test)) 

最終ラインは単なるnumpyの配列です:

[ 0.44549342 0.44973765 0.24465328 0.17840542 0.42329909 0.09567253 
    0.30675321 0.38496281 0.33836597 0.49959203 0.47488055 0.63751567] 

そして、あなたは新しいy_predデータフレームを見ると、インデックスは新鮮0で、1、2 ... print(y_pred)

predictions 
0  0.445493 
1  0.449738 
2  0.244653 
3  0.178405 
4  0.423299 
5  0.095673 
6  0.306753 
7  0.384963 
8  0.338366 
9  0.499592 
10  0.474881 
11  0.637516 

あなたはこれらのインデックスはy_testのものと一致していないことに驚いたかもしれないが、私はあったとして、predict()機能は、プレーンを返します。結果としてy_predをもはや元のインデックスに接続するものは何もありません。それにもかかわらず、あなたはすべてが整列していることを確認することができます。

関連する問題