在scikit-learn中拟合分类器之前进行特征缩放的必要性

4

我曾经认为scikit-learnLogistic Regression分类器(以及SVM)在训练之前会自动标准化我的数据。我这样认为的原因是因为传递给LogisticRegression构造函数的正则化参数C:应用正则化(按照我的理解)没有特征缩放就没有意义。为了使正则化正常工作,所有特征应该在可比较的范围内。因此,我过去默认调用LogisticRegression.fit(X)在训练数据X上时,fit方法首先执行特征缩放,然后开始训练。为了测试我的假设,我决定手动缩放X的特征如下:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X)
X_std = scaler.transform(X)

然后我使用正则化参数C初始化了一个LogisticRegression对象:

from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(C=10.0, random_state=0)

我发现在训练模型时使用XX_std是不等价的。也就是说,由此产生的模型是有区别的。

log_reg.fit(X_std, y)

与由模型产生的模型不相似

log_reg.fit(X, y)

这是否意味着在训练之前,scikit-learn不会对特征进行标准化处理?或者它确实进行了缩放,但是使用了不同的过程?如果scikit-learn不执行特征缩放,那么如何与要求正则化参数C保持一致呢?为了使正则化有意义,我需要在每次拟合模型之前手动标准化我的数据吗?

在这两种情况下,您都没有设置random_state参数,请尝试为 LogisticRegression 构造函数传递 random_state = 0。默认情况下是None,因此您可能会看到任何差异,可以参考文档了解更多信息。 - EdChum
@EdChum:好观点,谢谢。但是我在测试上面的代码时实际上已经传递了random_state=0参数。我忘记在问题中说明这一点,所以现在正在编辑问题。 - snakile
1个回答

0

从以下注释中:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

我认为您需要自己预处理数据(例如使用sklearn.preprocessing中的缩放器)。

solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}

用于优化问题的算法。 对于小型数据集,“liblinear”是一个不错的选择,而“sag”对于大型数据集更快。

对于多类问题,只有“newton-cg”和“lbfgs”处理多项式损失;“sag”和“liblinear”仅限于一对多方案。

‘newton-cg’、‘lbfgs’和‘sag’仅处理L2惩罚。

请注意,‘sag’快速收敛仅在具有近似相同比例的特征上保证。您可以使用sklearn.preprocessing中的缩放器预处理数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接