我曾经认为scikit-learn
的Logistic 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)
我发现在训练模型时使用X
和X_std
是不等价的。也就是说,由此产生的模型是有区别的。
log_reg.fit(X_std, y)
与由模型产生的模型不相似
log_reg.fit(X, y)
这是否意味着在训练之前,
scikit-learn
不会对特征进行标准化处理?或者它确实进行了缩放,但是使用了不同的过程?如果scikit-learn
不执行特征缩放,那么如何与要求正则化参数C
保持一致呢?为了使正则化有意义,我需要在每次拟合模型之前手动标准化我的数据吗?
random_state
参数,请尝试为LogisticRegression
构造函数传递random_state = 0
。默认情况下是None
,因此您可能会看到任何差异,可以参考文档了解更多信息。 - EdChumrandom_state=0
参数。我忘记在问题中说明这一点,所以现在正在编辑问题。 - snakile