逻辑回归全面解析

在 scikit-learn 中,逻辑回归的类主要是 LogisticRegression 和 LogisticRegressionCV。两者主要区别是 LogisticRegressionCV 使用了交叉验证来选择正则化系数 C;而 LogisticRegression 需要自己每次指定一个正则化系数。

除了交叉验证,以及选择正则化系数 C 以外,两者的使用方法基本相同。

参数
sklearn 的 lr 主要的参数设置在 LogisticRegression 构造函数和 fit 拟合函数。

solver
solver 是 LogisticRegression 构造函数的参数,用它来指定逻辑回归损失函数的优化方法,可选项如下:

newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵,即海森矩阵来迭代优化损失函数。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵,即海森矩阵来迭代优化损失函数。
liblinear:使用了开源的 liblinear 库实现,内部使用了坐标轴下降法来迭代优化损失函数。
sag:即随机平均梯度下降(stochastic average gradient descent),是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。该优化算法是 2013 年,Mark Schmidt、Nicolas Le Roux 和 Francis Bach 三人在法国国家信息与自动化研究所(INRIA)技术报中发表的论文《Minimizing finite sums with the stochastic average gradient》。
saga:优化的,无偏估计的 sag 方法,它是 2014 年由 Aaron Defazio、Francis Bach 和 Simon Lacoste-Julien 发表的论文《SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives》。
对于少量的样本数据,‘liblinear’ 是很好的选择,而 ‘sag’ 和 ‘saga’ 对大量样本训练速度更快。
对于多分类问题,只有 ‘newton-cg’、‘sag’、‘saga’ 和 ‘lbfgs’ 能够处理多项损失,而 ‘liblinear’ 面对多分类问题,得先把一种类别作为一个类别,剩余的所有类别作为另外一个类别。依次类推,遍历所有类别,进行分类。

‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持正则(penalty)参数 l2 和 none。

‘liblinear’ 和 ‘saga’ 支持正则(penalty)参数 l1。

从 0.22 版本开始 solver 的默认值从 ‘liblinear’ 改为 ‘lbfgs’。

penalty
penalty 是 LogisticRegression 构造函数的参数,它是正则惩罚参数,可选项如下:

l1:‘liblinear’ 和 ‘saga’ 支持 l1。
l2:‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持 l2。
elasticnet:‘saga’ 支持 elasticnet。
none:‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持正则参数设定 none。
默认值为 l2。

        newton-cg、lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化,而liblinear通吃L1正则化和L2正则化。

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

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

dual
dual 是 LogisticRegression 构造函数的参数,是否选择对偶,是一个布尔类型,默认为 False;dual 只适用于正则化项为 l2 的 ‘liblinear’ 的情况,通常样本数大于特征数的情况下。

tol
tol 是 LogisticRegression 构造函数的参数,表示停止迭代求解的阈值。

该参数是浮点类型(float),默认为 1e-4,即 0.0001。
C
C 是 LogisticRegression 构造函数的参数,正则化系数的倒数,必须为正的浮点数,默认为 1.0,这个值越小,说明正则化效果越强。换句话说,这个值越小,越训练的模型更泛化,但也更容易欠拟合。

fit_intercept
fit_intercept 是 LogisticRegression 构造函数的参数,表示是否在拟合样本时保留截距,布尔类型,默认为 True。

intercept_scaling
intercept_scaling 是 LogisticRegression 构造函数的参数,它是给特征向量添加的一个常量,比如原本的向量是 [x],那么添加后就变成 [x, intercept_scaling];这个参数仅在 solver 参数为 liblinear,fit_intercept 参数为 True 的时候生效。该参数是浮点类型(float),默认值为 1.0。

class_weight
class_weight 是 LogisticRegression 构造函数的参数,顾名思义它指定分类的权重。参数支持的类型有字典(dict)或字符串值 ‘balanced’,默认值为 None。
如果不指定该参数,即 None,表示不对样本做任何处理,也就是对所有样本都有相同的权重。
class_weight 为 balanced 时,样本权重会根据分类样本比例进行自适应,具体权重公式为 n_samples / (n_classes * np.bincount(y)),其中 bincount 函数是对各个 label 的样本个数计数。

random_state
random_state 是 LogisticRegression 构造函数的参数,设置随机数种子。

参数支持的类型有 int 或 RandomState 实例对象,默认值为 None。
该参数只有当 solver 为 sag、saga 或 liblinear 时生效。当设置固定的随机种子时,才会可以每次训练得到相同的结果(可以复现),否则,随机梯度下降优化算法每次训练结果都会有所不同。

max_iter
max_iter 是 LogisticRegression 构造函数的参数,设置最大的迭代次数。

该参数类型为 int,默认为 100。

multi_class
multi_class 是 LogisticRegression 构造函数的参数,该参数决定分类方式的选择。

参数可选项为 {‘auto’, ‘ovr’, ‘multinomial’},默认为 ‘auto’。
‘ovr’ 指的是 one-vs-rest,这种就是用二分类的方法解决多分类的问题;如要分类为 A,B,C 三类,那么就可以把 A 当作正向数据,B 和 C 当作负向数据来处理。
‘multinomial’ 指的是 many-vs-many,它会选择一部分类别的样本和另一部分类别的样本来做逻辑回归二分类;如要分类为 A,B,C 三类,将 A,B 作为正向数据,C 作为负向数据,训练出一个分模型,再将 A,C 作为正向数据,B 作为负向数据,训练出一个分类模型,最后 B,C 作为正向数据,C 作为负向数据,训练出一个模型,通过这三个模型就能实现多分类。
‘auto’ 顾名思义根据实际情况,自动选择,它主要依据 solver 参数来决定,具体可以看源码的 _check_multi_class 函数,逻辑为如果 solver 为 liblinear,multi_class 为 ovr,如果分类类别大于 2,multi_class 为 multinomial,否则为 ovr。
 

from sklearn.linear_model import LogisticRegressio
for solver in ['sag', 'newton-cg', 'lbfgs']:
    for C in [0.001, 0.01, 0.1, 1, 10, 100]:
        clf = LogisticRegression(C=C, solver=solver, max_iter=1024, n_jobs=6, class_weight='balanced')
        clf.fit(x_train, y_train)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值