logistics回归和softmax

之前讨论的几个算法,kNN,决策树和朴素贝叶斯分类,建立模型中没有参数优化的过程。kNN只有测试过程,决策树有建立模型的过程,但是模型中的参数是根据数据直接计算,没有经过优化。朴素贝叶斯的参数也是根据先验分布和数据计算的。而这里介绍的logistics回归,首先初始化参数,然后采用一定的方式优化参数,达到目标最小。

logistics回归

逻辑回归是从线性回归而来,是一种二元分类器。当目标值是连续时,使用线性回归可以预测目标值,但是当目标值是离散的,比如 {0,1} ,需要在线性回归的结果上加一个函数,使结果和离散目标值的形式接近。这个函数是sigmoid函数,为什么选择这个函数呢,稍后再讲。

在logistIc回归中,主要计算两个值

P(y=1|x;θ) P(y=0|x;θ) 。这个和朴素贝叶斯一样。但朴素贝叶斯是生成模型,其中的参数时根据先验分布和数据一次性求得,没有经过迭代优化。logistics回归是判别模型,直接求出上面两个结果,而且其中的参数是在目标函数最小的情况下优化得到的。

有了sigmoid函数和logistics回归的目标值,我们假设

P(y=1|x;θ)=hθ(x)=11+exp(θTx)

P(y=0|x;θ)=1hθ(x)=111+exp(θTx)

利用对数似然估计,得到目标函数为

L(θ)=i=1n[yiloghθ(xi)+(1yi)log(1hθ(xi))]

其中n是样本个数。上式的意义在于,给定参数 θ ,根据样本的标签计算类别概率,然后取对数相加。上式也是交叉熵的一种体现,而且通过优化参数,使得类别标签的熵最大。

如何找到最优的参数?只需解决一下优化问题即可:

mimθL(θ)=minθi=1n[yiloghθ(xi)+(1yi)log(1hθ(xi))]

这里利用梯度下降算法。求 L(θ) 关于 θ 的导数得到

θJ(θ)=X(Yhθ(X))

其中X是训练数据, XR(m+1)n ,,每一类是一个样本。Y是标签取值 {0,1} 的列向量, hθ(X)=XTθ θRm+1

根据梯度下降法, θ:=θαX(Yhθ(X)) ,直到达到最大训练次数或误差小于阈值。

softmax回归

Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签 \textstyle y 可以取两个以上的值。对于训练集 {(x(1),y(1)),,(x(m),y(m))} 我们有 y(i)1,2,,k,k2

按照逻辑回归的思路,我们主要求的是样本x在参数下对每一类的分类概率,即

P(y=1|x;θ)=exp(θT1x)kj=1exp(θTjx)

P(y=2|x;θ)=exp(θT2x)kj=1exp(θTjx)

P(y=k|x;θ)=exp(θTkx)kj=1exp(θTjx)

其中 θRk(m+1) ,上述式子中的k个参数向量的转置作为参数矩阵的行。

等式为什么成立呢?从logistics回归来看,

P(y=0|x;θ)=1hθ(x)=exp(θTx)1+exp(θTx)=11+exp(θTx)

P(y=1|x;θ)=11+exp(θTx)=exp(θTx)1+exp(θTx)

从上面两个式子可以看出,分母一样,是两个值中分子的和,是归一化的操作。第二个式子的形式和softmax中的形式一样,第一个式子中取 θ=0 ,之后解释为什么取0。所以softmax和logistics回归的像是一样,而且都是先计算再归一化。

接下来是代价函数

J(θ)=i=1nj=1k(I{yi=j}logP(yi=j|xi;θ))

上式可解释为:给定参数 θ ,根据样本所属的类别j,计算属于该类的概率,取对数,然后所有样本的结果相加。这个和logistics的形式完全一致。

如何优化参数,可以用梯度下降等算法。但是这里有一个问题,就是参数的冗余,参数矩阵中每一行减去一个值,得到的概率不变。所以在优化参数时,不同的参数得到的代价函数的值是一样的。所以在计算时,将 θ1==0 ,来固定参数,这也是为什么在logistics中 P(y=0|x;θ) 中的参数设置为0.

还有另外一个方法可以解决参数冗余的问题。在代价函数中加入对参数的正则化。

J(θ)=i=1nj=1k(I{yi=j}logP(yi=j|xi;θ))+λ2i=1kj=0mθij

softmax回归和k个二元分类器

如果你在开发一个音乐分类的应用,需要对k种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立 k 个独立的二元分类器呢?

这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数 k = 4 的softmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数 k 设为5。)

如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用4个二分类的 logistic 回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。

现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。(i) 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmax回归还是 3个logistic 回归分类器呢? (ii) 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmax 回归还是多个 logistic 回归分类器呢?

在第一个例子中,三个类别是互斥的,因此更适于选择softmax回归分类器 。而在第二个例子中,建立三个独立的 logistic回归分类器更加合适。

为什么要用sigmoid函数

前面两节主要讲了logistics回归和maxsoft回归中类别如何度量,根据极大似然估计得到的目标函数以及如何得到最优的参数。那么在最开始的概率度量中,为什么要使用sigmoid函数呢?sigmoid函数有什么好处?

根据指数分布族和广义线性模型,当目标服从伯努利分布时,使用sigmoid函数;当目标服从高斯分布时,使用线性函数;当目标服从多项式分布时,使用的函数是softmax中的函数。

所以选择什么函数得到给定参数下样本属于哪一类的概率,是根据目标的分布来判断的。
同时如果线性回归的模型为 y=θTx 的话,logistic回归的模型使 logϕ1ϕ=θTx ,其中 ϕ=P(y=1|x) 。可以理解为在logistic中输出 y=1 的对数几率是 x <script type="math/tex" id="MathJax-Element-253">x</script>的线性模型。

sklearn

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

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

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

后面的讲解主要围绕LogisticRegression和LogisticRegressionCV中的重要参数的选择来来展开,这些参数的意义在这两个类中都是一样的。

正则化选择参数:penalty

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

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

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

具体使用了这4个算法有什么不同以及有什么影响我们下一节讲。

优化算法选择参数:solver

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

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

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

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

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

从上面的描述可以看出,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正则化了。

具体OvR和MvM有什么不同我们下一节讲。

分类方式选择参数: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相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。

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

类型权重参数: class_weight

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

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

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

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

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

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

当然,对于第二种样本失衡的情况,我们还可以考虑用下一节讲到的样本权重参数: sample_weight,而不使用class_weight。sample_weight在下一节讲。

样本权重参数: sample_weight

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

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

以上就是scikit-learn中逻辑回归类库调参的一个小结,还有些参数比如正则化参数C(交叉验证就是 Cs),迭代次数max_iter等,由于和其它的算法类库并没有特别不同,这里不多累述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值