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

时间:2016-05-26 08:23:53

标签: python scikit-learn classification

我曾经相信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的一致性如何?我是否应该在拟合模型之前每次手动标准化我的数据,以使正则化有意义?

1 个答案:

答案 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中的缩放器预处理数据。