LogisticRegressionCV使用了交叉验证来选择正则化系数C。
LogisticRegression需要自己每次指定一个正则化系数。
除了交叉验证以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
logistic_regression_path类则比较特殊,它拟合数据后不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。
主要是用在模型选择的时候。一般情况用不到这个类,所以后面不再讲述logistic_regression_path类。
scikit-learn里面有个容易让人误解的类RandomizedLogisticRegression,主要是用L1正则化的逻辑回归来做特征选择的,属于维度规约的算法类,不属于分类算法的范畴。
class sklearn.linear_model.LogisticRegression(
penalty='l2', dual=False, tol=0.0001, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver='liblinear', max_iter=100, multi_class='ovr',
verbose=0, warm_start=False, n_jobs=1)
LogisticRegression和LogisticRegressionCV默认有正则化项。
penalty参数可选择的值为"l1"和"l2",对应L1和L2正则化,默认是L2正则化。
在调参时如果只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。
如果模型的特征非常多,希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty参数的选择会影响损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。
但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。因为L1正则化的损失函数不是连续可导的,
而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法都需要损失函数的一阶或者二阶连续导数而‘liblinear’并没有这个依赖。
solver参数决定了对逻辑回归损失函数的优化方法,有4种算法可以选择:
a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。
liblinear支持L1和L2,只支持OvR做多分类,“lbfgs”, “sag” “newton-cg”只支持L2,支持OvR和MvM做多分类。
multi_class参数决定了我们分类方式的选择,有 ovr和multinomial(多对多, MvM)两个值可以选择,默认是 ovr。
如果模型有T类,每次在所有的T类样本里面选择两类样本出来记为T1类和T2类,
把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,共需要T(T-1)/2次分类。
class_weight参数用于标示分类模型中各种类型的权重,可以不输入即不考虑权重,或者说所有类型的权重一样。
如果选择输入,可选择balanced让类库自己计算类型权重,或者输入各个类型的权重,比如对于0,1的二元模型,可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。
sklearn的官方文档中,当class_weight为balanced时,类权重计算方法如下:
n_samples / (n_classes * np.bincount(y)),n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]
在分类模型中,经常会遇到两类问题:
第一种是误分类的代价很高。比如对合法用户和非法用户分类,将非法用户分类为合法用户代价很高,不愿将非法用户分类为合法用户。这时可以适当提高非法用户的权重。
第二种是样本是高度失衡的,如有合法用户和非法用户的二元样本数据10000条,合法用户9995条,非法用户5条,则将所有的测试集都预测为合法用户,准确率理论上有99.95%。
这时,可选择balanced让类库自动提高非法用户样本的权重。
提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。
对于第二种样本失衡的情况,还可以考虑用样本权重参数: sample_weight,而不使用class_weight。
sample_weight : array-like, shape (n_samples,) optional
Array of weights that are assigned to individual samples.
If not provided, then each sample is given unit weight.
是在fit()函数中的参数,需要为每个样本提供权重,如不设置则每个样本权重相同。