2016-12-25 61 views
1

我想結合使用線性迴歸與python和scikitlearn來回答「用戶會話長度可以預測給定用戶的人口統計信息?」的問題。如何使用Python和Scikit進行線性迴歸學習使用一種熱門編碼?

我正在使用線性迴歸,因爲用戶會話長度以毫秒爲單位,這是連續的。我熱門編碼了我所有的分類變量,包括性別,國家和年齡範圍。

我不知道如何考慮我的一個熱門編碼,或者如果我甚至需要。

輸入數據:

enter image description here

我想讀這裏:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

我理解的輸入是我的主要是是否計算一個合適的攔截,規範化,複製X(所有布爾)然後n個工作。

我不確定在決定這些輸入時需要考慮哪些因素。我還擔心我的一個熱門編碼變量是否會產生影響。

+0

您的數據看起來已經像編碼正確。但是,如果你可以的話,我會嘗試適合模型,而不是按年齡分類。 – Moritz

+0

爲什麼使用線性迴歸作爲特殊的東西?例如,隨機森林迴歸器也適用於不斷的價值。 – sergzach

回答

1

你可以這樣做:

from sklearn.preprocessing import OneHotEncoder 
from sklearn.linear_model import LinearRegression 

# X is a numpy array with your features 
# y is the label array 
enc = OneHotEncoder(sparse=False) 
X_transform = enc.fit_transform(X) 

# apply your linear regression as you want 
model = LinearRegression() 
model.fit(X_transform, y) 

print("Mean squared error: %.2f" % np.mean((model.predict(X_transform) - y) ** 2)) 

請注意,這個例子我正在訓練,並與同一數據集的測試!這可能會導致您的模型過度使用。您應該避免分割數據或進行交叉驗證。

+0

您應該在'LinearRegression'中設置'fit_intercept = False'來避免[dummy變量陷阱](http://www.algosome.com/articles/dummy-variable-trap-regression.html) – DontDivideByZero

2

我只想用sklearn來擬合線性迴歸,我用它作爲其他非線性方法(如MLPRegressor)的基準,但也包括線性迴歸的變體,如Ridge,Lasso和ElasticNet(請參閱此處瞭解簡介到這個組:http://scikit-learn.org/stable/modules/linear_model.html)。

這樣做的方式與@silviomoreto(適用於所有其他模型)所描述的相同,實際上對我而言導致了一個惡性模型(非常高的錯誤)。這很可能是由於所謂的虛變量陷阱,這是由於變量中的多重共線性而產生的,因爲當爲分類變量包含每個類別的一個虛擬變量時 - 這正是OneHotEncoder所做的!另請參閱以下關於statsexchange的討論:https://stats.stackexchange.com/questions/224051/one-hot-vs-dummy-encoding-in-scikit-learn

爲了避免這種情況,我寫了一個簡單的包裝器,它排除了一個變量,然後它作爲默認值。

class DummyEncoder(BaseEstimator, TransformerMixin): 

    def __init__(self, n_values='auto'): 
     self.n_values = n_values 

    def transform(self, X): 
     ohe = OneHotEncoder(sparse=False, n_values=self.n_values) 
     return ohe.fit_transform(X)[:,:-1] 

    def fit(self, X, y=None, **fit_params): 
     return self 

上@silviomoreto的代碼,所以建築,你會6號線改變:

enc = DummyEncoder() 

這解決了這個問題對我來說。請注意,OneHotEncoder對所有其他模型(例如Ridge,Lasso和ANN)都很好(並且更好)。

我選擇了這種方式,因爲我想將它包含在我的特徵管道中。但是你似乎已經有了編碼的數據。在這裏,您必須爲每個類別刪除一列(例如,男性/女性只包含一個)。因此,如果您例如使用pandas.get_dummies(...),則可以使用參數drop_first = True來完成此操作。最後但並非最不重要的一點,如果你真的需要更深入地進行Python的線性迴歸,而不是僅僅把它作爲一個基準,我會推薦使用scikit-learn的統計模型(https://pypi.python.org/pypi/statsmodels),因爲它提供了更好的模型統計,例如每個變量的p值等。

+0

而不是使用dummy編碼你可以在'LinearRegression'中設置'fit_intercept = False'來避免[dummy變量陷阱](http://www.algosome.com/articles/dummy-variable-trap-regression.html),同時仍然使用One-熱門編碼 – DontDivideByZero

相關問題