如何使用Python和Scikit进行线性回归学习使用一个热编码?

时间:2016-12-25 23:24:01

标签: python scikit-learn linear-regression

我正在尝试将线性回归与python和scikitlearn结合使用,以回答“根据用户人口统计信息可以预测用户会话长度的问题吗?”

我使用线性回归,因为用户会话长度以毫秒为单位,这是连续的。我热门编码了我的所有分类变量,包括性别,国家和年龄范围。

我不确定如何考虑我的热门编码,或者我是否需要。

输入数据:

enter image description here

我试着在这里阅读:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

我理解输入是我的主要是计算拟合截距,规范化,复制x(所有布尔值),然后是n个作业。

在确定这些输入时,我不确定要考虑哪些因素。我还担心我的变量的热编码是否会产生影响。

3 个答案:

答案 0 :(得分:3)

我只是想用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)的statsmodels,因为它提供了更好的模型统计,例如每个变量的p值等

答案 1 :(得分: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))

请注意,此示例我正在使用相同的数据集进行培训和测试!这可能会导致模型过度拟合。您应该避免分割数据或进行交叉验证。

答案 2 :(得分:1)

如何为sklearn LinearRegression准备数据

OneHotEncode只应在预期的列上使用:具有分类变量或字符串的变量,或本质上是级别而不是数字的整数。

请勿将OneHotEncode应用于整个数据集,包括数字变量或布尔值。

要准备sklearn LinearRegression的数据,应分别处理数字和分类。

  • 数字列:标准化模型是否包含相互作用或多项式项
  • 类别列:通过sklearn或pd.get_dummies应用OneHot。 pd.get_dummies更加灵活,而OneHotEncode在使用sklearn API时更加一致。

drop ='first'

从0.22版开始,sklearn中的OneHotEncoder具有drop选项。例如OneHotEncoder(drop='first').fit(X),它类似于 pd.get_dummies(drop_first=True)

使用正则线性回归

如果使用正则化线性回归(例如套索),则多重共线性变量将受到惩罚和缩小。

p值统计信息的局限性

OLS中的p值仅在OLS假设大致正确时才有效。虽然有一些方法可以处理无法信任p值的情况,但一种潜在的解决方案是使用交叉验证或留一法来获得对模型的信心。