Sklearn笔记--逻辑回归调参指南

1 逻辑回归概述

p θ ( y = 1 x ) = δ ( θ x ) = 1 1 + e θ x p θ ( y = 0 x ) = e θ x 1 + e θ x \begin{array}{c} p_{\theta}(y=1 | x)=\delta\left(\theta^{\top} x\right)=\frac{1}{1+e^{-\theta^{\top} x}} \\ p_{\theta}(y=0 | x)=\frac{e^{-\theta^{\top} x}}{1+e^{-\theta^{\top} x}} \end{array}

在Scikit-learn的最新版本中,与逻辑回归有关的有2个类。LogisticRegression, LogisticRegressionCV 。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。 而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证,以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
在之前的版本中,还有一个Logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数,主要是用在模型选择的时候。在版本0.21中已废弃,在版本0.23中已删除。
LogisticRegression和LogisticRegressionCV中的大部分参数是一样的,下面首先介绍LogisticRegression的参数,再介绍LogisticRegressionCV中的不同参数。

本文基于scikit-learn 0.23最新版本,官方API 为:

sklearn.linear_model.LogisticRegression

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)


2 LogisticRegression参数指南


2.1 正则化参数:penalty

{‘l1’,‘l2’, ‘elasticnet’, ‘none’}, default=’l2’
1、newton-cg、sag 和 lbfgs 算法只能使用 l2 正则化,因为L1正则化的损失函数不是连续可导的。
2、elasticnet是弹性网络正则化,是L1正则化和L2正则化的混合项,仅支持saga损失函数优化器。
3、在调参时一般选择L2正则化就够了,但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。

2.2 损失函数优化器:solver

{‘liblinear’,‘lbfgs’, ‘sag’,‘newton-cg’, ‘saga’}, default=’lbfgs’
solver参数决定了我们对逻辑回归损失函数的优化方法,有5种算法可以选择,分别是:
  a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数,适用于小数据集。
  b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,sag是一种线性收敛算法,这个速度远比梯度下降法快。
  e) saga:快速梯度下降法,线性收敛的随机优化算法的的变种,适用于样本量非常大的数据集。

从上面的描述可以看出,newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear,saga适用于L1正则化和L2正则化。
同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。
下图是官方给出的损失函数优化器适用情形:
在这里插入图片描述

总结而言:
1、liblinear支持L1和L2,只支持OvR做多分类。
2、lbfgs, sag,newton-cg只支持L2,支持OvR和MvM做多分类。
3、saga支持L1、L2、Elastic-Net,支持OvR和MvM做多分类。

2.3 分类方式选择参数:multi_class

{‘auto’, ‘ovr’, ‘multinomial’}, default=’auto’
1、‘ovr’ – ‘OvR’, 将多分类问题看成是二分类问题,每次只将一类样本与其他类样本组成的集合进行训练,进行 nc 次训练以后就可以完成多分类问题的处理了。
2、‘multinomial’ – ‘MvM’,liblinear 不能选择该项,以单循环的方式进行分类,每次处理两个分类,保证样本中所有分类两两组合进行过一次训练,共需 nc*(nc-1)/2 次训练,分类速度慢,但分类结果更准确。
3、‘auto’ – 如果 resolver 是 liblinear 则选择 OvR,否则选择 MvM。
   
OvR相对简单,但分类效果相对略差。而MvM分类相对精确,但是分类速度没有OvR快。

2.4 类型权重参数:class_weight

{dict or ‘balanced’}, default=None
class_weight 参数决定了样本的各分类类型权重,可以取值:
1、dict – 通过 dict 定义分类权重:{class_label: weight}。
2、balanced – 类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。
3、None – 默认值,不指定权重。

那么class_weight有什么作用呢?在分类模型中,我们经常会遇到两类问题:

1、第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,这时我们可以适当提高非法用户的权重。
2、第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。

2.5 其他参数

