sklearn中逻辑回归模型参数释义

 

在scikit-learn中,与逻辑回归有关的主要是这3个类。LogisticRegression, LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证,以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。

  logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择的时候。一般情况用不到这个类,所以后面不再讲述logistic_regression_path类。

  此外,scikit-learn里面有个容易让人误解的类RandomizedLogisticRegression,虽然名字里有逻辑回归的词,但是主要是用L1正则化的逻辑回归来做特征选择的,属于维度规约的算法类,不属于我们常说的分类算法的范畴。

LogisticRegression和LogisticRegressionCV中的一些参数的意义在这两个类中都是一样的,且比较重要。包括:(penalty,solver,multi_class,class_weight

 

函数调用形式

LogisticRegression(penalty='l2',dual=False,tol=1e-4,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)

 

参数:

  1. Penalty

字符串型,’l1’ or ‘l2’,默认:’l2’;正则化类型。'newton-cg','sag'和'lbfgs'解算器仅支持l2处罚。

 LogisticRegressionLogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为"l1""l2".分别对应L1的正则化和L2的正则化,默认是L2的正则化。

    在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。

    penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penaltyL1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。

  1. dual

布尔型,默认:False。当样本数>特征数时,令dual=False;用于liblinear解决器中L2正则化。

  1. tol

浮点型,默认:1e-4;迭代终止判断的误差范围。

  1. C

浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。

  1. fit_intercept

布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。

  1. intercept_scaling

浮点型,默认为1;仅仅当solver是”liblinear”时有用。

  1. class_weight(类型权重参数)

默认为None;与“{class_label: weight}”形式中的类相关联的权重。如果不给,则所有的类的权重都应该是1。

 class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%

    如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。

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

    第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。

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

    提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。

  1. random_state

整型,默认None;当“solver”==“sag”或“liblinear”时使用。在变换数据时使用的伪随机数生成器的种子。如果是整数, random_state为随机数生成器使用的种子;若为RandomState实例,则random_state为随机数生成器;如果没有,随机数生成器就是' np.random '使用的RandomState实例。

  1. solver

{'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},默认: 'liblinear';用于优化问题的算法。

对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快。

对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。

solver参数决定了我们对逻辑回归损失函数的优化方法,有4种算法可以选择,分别是:

    a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。

    b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

    c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

    d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。

 

    从上面的描述可以看出,newton-cg, lbfgssag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。

    同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。

    从上面的描述,大家可能觉得,既然newton-cg, lbfgssag这么多限制,如果不是大样本,我们选择liblinear不就行了嘛!错,因为liblinear也有自己的弱点!我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。郁闷的是liblinear只支持OvR,不支持MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。

  1. max_iter

最大迭代次数,整型,默认是100;

  1. multi_class

字符串型,{ovr', 'multinomial'},默认:'ovr';如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。对liblinear solver无效。

multi_class参数决定了我们分类方式的选择,有 ovrmultinomial两个值可以选择,默认是 ovr

    ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归,ovrmultinomial并没有任何区别,区别主要在多元逻辑回归上。

    OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。

    而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。

    从上面的描述可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。

    如果选择了ovr,则4种损失函数的优化方法liblinearnewton-cg, lbfgssag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgssag了。

  1. verbose

整型,默认是0;对于liblinear和lbfgs solver,verbose可以设为任意正数。

  1. warm_start

布尔型,默认为False;当设置为True时,重用前一个调用的解决方案以适合初始化。否则,只擦除前一个解决方案。对liblinear解码器无效。

  1. n_jobs

整型,默认是1;如果multi_class='ovr' ,则为在类上并行时使用的CPU核数。无论是否指定了multi_class,当将' solver ' '设置为'liblinear'时,将忽略此参数。如果给定值为-1,则使用所有核。

  1. sample_weight(样本权重参数)

  之前我们提到了样本不失衡的问题,由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。

注意:在scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight.

 

属性

  1. classes_ : array,shape(n_classes,)

分类器已知的类标签列表。

  1. coef_ : array,shape(1,n_features)或(n_classes,n_features)

决策函数中的特征系数。

coef_是形状(1,n_features)当给定的问题是二进制的。特别地,当multi_class ='multinomial'时,coef_对应于结果1(True)并且-coef_对应于结果0(False)。

  1. intercept_ : array,shape(1,)或(n_classes,)

拦截(又名偏见)被添加到决策功能中。

如果fit_intercept设置为False,则截距设置为零。 当给定问题是二进制时,intercept_具有形状(1,)。特别是,当multi_class ='multinomial'时,intercept_ 对应于结果1(True),- intercept_对应于结果0(False)。

  1. n_iter_ : 数组,形状(n_classes,)或(1,)

所有类的实际迭代次数。如果是二进制或多项式,则只返回1个元素。对于liblinear解算器,仅给出了所有类的最大迭代次数。

版本0.20更改:在SciPy <= 1.0.0中,lbfgs迭代次数可能超过 max_iter。n_iter_现在最多报告max_iter。

 

方法

decision_functionX

预测样本的置信度分数。

densify()

将系数矩阵转换为密集阵列格式。

fitXy [sample_weight]

根据给定的训练数据拟合模型。

get_params[]

获取此估算工具的参数。

predictX

预测X中样本的类标签。

predict_log_probaX

记录概率估计。

predict_probaX

概率估计。

scoreXy [sample_weight]

返回给定测试数据和标签的平均精度。

set_params** PARAMS

设置此估算器的参数。

sparsify()

将系数矩阵转换为稀疏格式。

 

参考链接:

(1)https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.get_params

(2)https://blog.csdn.net/qq_38683692/article/details/82533460?utm_source=blogxgwz1

(3)https://www.cnblogs.com/pinard/p/6035872.html

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值