一、逻辑回归原理
前面我们讲的线性回归模型是求输出特征向量Y和输入样本矩阵X之间的线性关系系数θ,从而拟合模型Y = Xθ。此时的Y是连续的,所以是回归模型。那么,考虑如果Y是离散的话,要怎么进行处理?此时可以通过映射函数G(Y)将Y映射为连续的值,并且规定在一定的实数范围内属于一个类别,另一个实数范围内属于另一个类别。逻辑回归就是从这一点出发的,其实质是一个分类问题。逻辑回归长被用于估计一个事物属于某个类别的概率。举个简单的例子,一封邮件是垃圾邮件的概率,如果这个概率大于50%,那么就可以认为它是属于垃圾邮件;反之,不是。下面我们考虑逻辑回归的数学原理。
对逻辑回归的考察可以从三个问题出发:(1)假设函数是什么 (2)损失函数是什么 (3)如何求最小化损失函数损,求得的参数是什么
首先解决假设函数的设置问题:根据前面我们了解到逻辑回归返回的是样本属于某一类别的概率,而线性回归是直接返回的预测结果。对于二分类问题,此时的线性回归可以作为逻辑回归的输入,被看做逻辑回归的线性边界,逻辑回归通过一个逻辑函数将经过映射处理得到的结果根据线性边界分为两类。线性边界的函数可以表示为:
假设函数可以选择为单位阶跃函数,但是由于其不满足单调可微的性质,因此,不能直接作为映射函数G。我们这里构造假设函数为sigmoid函数:
这个函数的图像如下:
Sigmoid 函数是一个 S 形曲线,它可以将任意实数值映射到介于 0 和 1 之间的值,但并不会取到 0/1。然后使用阈值分类器将 0 和 1 之间的值转换为 0 或 1。用图像描述 logistic 回归得出预测所需的所有步骤:
来源:http://m.elecfans.com/article/691754.html
之所以采用这个假设函数主要原因是:通过观察图形我们可以发现sigmoid函数有一个很好的性质:即当z趋于正无穷时,g(z)趋于1,而当z趋于负无穷时,g(z)趋于0,这非常适合于分类概率模型;此外,它还有一个很好的导数性质,即g'(z) = g(z)(1-g(z))
下面考虑损失函数:
前面我们介绍了线性回归的损失函数是用模型误差的平方和定义的。但是,由于逻辑回归不是连续的,所以在这里这个定义并不适用。假设我们的样本输出是0或1两类。这里,hθ(x)表示为结果取1的概率,有:
又因为样本之间相互独立,那么其联合分布为各个边缘分布的乘积,从而得到似然函数的表达式为:
为了方便求解,我们队上式两边同时取对数,化简后结果为:
最大似然估计的目标是求似然函数 L(θ),即所有样本出现的总概率)最大时,对应的参数 θ 的组合,而我们希望构造一个代价函数来衡量我们在某组参数下预估的结果和实际结果的差距,当代价函数值最小的时候,相应的参数w就是我们希望的最优解,
即求 J( θ) = -L(θ)的最小值。
因此,我们的损失函数可以构造为如下形式:
加上-1/m,求解 J(θ)的最小值,也就是求解似然函数的最大值,主要是为了后面运用梯度下降法求解参数。
最后我们考虑损失函数的优化问题:
这里我们可以使用梯度下降法进行求解,梯度下降法是调整参数θ的组合,使得代价函数取最小值。在求解时,我们为了找到最小值,可以分为两个步骤进行:
(1)找到下降速度最快的方向(求导数/偏导数)
(2)朝这个方向迈进一小步,再重复步骤(1)(2),直至最低点
按照上面两个步骤得到参数的更新形式:
多元的逻辑回归与二元很大程度上是相似的。多元的回归模型如下:
其参数估计方法类似于二元的逻辑回归。这里就不再进行赘述了。
讲了这么多逻辑回归的推理,那么逻辑回归在实践中到底有什么优缺点呢?
优点:简单、通俗易懂,不需要对特征进行缩放、能输出较好的预测概率、容易实现,训练效率高、不仅能预测出类别,还能得到近似概率的预测,对许多需要利用概率辅助决策的任务很有用
缺点:我们不能用 logistic 回归来解决非线性问题,比如异或问题,因为它的决策面是线性的、它高度依赖正确的数据表示、只能预测分类结果、容易过拟合、如果特征离远点较远,Sigmoid梯度将变得很小,参数就很难得到更新
参考:https://zhuanlan.zhihu.com/p/29691293
http://www.cnblogs.com/pinard/p/6029432.html代码地址
二、正则化
过拟合问题在进行模型拟合时总是会存在,逻辑回归也不例外,解决过拟合的办法之一就是正则化。常见的正则化方法有L1正则化、L2正则化
二元逻辑回归正则 化实质就是在损失函数后面增加了l1范数或者l2范数作为惩罚项。l1范数惩罚项前面的系数α的作用是调节惩罚项的大小,控制模型复杂度。
矩阵形式表示二元回归的L1正则化损失函数表达式如下:
L2正则化损失函数表达式为:
三、模型的评估指标
机器学习算法包括分类、回归、聚类等,针对不同的模型其模型评估指标也不同。下面对模型的评估指标进行系统总结。
分类算法:
比较常见的分类算法有:逻辑回归、决策树、朴素贝叶斯、SVM、神经网络等,这些模型的评估指标有:
(1)针对二分类
混淆矩阵:准确率A(预测正确个数占总数的比例)、精准率P(正例样本中有多少被预测正确了)、召回率R(预测的正例样本中有多少是正确的)、F1 Score(2P*R/(P+R))
ROC曲线:ROC曲线应尽量偏离参考线,越靠近左上越好
AUC:ROC曲线下面积,参考线面积为0.5,AUC应大于0.5,且偏离越多越好
(2)多分类
多分类一般采用准确率作为评估指标
回归算法:
常见的回归算法包括:线性回归、多项式回归、Lasso回归、岭回归、弹性网络、SVM、神经网络,模型的评估指标有:
MSE:均方误差,SSE/m,值越小代表拟合效果越好,用来衡量不同模型对于同一数据集的拟合效果
R2:决定系数,1-SSE/SST,用于度量模型的解释能力,是相关系数的平方,取值范围为0~1,越接近1表示模型参考价值越高,在scikit-learn中LinearRegression.score就是使用的决定系数,也可以使用专门的库metrics.r2_score
聚类算法:
常见的聚类算法有:KMeans、密度聚类、层次聚类等,主要从簇内的稠密成都和簇间的离散程度来评估聚类的效果,评估指标有:
轮廓系数 Silhouette Corfficient:轮廓系数由凝聚度和分离度共同构成,组内SSE越小,组间SSB越大,聚类效果越好,轮廓系数在-1~1之间,值越大,聚类效果越好
协方差系数 Calinski-Harabaz Index:类别内部数据协方差越小越好,类别之间协方差越大越好,这样协方差系数会越高。
来源:http://www.cnblogs.com/dearL/p/9484728.html
https://vinking934296.iteye.com/blog/2329567
三、样本不均衡的处理方法
现实生活中,我们遇见的数据集通常都是不均衡的,而样本数据集的均衡性对模型预测的准确性会产生极大的影响,比如:我们在做地震预测的时候,我们手里的数据经常都是不发生地震的样本居多,而发生地震只占少量样本,此时如果不对数据做处理,直接用于预测,那么结果很可能会带来极大的灾难。因此在建模之前保证样本的均衡是十分有必要的。针对样本的非均衡性主要解决方式有以下几种:
(1)通过采样,生成均衡的样本
欠采样:只从多数类中随机选择其中一些数据,而使用少数类所具有的示例数据。这个选择可以用来保持类的概率分布。这是很容易的!我们仅仅靠减少示例样本就平衡了我们的数据!;或者尽量避免选择临近对方的样本,这种欠采样基于相邻、聚类等方法进行
过采样:将给少数类创建数个副本,以便少数类和多数类相同的示例数量。副本的数量要达到使少数类对准确率的影响可以一直维持。我们只是在没有获得更多数据的情况下整理了我们的数据集!如果发现很难有效地设置类权重,那么抽样可以替代类平衡。
用图像表示如下:
其中SMOTE是比较经典的过采样方法:首先随机选择一个少数样本点,找到它在少数样本中的最近邻点,然后再从最近邻中随机标记一个点,然后线性插值上面两个点,生成SOMTE点。
(2)调整算法,允许算法改变权重
思想:通过改变每个训练样本在计算损失时的权重来平衡我们的数据。例如:购买房子,不买的比买的要多,但购买类的准确率对我们来说最重要,那么该类中的训练示例应该对损失函数有显著的影响。那么,我们可以简单地通过将每个示例的损失乘以取决于它们的类的某个因子来给类赋权,即在模型中设置一个class_weight变量,其值为{‘buy’:0.75,’don’t buy’:0.25}。尝试使用权重平衡法来使所有的类都对我们的损失函数产生一样大的影响,而不必花费时间和资源去收集更多的少数类实例。
(3)采用集成学习思想,将主要的类进行横向划分,形成小的均衡样本集群
集成学习的基本思想就是把多数样本进行划分,然后和少数样本组合成小的训练集, 然后生成学习器, 最后再集成。例如经典的easyembedding,balancecascade就是经典的代表。
参考:https://zhuanlan.zhihu.com/p/34782497
四、sklearn参数介绍
(1)正则化选择参数: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’并没有这个依赖。
(2)优化算法选择参数:solver
solver参数决定了我们对逻辑回归损失函数的优化方法,有4种算法可以选择,分别是:
liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化
(3)分类方式选择参数:multi_class
multi_class参数决定了我们分类方式的选择,有 ovr和multinomial两个值可以选择,默认是 ovr。
ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
vR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推
而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。
(4):类型权重参数:class_weight
lass_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
(5)样本权重参数:sample_weight
由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。在scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight.
来源:https://www.cnblogs.com/pinard/p/6035872.html