我只是想用 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 中的线性回归,而不是将其仅用作基准,我会推荐 statsmodels 而不是 scikit-learn (https://pypi.python.org/pypi/statsmodels),因为它提供了更好的模型统计信息,例如每个变量的 p 值等。