常见面试算法:Logistic回归、树回归

  • 2019 年 10 月 28 日
  • 筆記

Logistic 回归 概述

Logistic 回归 或者叫逻辑回归 虽然名字有回归,但是它是用来做分类的。其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式,以此进行分类。

须知概念

Sigmoid 函数

回归 概念

假设现在有一些数据点,我们用一条直线对这些点进行拟合(这条直线称为最佳拟合直线),这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方程,那么我们根据这个回归方程,怎么进行分类呢?请看下面。

二值型输出分类函数

我们想要的函数应该是: 能接受所有的输入然后预测出类别。例如,在两个类的情况下,上述函数输出 0 或 1.或许你之前接触过具有这种性质的函数,该函数称为 海维塞得阶跃函数(Heaviside step function),或者直接称为 单位阶跃函数。然而,海维塞得阶跃函数的问题在于: 该函数在跳跃点上从 0 瞬间跳跃到 1,这个瞬间跳跃过程有时很难处理。幸好,另一个函数也有类似的性质(可以输出 0 或者 1 的性质),且数学上更易处理,这就是 Sigmoid 函数。 Sigmoid 函数具体的计算公式如下:

上图表示参数 θ 与误差函数 J(θ) 的关系图 (这里的误差函数是损失函数,所以我们要最小化损失函数),红色的部分是表示 J(θ) 有着比较高的取值,我们需要的是,能够让 J(θ) 的值尽量的低。也就是深蓝色的部分。θ0,θ1 表示 θ 向量的两个维度(此处的θ0,θ1是x0和x1的系数,也对应的是上文w0和w1)。

可能梯度下降的最终点并非是全局最小点,可能是一个局部最小点,如我们上图中的右边的梯度下降曲线,描述的是最终到达一个局部最小点,这是我们重新选择了一个初始点得到的。

看来我们这个算法将会在很大的程度上被初始点的选择影响而陷入局部最小点。

Logistic 回归 原理

Logistic 回归 工作原理

每个回归系数初始化为 1  重复 R 次:     计算整个数据集的梯度     使用 步长 x 梯度 更新回归系数的向量  返回回归系数

Logistic 回归 开发流程

收集数据: 采用任意方法收集数据  准备数据: 由于需要进行距离计算,因此要求数据类型为数值型。另外,  结构化数据格式则最佳。  分析数据: 采用任意方法对数据进行分析。  训练算法: 大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。  测试算法: 一旦训练步骤完成,分类将会很快。  使用算法: 首先,我们需要输入一些数据,并将其转换成对应的结构化数值;接着,  基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。

Logistic 回归 算法特点

优点: 计算代价不高,易于理解和实现。  缺点: 容易欠拟合,分类精度可能不高。  适用数据类型: 数值型和标称型数据。

附加 方向导数与梯度

Logistic 回归 项目案例

项目案例1: 使用 Logistic 回归在简单数据集上的分类

完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/5.Logistic/logistic.py

项目概述

在一个简单的数据集上,采用梯度上升法找到 Logistic 回归分类器在此数据集上的最佳回归系数

开发流程

收集数据: 可以使用任何方法  准备数据: 由于需要进行距离计算,因此要求数据类型为数值型。另外,  结构化数据格式则最佳  分析数据: 画出决策边界  训练算法: 使用梯度上升找到最佳参数  测试算法: 使用 Logistic 回归进行分类  使用算法: 对简单数据集中数据进行分类

收集数据: 可以使用任何方法

我们采用存储在 TestSet.txt 文本文件中的数据,存储格式如下:

可参考http://blog.csdn.net/achuo/article/details/51160101

项目案例2: 从疝气病症预测病马的死亡率

完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/5.Logistic/logistic.py

项目概述

使用 Logistic 回归来预测患有疝病的马的存活问题。疝病是描述马胃肠痛的术语。然而,这种病不一定源自马的胃肠问题,其他问题也可能引发马疝病。这个数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。

开发流程

收集数据: 给定数据文件  准备数据: 用 Python 解析文本文件并填充缺失值  分析数据: 可视化并观察数据  训练算法: 使用优化算法,找到最佳的系数  测试算法: 为了量化回归的效果,需要观察错误率。根据错误率决定是否回退到训练阶段,          通过改变迭代的次数和步长的参数来得到更好的回归系数  使用算法: 实现一个简单的命令行程序来收集马的症状并输出预测结果并非难事,          这可以作为留给大家的一道习题

收集数据: 给定数据文件

病马的训练数据已经给出来了,如下形式存储在文本文件中:

额外内容(可选读)

在上文中,当Sigmoid函数大于 0.5 的数据被分入 1 类,小于 0.5 即被归入 0 类。其实0.5也是可以改动的。 比如大于 0.9 的数据被分入 1 类,小于 0.9 即被归入 0 类。

Logistic回归 和 最大熵模型

Logistic回归和最大熵模型 都属于对数线性模型 (log linear model)。 当类标签(class label)只有两个的时候,最大熵模型就是 logistic 回归模型。 学习它们的模型一般采用极大似然估计或者正则化的极大似然估计。Logistic 回归和最大熵模型学习可以形式化为无约束最优化问题。(关于最大熵模型,可以阅读《统计学习方法》 第六章。)

其他算法

除了梯度下降,随机梯度下降,还有Conjugate Gradient,BFGS,L-BFGS,他们不需要指定alpha值(步长),而且比梯度下降更快,在现实中应用的也比较多。 当然这些算法相比随机梯度要复杂。

综上这些算法都有一个共通的缺点就是他们都是不断去逼近真实值,永远只是一个真实值的近似值而已。

多标签分类

逻辑回归也可以用作于多标签分类。 思路如下:

假设我们标签A中有a0,a1,a2….an个标签,对于每个标签 ai (ai 是标签A之一),我们训练一个逻辑回归分类器。

即,训练该标签的逻辑回归分类器的时候,将ai看作一类标签,非ai的所有标签看作一类标签。那么相当于整个数据集里面只有两类标签:ai 和其他。

剩下步骤就跟我们训练正常的逻辑回归分类器一样了。

测试数据的时候,将查询点套用在每个逻辑回归分类器中的Sigmoid 函数,取值最高的对应标签为查询点的标签。

https://github.com/apachecn/AiLearning/blob/dev/blog/ml/5.Logistic%E5%9B%9E%E5%BD%92.md