2017-06-23 95 views
0

我想在python中運行線性迴歸來確定給定許多功能的房價。其中一些是數字的,另一些是非數字的。我正在嘗試爲非數字列做一個熱門編碼,並將新的數字列附加到舊的數據框並刪除非數字列。這是在訓練數據和測試數據上完成的。非常大的值爲線性迴歸預測

然後我拿到了兩列功能的交集(因爲我有一些編碼只位於測試數據中)。之後,它進入線性迴歸。代碼如下:

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)) 

是我遇到的問題是,我得到這些高得離譜的銷售價格作爲輸出,動輒上百萬美元的地方。在我嘗試了一個熱門編碼之前,我得到了數十萬美元的合理數字。我無法弄清楚發生了什麼變化。

此外,如果有更好的方法來做到這一點,我會很渴望聽到它。

+0

爲什麼要刪除SalePrice的特性評論?現在您也可以在X數據中使用它 –

+0

它不屬於feature_columns,因爲它不在列車和測試中。 – David

回答

0

我張貼這在stats網站和阿美Tavory指出,get_dummies應在合併traintest數據幀運行,以確保相同的虛擬變量是在兩個dataframes成立。這解決了這個問題。

0

你似乎遇到多重共線性由於引入功能列分類變量,因爲編碼變量的「一熱」的特色欄目的總和始終爲1

如果你有一個分類變量,你需要在您的線性迴歸中設置「fit_intercept = False」(或刪除單熱編碼變量的一個特徵列)

如果您有多個分類變量,則需要爲每個分類變量刪除一個特徵列類別打破共線。

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