2017-06-23 18 views
0

私は多くの特徴を考慮して、住宅価格を決定するために線形回帰をPythonで実行しようとしています。これらのうちのいくつかは数値で、一部は非数値です。私は非数値の列のための1つのホットエンコーディングを行い、新しい数値の列を古いデータフレームに添付し、非数値の列をドロップしようとしています。これはトレーニングデータとテストデータの両方で行われます。線形回帰で予測される値が非常に大きい

私は2つの列のフィーチャの交差点を取っていました(私はテストデータにしかないエンコーディングを持っていました)。その後、線形回帰に移行します。コードは以下の通りです:

non_numeric = list(set(list(train)) - set(list(train._get_numeric_data()))) 
train = pandas.concat([train, pandas.get_dummies(train[non_numeric])], axis=1) 
train.drop(non_numeric, axis=1, inplace=True) 

train = train._get_numeric_data() 
train.fillna(0, inplace = True) 

non_numeric = list(set(list(test)) - set(list(test._get_numeric_data()))) 
test = pandas.concat([test, pandas.get_dummies(test[non_numeric])], axis=1) 
test.drop(non_numeric, axis=1, inplace=True) 

test = test._get_numeric_data() 
test.fillna(0, inplace = True) 

feature_columns = list(set(train) & set(test)) 
#feature_columns.remove('SalePrice') 
X = train[feature_columns] 
y = train['SalePrice'] 

lm = LinearRegression(normalize = False) 
lm.fit(X, y) 

import numpy 
predictions = numpy.absolute(lm.predict(test).round(decimals = 2)) 

私がいる問題は、私は、出力、数百万ドルでどこかのようにこれらの不合理に高い販売価格を取得することです。 1つのホットエンコーディングを試す前に、私は数十万ドルの妥当な数を得ました。何が変わったのか分かりません。

また、これを行うより良い方法があれば、私はそれについて聞いて欲しいと思います。

+0

なぜ機能からコメントを削除した行がSalePriceですか?これでXデータにも同じように表示されます –

+0

列車とテストの両方にないので、feature_columnsの一部ではありません。 – David

答えて

0

私はstatsサイトに投稿し、亜美Tavoryは同じダミー変数は、両方のデータフレームに設定されたことを確認するためにget_dummiesがマージされたtraintestデータフレーム上で実行する必要があることを指摘しました。これは問題を解決しました。

0

「ワンホット」エンコードされた変数の特徴列の合計を使用すると、1つのカテゴリ変数を持っている場合は、あなたが必要と常に1

あるので、あなたは、原因の機能の欄のカテゴリ変数の導入に共線性が発生しているように見えます線形回帰で「fit_intercept = False」を設定する(またはワンホットコード化変数のフィーチャ列の1つをドロップする)

複数のカテゴリ変数がある場合は、それぞれの共線性を破るカテゴリ。

from sklearn.linear_model import LinearRegression 
import numpy as np 
import pandas as pd 
In [72]: 

df = pd.read_csv('/home/siva/anaconda3/data.csv') 
df 
Out[72]: 
C1 C2 C3 y 
0 1 0 0 12.4 
1 1 0 0 11.9 
2 0 1 0 8.3 
3 0 1 0 3.1 
4 0 0 1 5.4 
5 0 0 1 6.2 
In [73]: 

y 
X = df.iloc[:,0:3] 
y = df.iloc[:,-1] 
In [74]: 

reg = LinearRegression() 
reg.fit(X,y) 
Out[74]: 
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) 
In [75]: 

_ 
reg.coef_,reg.intercept_ 
Out[75]: 
(array([ 4.26666667, -2.18333333, -2.08333333]), 7.8833333333333346) 
we find that co_efficients for C1, C2 , C3 do not make sense according to given X. 
In [76]: 

reg1 = LinearRegression(fit_intercept=False) 
reg1.fit(X,y) 
Out[76]: 
LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False) 
In [77]: 

reg1.coef_ 
Out[77]: 
array([ 12.15, 5.7 , 5.8 ]) 
we find that co_efficients makes much more sense when the fit_intercept was set to False 

下記の同様の質問の詳細な説明。

https://stats.stackexchange.com/questions/224051/one-hot-vs-dummy-encoding-in-scikit-learn

+0

fit_interceptをFalseに設定しようとしましたが、何の助けにもならなかったようです。また、(ドキュメンテーション)[https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html]には、あなたの応答を見た後に私がtrueに設定したdrop_firstパラメータが表示されています。それでも似たような結果が出ています。これは問題ですが、この問題を解決するようには見えません。助言がありますか? – David