我只想用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值等。
您的數據看起來已經像編碼正確。但是,如果你可以的話,我會嘗試適合模型,而不是按年齡分類。 – Moritz
爲什麼使用線性迴歸作爲特殊的東西?例如,隨機森林迴歸器也適用於不斷的價值。 – sergzach