我曾经相信scikit-learn
的逻辑回归分类器(以及SVM)会在训练前自动标准化我的数据。我过去认为这是因为传递给LogisticRegression
构造函数的正则化参数C
:如果没有特征缩放,应用正则化(据我所知)是没有意义的。为了使正则化正常工作,所有特征都应该在可比较的尺度上。因此,我曾经假设,当对训练数据X
调用LogisticRegression.fit(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
相一致?在拟合模型之前,我是否应该每次手动标准化我的数据,以便正则化有意义?
根据中的以下注释:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
我假设您需要自己对数据进行预处理(例如,使用sklearn.processing中的缩放器)
求解器:{‘newton-cg’、‘lbfgs’、‘liblinear’、‘sag’}
用于优化问题的算法。对于小型数据集,"liblinear"是一个不错的选择,而"sag"对于大型数据集则更快。
对于多类问题,只有"newton-cg"one_answers"lbfgs"处理多项式损失"sag"one_answers"liblinear"仅限于一对一方案。
"newton-cg"、"lbfgs"one_answers"sag"仅处理L2惩罚。
请注意,只有在具有大致相同规模的特征上才能保证"凹陷"快速收敛。您可以使用sklearn.processing中的缩放器对数据进行预处理。