逻辑回归
⼀、逻辑回归原理
  前⾯我们讲的线性回归模型是求输出特征向量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 回归得出预测所需的所有步骤:
  之所以采⽤这个假设函数主要原因是:通过观察图形我们可以发现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梯度将变得很⼩,参数就很难得到更新
⼆、正则化
  过拟合问题在进⾏模型拟合时总是会存在,逻辑回归也不例外,解决过拟合的办法之⼀就是正则化。常见的正则化⽅法有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:类别内部数据协⽅差越⼩越好,类别之间协⽅差越⼤越好,这样协⽅差系数会越⾼。
三、样本不均衡的处理⽅法
  现实⽣活中,我们遇见的数据集通常都是不均衡的,⽽样本数据集的均衡性对模型预测的准确性会产⽣极⼤的影响,⽐如:我们在做地震预测的时候,我们⼿⾥的数据经常都是不发⽣地震的样本居多,⽽发⽣地震只占少量样本,此时如果不对数据做处理,直接⽤于预测,那么结果很可能会带来极⼤的灾难。因此在建模之前保证样本的均衡是⼗分有必要的。针对样本的⾮均衡性主要解决⽅式有以下⼏种:
(1)通过采样,⽣成均衡的样本
  ⽋采样:只从多数类中随机选择其中⼀些数据,⽽使⽤少数类所具有的⽰例数据。这个选择可以⽤来保持类的概率分布。这是很容易的!我们仅仅靠减少⽰例样本就平衡了我们的数据!;或者尽量避免选择临近对⽅的样本,这种⽋采样基于相邻、聚类等⽅法进⾏
  过采样:将给少数类创建数个副本,以便少数类和多数类相同的⽰例数量。副本的数量要达到使少数类对准确率的影响可以⼀直维持。我们只是在没有获得更多数据的情况下整理了我们的数据集!如果发现很难有效地设置类权重,那么抽样可以替代类平衡。
  ⽤图像表⽰如下:
  其中SMOTE是⽐较经典的过采样⽅法:⾸先随机选择⼀个少数样本点,到它在少数样本中的最近邻点,然后再从最近邻中随机标记⼀个点,然后线性插值上⾯两个点,⽣成SOMTE点。
(2)调整算法,允许算法改变权重
  思想:通过改变每个训练样本在计算损失时的权重来平衡我们的数据。例如:购买房⼦,不买的⽐买的要多,但购买类的准确率对我们来说最重要,那么该类中的训练⽰例应该对损失函数有显著的影响。那么,我们可以简单地通过将每个⽰例的损失乘以取决于它们的类的某个因⼦来给类赋权,即在模型中设置⼀个class_weight变量,其值为{‘buy’:0.75,’don’t buy’:0.25}。尝试使⽤权重平衡法来使所有的类都对我们的损失函数产⽣⼀样⼤的影响,⽽不必花费时间和资源去收集更多的少数类实例。
(3)采⽤集成学习思想,将主要的类进⾏横向划分,形成⼩的均衡样本集
  集成学习的基本思想就是把多数样本进⾏划分,然后和少数样本组合成⼩的训练集,然后⽣成学习器,最后再集成。例如经典的easyembedding,balancecascade就是经典的代表。
四、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.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。