---- dual:对偶或原始方法
bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。
---- tol:迭代收敛标准
float类型,默认为1e-4,停止求解的标准。
---- c:正则化系数λ的倒数
float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。
---- fit_intercept:是否存在截距或偏差
bool类型,默认为True。
---- intercept_scaling
仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1。
---- random_state:随机数种子
int类型,可选参数,默认为无,仅在正则化优化算法为"sag",“liblinear"时有用。
---- max_iter:算法收敛最大迭代次数
int类型,默认为10。仅在正则化优化算法为"newton-cg”, "sag"和"lbfgs"才有用,算法收敛的最大迭代次数。
---- verbose:日志冗长度
int类型。默认为0,就是不输出训练过程;1的时候偶尔输出结果;大于1,对于每个子模型都输出。
---- warm_start:热启动参数
bool类型,默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。
---- n_jobs:并行数
int类型,默认为1。1的时候,用CPU的一个内核运行程序;2的时候,用CPU的2个内核运行程序;为-1的时候,用所有CPU的内核运行程序。

2.6 类属性和方法

类属性

---- coef_:决策函数中的特征系数
---- intercept_:截距
---- n_iter_:所有分类实际迭代次数

类方法

---- decision_function(X) :预测样本的置信度分数
---- densify() :密集化处理,将系数矩阵转换为密集阵列格式
---- sparsify() :稀疏化处理,将系数矩阵转换为稀疏格式
---- fit(X, y[, sample_weight]) :训练逻辑回归模型
---- get_params([deep]):获取参数
---- predict(X):用来预测测试样本的标记,也就是分类,预测X的标签
---- predict_log_proba(X): 获取预测样本 log 概率估计
---- predict_proba(X) :获取预测样本概率估计
---- score(X, y[, sample_weight]) :返回给定的测试数据和标签的平均精度
---- set_params(**params) :设置estimate的参数

样本权重参数: sample_weight

上面我们提到了样本失衡的问题,由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit(X, y[, sample_weight])函数时,通过sample_weight来自己调节每个样本权重。Scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight。


3 LogisticRegressionCV参数指南


sklearn.linear_model.LogisticRegressionCV

class sklearn.linear_model.LogisticRegressionCV(Cs=10, fit_intercept=True, cv=None, dual=False, penalty=‘l2’, scoring=None, solver=‘lbfgs’, tol=0.0001, max_iter=100, class_weight=None, n_jobs=None, verbose=0, refit=True, intercept_scaling=1.0, multi_class=‘auto’, random_state=None, l1_ratios=None)

LogisticRegressionCV与LogisticRegression中不同的参数已经用粗体标示了。

3.1 LogisticRegressionCV中的参数

LogisticRegressionCV中的大部分参数和LogisticRegression是一样的,还有些是LogisticRegression中没有的,这里单独说明。

---- 正则化系数λ的倒数 Cs
浮点数列表或int,可选(默认值= 10)。如果Cs为int,则以1e-4和1e4之间的对数标度选择Cs值网格。与支持向量机一样,较小的值指定更强的正则化。
---- 交叉验证参数 : cv
默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
---- refit
bool,optional(默认= True)。如果设置为True,则对所有folds处的分数取平均值,并获取与最佳分数相对应的coefs和C,然后使用这些参数进行最后的修正。如果设置为False,coefs、intercepts和C对应的最佳folds的分数将被平均。
---- l1_ratios
float或None列表,可选(默认=无)。弹性网混合参数列表,用于交叉验证的l1_ratio数组。如果没有使用l1_ratio(即惩罚不是’ elasticnet '),则将其设置为[None]。

3.2 类属性和方法

类属性

coef_、intercept_、n_iter_属性和LogisticRegression中的一致。
---- Cs_
用于交叉验证的正则化系数λ的倒数 Cs。
---- C_
数组C映射到每个类的最佳分数。
---- scores_
在对相应的类执行OvR之后,以类为键进行dict,值为交叉验证每个fold时获得的分数网格。
---- l1_ratios_
用于交叉验证的l1_ratios数组。
---- l1_ratio_
映射到每个类最佳分数的l1_ratio数组。
---- coefs_paths_
以类为键的dict,值为通过每个fold进行交叉验证时获得的系数路径,和通过每个类执行OvR相应Cs获取的系数路径。

LogisticRegressionCV与LogisticRegression中的类方法一致。

参考资料

https://blog.csdn.net/sun_shengyun/article/details/53811483
https://blog.csdn.net/kingzone_2008/article/details/81067036
https://techlog.cn/article/list/10183284
https://scikit-learn.org/dev/modules/linear_model.html#logistic-regression
https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression

发布了17 篇原创文章 · 获赞 30 · 访问量 1564

猜你喜欢

转载自blog.csdn.net/OuDiShenmiss/article/details/105234824
今日推荐