stata学习

逻辑回归算法梳理

2019-04-01  本文已影响0人  敬标

逻辑回归算法梳理

1、 逻辑回归的原理

逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。
Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)
回归模型中,y是一个定性变量,比如y=0或1,logistic方法主要应用于研究某些事件发生的概率

2、逻辑回归与线性回归的联系与区别

Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。
这一家族中的模型形式基本上都差不多,不同的就是因变量不同。这一家族中的模型形式基本上都差不多,不同的就是因变量不同。

Regression 常规步骤

构造预测函数h(x)

  1. Logistic函数(或称为Sigmoid函数),函数形式为:
    g(z) = \frac{1}{1+e^{-z}}
    [图片上传失败...(image-550932-1554128473925)]

构造损失函数J(m个样本,每个样本具有n个特征)

Cost函数和J函数如下,它们是基于最大似然估计推导得到的。
Cost(h_θ(x),y)= \begin{cases} -log(h_θ(x)), &if &y=1 \\ -log(1-h_θ(x)),&if &y=0 \end{cases}
J(θ) = \frac{1}{m}\sum_{i=1}^{m}Cost(h_θ(x_i),y_i)=-\frac1m[\sum_{i=1}^{m}(y_ilog(h_θ(x_i))+(1-y_i)log(h_θ(x_i))]

3、逻辑回归损失函数推导及优化

  1. 求代价函数
    概率的综合写法:
    P(y|x;\theta) = h_θ(x)^y(1-h_θ(x))^{1-y}
    取似然函数:
    L(θ) = \prod_{i=1}^{m}P(y_i|x_i;\theta) = \prod_{i=1}^{m}h_θ(x_i)^y_i(1-h_θ(x_i))^{1-y_i}
    取对数似然函数:
    l(θ) = log(L(θ))=\sum_{i=1}^{m}(y_ilog(h_θ(x_i))+(1-y_i)log(1-h_θ(x_i))
    最大似然估计就是求使l(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数。

在Andrew Ng的课程中将J(θ)取为下式,即
J(θ) = -\frac1ml(θ)

  1. 梯度下降法求解最小值:
    θ更新过程:
    θ_j := θ_j - \alpha \frac{\delta J(\theta)}{\delta \theta_j}
    \frac{\delta J(\theta)}{\delta \theta_j} = -\frac1m\sum_{i=1}^{m}[y_i \frac{1}{h_\theta(x_i)}\frac{\delta (h_\theta(x_i))}{\delta \theta_j} - (1 - y_i)\frac{1}{1-h_\theta(x_i)}\frac{\delta (h_\theta(x_i))}{\delta \theta_j}] \\ = -\frac 1 m \sum_{i=1}^{m}(y_i \frac{1}{g(θ^T x_i)}-(1-y_i) \frac 1 {1- g(θ^T x_i)})\frac{\delta (g(θ^T x_i))}{\delta \theta_j}\\ =-\frac 1 m \sum_{i=1}^{m}(y_i \frac{1}{g(θ^Tx_i)} - (1 - y_i)\frac{1}{1-g(θ^Tx_i)})g(θ^Tx_i)(1-g(θ^Tx_i))\frac{\delta (θ^Tx_i)}{\delta \theta_j}\\ =- \frac 1 m \sum_{i=1}^{m} (y_i (1- g(θ^T x_i) )- (1-y_i)g(θ^T x_i) )x^{j}_{i}\\ =-\frac 1 m \sum_{i=1}^{m}(y_i- g(θ^T x_i)) x^j_i\\ =-\frac 1 m \sum_{i=1}^{m}(h_θ(x_i) - y_i)x^j_i

θ的更新过程可以写成:
θ_j :=θ_j - \alpha \frac 1 m \sum_{i=1}^{m}(h_θ(x_i) - y_i)x^j_i

4、 正则化与模型评估指标

逻辑回归模型的损失函数进行正则化,在原来的损失函数的基础上加上正则项:
J(θ) =-\frac 1 m \sum_{i=1}^{m}(y_ilog(h_θ(x_i))+(1-y_i)log(1-h_θ(x_i)) + \frac \lambda {2m} \sum_{j=1}^{m} θ_j^2
上式中j≥1,因为θ_0没有参与正则化

θ的更新过程可以写成:
θ_j :=θ_j - \alpha[ \frac 1 m \sum_{i=1}^{m}(h_θ(x_i) - y_i)x^j_i +\frac \lambda {m} θ_j]

5、逻辑回归的优缺点

优点:
1)速度快,适合二分类问题
2)简单易于理解,直接看到各个特征的权重
3)能容易地更新模型吸收新的数据
缺点:
对数据和场景的适应能力有局限性,不如决策树算法适应性那么强

6、样本不均衡问题解决办法

参考:https://blog.csdn.net/heyongluoyao8/article/details/49408131
当你在对一个类别不均衡的数据集进行分类时得到了90%的准确度(Accuracy)。当你进一步分析发现,数据集的90%的样本是属于同一个类,并且分类器将所有的样本都分类为该类。在这种情况下,显然该分类器是无效的。并且这种无效是由于训练集中类别不均衡而导致的

八大解决方法

可以扩大数据集吗?

当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。

尝试其它评价指标

从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。如何对不同的问题选择有效的评价指标参见这里http://machinelearningmastery.com/classification-accuracy-is-not-enough-more-performance-measures-you-can-use/
  上面的超链接中的文章,讲述了如何对乳腺癌患者复发类别不均衡数据进行分类。在文中,推荐了几个比传统的准确度更有效的评价指标:

混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。

精确度(Precision)
召回率(Recall)
F1得分(F1 Score):精确度与找召回率的加权平均。
  特别是:

Kappa (Cohen kappa)
ROC曲线(ROC Curves):见Assessing and Comparing Classifier Performance with ROC Curves

对数据集进行重采样

可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。

尝试产生人工数据样本

一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。
  有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。
  这里有SMOTE算法的多个不同语言的实现版本:
Python: UnbalancedDataset模块提供了SMOTE算法的多种不同实现版本,以及多种重采样算法
R: DMwR package。
Weka: SMOTE supervised filter。

尝试不同的分类算法

强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
  决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。基于R编写的决策树参见这里。基于Python的Scikit-learn的CART使用参见这里。

尝试对模型进行惩罚

你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
  Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。
  如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵 。

尝试一个新的角度理解问题

我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。
  异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。
  变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。
  将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。

尝试创新

仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如:

7. sklearn参数

参考:https://blog.csdn.net/jark_/article/details/78342644

LogisticRegression,一共有14个参数:

参数说明如下:

总结:

优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。
缺点:容易欠拟合,分类精度可能不高。
其他:
Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法完成。
改进的一些最优化算法,比如sag。它可以在新数据到来时就完成参数更新,而不需要重新读取整个数据集来进行批量处理。
机器学习的一个重要问题就是如何处理缺失数据。这个问题没有标准答案,取决于实际应用中的需求。现有一些解决方案,每种方案都各有优缺点。
我们需要根据数据的情况,这是Sklearn的参数,以期达到更好的分类效果

上一篇 下一篇

猜你喜欢

热点阅读