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} pθ(y=1x)=δ(θx)=1+eθx1pθ(y=0x)=1+eθxeθx

在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

### 回答1: 华为HCIP精品课程笔记-Wakin是一本非常有价值的学习资料。该笔记通过详细介绍HCIP认证的相关知识点和实用技能,为学生提供了一种高效学习的方式。 首先,华为HCIP精品课程笔记-Wakin涵盖了HCIP认证考试需要掌握的全部知识点。对于想要通过HCIP考试的学生来说,这本笔记提供了一个简明扼要的指南,可以帮助他们系统地学习和复习相关知识。笔记中的内容分为多个章节,涵盖了网络技术、路由器和交换机、路由控制、IP多播、IPv6和MPLS等重要主题。每个主题都有详细的解释和示例,帮助学生更好地理解和掌握。 其次,华为HCIP精品课程笔记-Wakin还包含了一些实用技能和案例分析。这些内容能够帮助学生更好地理解和应用所学知识。对于在实际工作中需要应用HCIP技能的人来说,这本笔记提供了一些宝贵的经验和建议。 此外,华为HCIP精品课程笔记-Wakin还提供了一些习题和练习题,可以帮助学生检验自己的学习成果。通过对这些习题的练习,学生可以更好地了解自己的薄弱点,并进行有针对性的复习和提高。 总之,华为HCIP精品课程笔记-Wakin是一本非常实用和有价值的学习资料。它提供了一种高效的学习方式,帮助学生系统地掌握和应用HCIP认证的相关知识和技能。我强烈推荐这本笔记给所有想要通过HCIP考试或者在实际工作中应用HCIP技能的人。 ### 回答2: 《华为HCIP精品课程笔记-wakin》是一本非常有价值的学习资料。这本书由华为公司精心编撰而成,旨在帮助学员高效学习和掌握华为认证网络工程师(HCIP)认证所需的知识和技能。 这本笔记深入浅出地介绍了HCIP认证相关的重要概念、原理和应用。其中包括了网络架构设计、路由与交换技术、安全技术、无线网络技术等内容。每个主题都有详细的解释、示意图和实例,使读者能够更好地理解和应用知识。 除了内容丰富全面外,这本笔记还具有一些独特的优点。首先,它采用了华为独有的学习方法,系统化地梳理了知识结构,使读者能够更加有条理地学习。其次,每个章节都附带了重点整理的要点,方便读者快速回顾和温习。此外,为了帮助读者更好地理解,笔记还提供了一些实验和实际案例,使学习更加实践性和深入。 通过学习《华为HCIP精品课程笔记-wakin》,读者将能够全面了解和掌握HCIP认证所需的知识和技能。这些知识和技能不仅适用于工作中的网络工程师,也对于其他相关岗位的人员有很大的帮助。无论是对于初学者还是对于有一定经验的人来说,这本书都是一本非常实用的学习资料。强烈推荐给所有对网络工程感兴趣的人士。 ### 回答3: 华为HCIP精品课程笔记-Wakin是一份非常有价值的学习资料。这份笔记由华为公司的专业培训师Wakin编写,对于想要学习和提升HCIP认证的人来说,是一份非常实用的参考资料。 Wakin在这份笔记中,详细地介绍了HCIP的知识点和考试重点。他从网络基础、路由交换、安全技术、无线网络等多个方面入手,深入浅出地解释了每个知识点的概念和原理。在每个章节中,Wakin都给出了一些实际案例和实验,帮助我们更好地理解和应用所学内容。 此外,Wakin在笔记中还提供了一些学习方法和技巧。他建议我们在学习过程中,要注重实践,通过自己动手实验和配置设备来加深对知识的理解。他还推荐了一些学习资源和参考书籍,帮助我们更好地补充和扩展所学知识。 总的来说,华为HCIP精品课程笔记-Wakin非常全面且易于理解。无论是准备HCIP认证考试的人,还是想要进一步提升自己网络技术的人,都可以从中受益匪浅。我相信,只要认真学习并灵活运用这份笔记中的知识,就能够在网络领域中取得更好的成绩和发展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值