我曾经相信scikit-learn
Logistic Regression分类器(以及SVM)会在训练前自动标准化我的数据。我之所以相信它的原因是因为传递给C
构造函数的正则化参数LogisticRegression
:如果没有特征缩放,应用正则化(我理解它)并没有意义。为了使正规化工作正常,所有功能都应该具有可比性。因此,我曾经假设在训练数据LogisticRegression.fit(X)
上调用X
时,fit
方法首先执行特征缩放,然后开始训练。为了测试我的假设,我决定手动扩展X
的功能如下:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X)
X_std = scaler.transform(X)
然后我使用正则化参数LogisticRegression
初始化了一个C
对象:
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
的一致性如何?我是否应该在拟合模型之前每次手动标准化我的数据,以使正则化有意义?
答案 0 :(得分:0)
来自以下注释:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
我假设您需要自己预处理数据(例如使用sklearn.preprocessing中的缩放器。)
求解器:{'newton-cg','lbfgs','liblinear','sag'}
在优化问题中使用的算法。 对于小数据集,'liblinear'是一个不错的选择,而'sag'对于大数据集来说更快。
对于多类问题,只有'newton-cg'和'lbfgs'处理多项损失; 'sag'和'liblinear'仅限于一对一休息方案。
'newton-cg','lbfgs'和'sag'只处理L2惩罚。
请注意,只有具有大致相同比例的要素才能保证“下垂”快速收敛。您可以使用sklearn.preprocessing中的缩放器预处理数据。