- 在scikit-learn中,与逻辑回归有关的主要有3个类,LogisticRegression, LogisticRegressionCV 和logistic_regression_path。
- LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用交叉验证来选择正则化系数C,而LogisticRegression需要自己指定正则化系数。
- logistic_regression_path类拟合数据后,不能直接来做预测,只能为拟合数据选择合适的逻辑回归系数和正则化系数,主要是用来模型选择。
- RandomizedLogisticRegression,虽然名字里有LogisticRegression,但主要是通过L1正则化的逻辑回归来做特征选择的,属于维度规约算法,不属于分类算法的范畴。
Sklearn.linear_model.LogisticRegression
正则化选择参数penalty
- penalty参数可选择"l1"和"l2",分别对应L1的正则化和L2的正则化,默认是L2的正则化。
- 在调参时如果主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。
- 但是如果选择L2正则化发现还是过拟合(预测效果差),就可以考虑L1正则化。
- 另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化,也可以使用L1正则化。
优化算法选择参数solver
-
solver参数决定了对逻辑回归损失函数的优化方法,有4种算法可以选择:
a) liblinear:使用开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
-
newton-cg, lbfgs和sag优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear L1正则化和L2正则化都可使用。
-
sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。
-
对于多元逻辑回归,MvM一般比OvR分类相对准确一些,而liblinear只支持OvR,不支持MvM,这样如果需要相对精确的多元逻辑回归时,就不能选择liblinear,也意味着不能使用L1正则化。
分类方式选择参数multi_class
- multi_class参数决定了分类方式,有 ovr和multinomial两个值可选,默认是 ovr。
- ovr即one-vs-rest(OvR),而multinomial即many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
- OvR:无论多少元逻辑回归,都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
- MvM,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,每次在T类样本里面选择两类样本出来,T1类和T2类,把所有输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。一共需要T(T-1)/2次分类。
- OvR相对简单,但分类效果相对略差。而MvM分类相对精确,但是分类速度没有OvR快。
类型权重参数class_weight
- class_weight参数用于表示分类模型中各种类型的权重。可以不输入,即所有类型的权重一样。可以选择balanced让类库自己计算类型权重,某种类型样本量越多,则权重越低,样本量越少,则权重越高。也可以输入各个类型的权重。
- 作用:
第一种是提高误分类的代价。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,可以适当提高非法用户的权重。
第二种是处理样本高度失衡,比如有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,可以选择balanced,让类库自动提高非法用户样本的权重。
样本权重参数sample_weight
- 由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致模型预测能力下降。遇到这种情况,可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。
- 在scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight.