线性回归算法模型与线性分类算法模型联系与区别初探

1. 线性算法模型

0x1:线性回归和线性分类中的“线性”指的是什么

线性(linear),指量与量之间按比例、成直线的关系,在数学上可以理解为一阶导数为常数的函数;
非线性(non-linear)则指不按比例、不成直线的关系,一阶导数不为常数

0x2:从输入输出角度看"回归"和"分类"的区别

线性分类问题和线性回归问题都要根据训练样本训练出一个实值函数g(x),g(x)也叫映射函数

1. 回归模型: 给定一个新的输入特征, 推断它所对应的输出y(连续值实值)是多少, 也就是使用y=g(x)来推断任一输入x所对应的输出值。
注意: 如果我们将回归模型(regression model)的连续输出进行离散化,虽然看起来得到了有限个离散类别,但其本质还是回归模型,只是对输出做了特殊处理

2. 分类模型: 给定一个新的输入特征, 推断它所对应的类别(大多数情况是二分类如: +1, -1,也可以基于二分类扩展出多分类), 也就是使用y=sign(g(x))来推断任一输入x所对应的类别.
注意: 模型的输出结果类别是有限的

0x3:典型线性回归和线性分类算法

1. 典型线性回归算法

1. Linear Regression: 输出一个标量 wx+b,这个值是连续值,所以可以用来处理回归问题
2. SVR(Support Vector Regression):输出 wx+b,即某个样本点到分类面的距离,是连续值,所以是回归模型
3. Naive Bayes用于分类: 预测结果y是离散的类别,所以得到离散的 p(y|x),给定 x ,输出每个类上的概率
4. 前馈神经网络(如 CNN 系列)用于回归: 最后一层有m个神经元,每个神经元输出一个标量,m个神经元的输出可以看做向量 v,然后全部连到一个输出神经元上,则这个神经元输出 wv+b,是一个连续值,可以处理回归问题,和 Linear Regression 思想一样

2. 典型线性分类算法

1. Logistic Regression(逻辑斯蒂回归):把 Linear Regression的 wx+b 通过 sigmoid 函数映射到(0,1)上,并划分一个阈值,大于阈值的分为一类,小于等于分为另一类,可以用来处理二分类问题
2. SVM(Support Vector Machine): 把SVR得到的距离用 sign(·) 函数进行离散化处理,距离为正(在超平面一侧)的样本点是一类,为负的是另一类,所以是分类模型 
3. Naive Bayes用于分类: 对最大后验预测结果p(y|x)求期望 ΣyP(y|x)(即得到概率密度),就得到连续值
4. 前馈神经网络(如 CNN 系列)用于分类: m个神经元最后连接到 N 个神经元,就有 N 组w值不同的 wv+b,同理可以归一化(比如用 softmax )变成 N个类上的概率,然后取概率最大的那一类作为N分类的预测结果

3. 感知机属于线性回归还是线性分类算法?

这里我们来思考一下这个问题,感知机使用的是超分界面是线性回归模型(是一个线性函数),类似下图

然后感知机使用的不同softmax进行区间压缩,而是直接用了“y是否大于0”作为判别法则,把结果 y > 0和y < 0对应的输入 x 分成两类。我个人更愿意将其理解为简化版本的逻辑斯蒂回归,因为从图上就可以看到,感知机对区别度较大的样本分类效果很好,但是对区别度较小的(靠近0)的中间那块,这样一刀切的方式就很容易造成误报和漏报

但其本质还是:基于线性回归的结果,进行离散化得到有限个分类结果。和上面讨论的典型线性分类算法核心思想是一样的

0x4:回归和分类各自的应用场景

1. 回归问题的应用场景 - 回归是对真实值的一种"逼近预测"
    1) 回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等
    2) 例如一个产品的实际价格为500元,通过回归分析预测值为499元,我们认为这是一个比较好的回归分析
    3) 预测明天的气温是多少度,这是一个回归任务

2. 分类问题的应用场景 - 分类并没有逼近的概念,最终正确结果只有一个,错误的就是错误的,不会有相近的概念
    1) 分类问题是用于将事物打上一个标签,通常结果为离散值
    2) 例如判断一幅图片上的动物是一只猫还是一只狗)
    3) 预测明天是阴、晴还是雨,就是一个分类任务,但是很容易理解

总体来说,回归模型对精度要求更低,它允许模型包含一定的误差,只要不影整体拟合结果即可

Relevant Link:

http://blog.csdn.net/caroline_wendy/article/details/13294893
https://my.oschina.net/zzw922cn/blog/544221?p=1
http://www.jianshu.com/p/d6f206c869ed
http://zh.numberempire.com/derivativecalculator.php

 

2. 线性回归模型

回归模型适合用在"值预测"的场景中,这里的场景就非常灵活了,根据数据集的不同,映射函数g(x)可以是线性函数,也可以是非线性函数。我们本文重点讨论线性函数相关问题,关于非线性函数问题放在文章的最末尾简单讨论

0x1:线性相关性分析 - 线性回归的原理基础

线性回归分析(Linear Regression Analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法

线性回归分析法是以相关性原理为基础的.相关性原理是预测学中的基本原理之一

在统计学中,线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间的关系(这个关系就是要通过训练样本获得的知识)进行建模的一种回归分析。这种函数是一个或多个(即多元线性回归可以看成是很多个一元线性回归的线性组合)称为回归系数的模型参数的线性组合

例如:

一个地区的房价和面积、地段、层数、周边配套等因素组成。
这里面积、地段、层数、周边配套就是自变量;房价就是因变量。
线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合(加减乘除)起来,得到的结果和房价接近。这里的所谓“数学公式”就是一个线性模型

0x2:从一元线性回归说起

在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析(其实也就是我们最熟悉的y=f(x)函数)。接下来我们用一个例子来思考如何去解决一个现实中常见的问题,在一开始我们先不涉及最小二乘法、损失函数、牛顿法、梯度下降这些概念,我们只是单纯地去思考和解决问题

1. 问题描述

比方说有一个公司,每月的广告费用和销售额,如下表所示

如果我们把广告费和销售额画在二维坐标内,就能够得到一个散点图,如果想探索广告费和销售额的关系,就可以利用一元线性回归做出一条拟合直线

2. 这条线是怎么画出来的

很自然地,我们要思考一个问题:我们能不能画出这样一条直线,它能很好地解释历史上广告费和销售额的关系,并且还能帮助我们预测将来新的投入更多的广告费,销售额能到的具体数值。我们假设这样一个一元线性方程:

Y = ax + b(a、b分别代表2个参数,是我们需要通过观察数据计算得到的)

但是我们发现,这里的a、b参数可能的取值空间是无限的,就算是如上图所示的基本和点集拟合的直线,上下稍微微调一些也是无限的,那到底选哪一条是"相对最精确"的呢?(绝对精确是不可能的,误差总是存在的)。很自然地,我们需要引入一个"标准"来评价模型参数空间中,哪一个是最好的,这就是经验损失函数(注意区别于结构损失函数)

损失函数其 - 残差平方和(又称误差平方和,SSE,Sum of Squaresfor Error)

直观上,我们把我们预测的线性函数对每一个X的回归值(回归函数上的Y值)和真实值进行相减,为了防止负值的出现加上平方,得到一个平方和,最后对比所有的模型参数,谁的平方和最小,谁就是最佳的回归函数

然后利用平均数,把上面式子中每个括号里的内容进一步化简。例如

则:

于是

对于函数Q,分别对于a和b求偏导数,然后令偏导数等于0,就可以得到一个关于a和b的二元方程组,就可以求出a和b了。这个方法被称为最小二乘法

进一步化简,可以消掉2n,最后得到关于a,b的二元方程组为

最后得出a和b的求解公式:

有了这个公式,对于广告费和销售额的那个例子,我们就可以算出那条拟合直线具体是什么,分别求出公式中的各种平均数,然后带入即可,最后算出a=1.98,b=2.25

最终的回归拟合直线为Y=1.98X+2.25,利用回归直线可以做一些预测,比如如果投入广告费2万,那么预计销售额为6.2万

线性回归问题中使用最小二乘法求解全局最优解

上面提到的残差平方和,就是最小二乘法用于评估当前损失函数的方法,我在线性回归中所谈到的最小二乘是指侠义的最小二乘方法,它是一种闭式解的参数求解方法,通过对所有输入样本的残差平方和公式求解最小误差条件下的极值(导数为0),一步获得全局最优解

https://zhuanlan.zhihu.com/p/21852600
https://www.zhihu.com/question/24095027/answer/30698645
https://www.zhihu.com/question/37031188
https://www.zhihu.com/question/20822481

3. 为什么对历史数据拟合的看起来不是那么准?

上面得到了回归拟合直线:Y=1.98X+2.25,但是我们仔细观察一下会发现这条回归直线对历史数据拟合的并不是那么准,很多的点都没有落在直线上。这是为什么呢?对这个问题,存在几个原因:
1. 异常噪音点:样本本身可能存在一些“离群异常点”,这些点无法和模型完美的拟合
2. 非线性:这个是个严重的问题,意味着我们的建模就错误了,目标问题根本就不是一个线性关系问题,强行用线性模型拟合肯定是不行的
3. 异质性:导致因变量的自变量不在我们选取的特征中,换句话说,即我们选择的特征不能很好的体现出线性型的特征。对于销售额这个例子来说,其实广告费只是影响销售额的其中一个比较重要的因素,可能还有经济水平、产品质量、客户服务水平等众多难以说清的因素在影响最终的销售额,那么实际的销售额就是众多因素相互作用最终的结果,由于销售额是波动的,回归线只表示广告费一个变量的变化对于总销售额的影响,所以必然会造成偏差,所以才会有实际值和回归值是有差异的,因此回归线只能解释一部分影响。那么实际值与回归值的差异,就是除了广告费之外其他无数因素共同作用的结果,是不能用回归线来解释的 

这就反回来启发我们,应该用一个更加切近真实情况的损失评估标准来评估我们的回归线,为了引入这个新的损失评估标准,我们先来引入一个新的误差函数

SST(总偏差)=SSR(回归线可以解释的偏差)+SSE(回归线不能解释的偏差)

总偏差平方和(又称总平方和,SST,Sum of Squaresfor Total):是每个因变量的实际值(给定点的所有Y)与因变量平均值(给定点的所有Y的平均)的差的平方和,即,反映了因变量取值的总体波动情况。实际上也就是方差

回归平方和(SSR,Sum of Squares forRegression):因变量的回归值(直线上的Y值)与其均值(给定点的Y值平均)的差的平方和,即,它是由于自变量x的变化引起的y的变化,反映了y的总偏差中由于x与y之间的线性关系引起的y的变化部分,是可以由回归直线来解释的

残差平方和(又称误差平方和,SSE,Sum of Squaresfor Error):因变量的各实际观测值(给定点的Y值)与回归值(回归直线上的Y值)的差的平方和,它是除了x对y的线性影响之外的其他因素对y变化的作用,是不能由回归直线来解释的

R^2=SSR/SST 或 R^2=1-SSE/SST, R^2的取值在0,1之间,越接近1说明拟合程度越好

可以看到,我们将SSR(回归线可以解释的偏差)除以(归一化)一个总偏差,以此来更加准确地评估我们的回归线对真实情况的拟合。 
1. 假如所有的点都在回归线上,说明SSE为0,则R^2=1,意味着Y的变化100%由X的变化引起,没有其他因素会影响Y,回归线能够完全解释Y的变化
2. 如果R^2很低,说明X和Y之间可能不存在线性关系

还是回到最开始的广告费和销售额的例子,这个回归线的R^2为0.73,说明拟合程度还可以

引申思考:相关系数R:如何拟合程度差到一定程度会怎么样?说明了什么?

继续上面的例子,如果我们的数据集是下图所示

不用做数学分析,从肉眼上我们也可以看出,这个回归线的拟合效果非常差,但似乎这个回归线也"尽力"了,它只能拟合到这种程度了(根据平方差损失函数)。为了定量说明这个问题,我们需要引入相关系数R

注意和上面说的判定系数R^2的区分理解,判定系数来判断回归方程的拟合程度,表示拟合直线能多大程度上反映Y的波动。

在统计中还有一个类似的概念,叫做相关系数R(学名是皮尔逊相关系数,因为这不是唯一的一个相关系数,而是最常见最常用的一个),用来表示X和Y作为两个随机变量的线性相关程度,取值范围为【-1,1】。

1. 当R=1,说明X和Y完全正相关,即可以用一条直线,把所有样本点(x,y)都串起来,且斜率为正
2. 当R=-1,说明完全负相关,及可以用一条斜率为负的直线把所有点串起来
3. 如果在R=0,则说明X和Y没有线性关系,注意,是没有线性关系,说不定有其他关系(例如非线性关系)
这就告诉我们,如果遇到这种情况,即我们用线性回归发现无法很好地拟合我们的训练样本,这个时候其实是有两种可能
1. 我们的特征工程有问题,选错了一个和目标值Y不相关或相关性很差的特征X
2. 特征X选对了,但是X和Y是非线性关系,强行用线性回归自然无法得到好的结果

我们在建模之前,就需要先对我们的业务场景进行充分的了解,根据实际业务场景中数据的规律选择合适的拟合模型

Relevant Link:

http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py
http://www.jianshu.com/p/fcd220697182
http://studyai.site/2016/07/22/%E6%96%AF%E5%9D%A6%E7%A6%8F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E7%A8%8B%20%E7%AC%AC%E4%B8%80%E5%91%A8%20(4)%E4%B8%80%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/
https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E9%A2%84%E6%B5%8B%E6%B3%95

0x3:扩展到多元线性回归

将上面一元的例子推广到多元的情况。多元线性回归模型(multivariable linear regression model )

在实际经济问题中,一个变量往往受到多个变量的影响,有时几个影响因素主次难以区分,或者有的因素虽属次要,但也不能略去其作用。例如,家庭消费支出,除了受家庭可支配收入的影响外,还受诸如家庭所有的财富、物价水平、金融机构存款利息等多种因素的影响。在这种复杂问题的拟合中,我们要用到多元线性函数

多元回归分析预测法,是指通过对两个或两个以上的自变量与一个因变量的相关分析,建立预测模型进行预测的方法。当自变量与因变量之间存在线性关系时,称为多元线性回归分析

1. 多元线性模型数学公式

假定被解释变量与多个解释变量之间具有下面的线性关系(即满足下面关于变量X的多元线性函数),则称X和Y的关系组成了一个多元线性回归模型


其中被解释变量解释变量未知参数随机误差项。可以看到,多元线性函数其实是由很多个一元线性函数线性组合而成

对于组观测值,其方程组形式为:

其矩阵形式为

=+

即:

其中

被解释变量的观测值向量解释变量的观测值矩阵总体回归参数向量随机误差项向量

总体回归方程表示为: 

2. 回归变量的选择与逐步回归 - 建立多元线性回归模型前怎么去做特征工程 

有时候我们在建立多元线性模型进行预测的时候遇到效果不好,可能就会一味的增加X的个数,也许碰巧确实增加的X中有一些是和Y相关性较高的X特征,所以拟合和预测效果提高了,我们误以为做了正确的事情然后暗自高兴,但其实可能浪费了大量的计算资源,其实只要增加其中几个有限的特征X就可以达到相同的效果

建立多元性回归模型时,为了保证回归模型具有优良的解释能力和预测效果,应首先注意自变量的选择,其准则是:

(1) 自变量对因变量必须有显著的影响,并呈密切的线性相关(相关系数R值较大);
(2) 自变量与因变量之间的线性相关必须是真实的,而不是形式上的,这就要求我们在建模前对业务场景有充分的了解。这里举一个例子来说明,也许在训练集中,天气的情况和你这个月的收入正好呈现强正相关,但这也许只是样本量不足带来的一种假象,事实上是不符合真实规律的;
(3) 自变量之间应具有一定的互斥性,即自变量之间的相关程度不应高于自变量与因变量之因的相关程度,这条准则意思是特征自变量之间最好不要存在太多的冗余关系,当出现冗余时可以考虑降维处理(例如PCA);
(4) 自变量应具有完整的统计数据,其预测值容易确定

在实际问题中,影响因变量Y的因素(自变量)很多,我们希望从中挑选出影响显著的自变量来建立回归关系式,这就涉及到自变量选择的问题。

在回归方程中若漏掉对Y影响显著的自变量,那么建立的回归式用于预测时将会产生较大的偏差。但回归式若包含的变量太多,且其中有些对Y影响不大,显然这样的回归式不仅使用不方便,而且反而会影响预测的精度。因而选择合适的变量用于建立一个"最优"的回归方程是十分重要的问题。

选择"最优"子集的变量(特征)筛选法包括

1. 逐步回归法(Stepwise)
2. 向前引入法(Forward)
3. 向后剔除法(Backwad)

1. 向前引入法

向前引入法是从回归方程仅包括常数项开始,把自变量逐个引入回归方程。具体地说,先在m个自变量中选择一个与因变量线性关系最密切的变量(利用X和Y的相关系数R),记为,然后在剩余的m-1个自变量中,再选一个,使得联合起来二元回归效果最好,第三步在剩下的m-2个自变量中选择一个变量,使得联合起来回归效果最好,...如此下去,直至得到"最优"回归方程为止。

向前引入法中的终止条件为,给定显著性水平,当某一个对将被引入变量的回归系数作显著性检查时,若p-value (即提高的幅度小于一定的阈值),则引入变量的过程结束,所得方程即为"最优"回归方程。

向前引入法有一个明显的缺点,就是由于各自变量可能存在着相互关系,因此后续变量的选入可能会使前面已选入的自变量变得不重要。这样最后得到的"最优"回归方程可包含一些对Y影响不大的自变量。即存在冗余的可能

2. 向后剔除法

向后剔除法与向前引入法正好相反,首先将全部m个自变量引入回归方程,然后逐个剔除对因变量Y作用不显著的自变量。具体地说,从回归式m个自变量中选择一个对Y贡献最小的自变量,比如,将它从回归方程中剔除;然后重新计算Y与剩下的m-1个自变量回归方程,再剔除一个贡献最小的自变量,比如,依次下去,直到得到"最优"回归方程为止。

向后剔除法中终止条件与向前引入法类似。即直到减小的幅度小于一定的阈值说明就收敛了

向后剔除法的缺点在于,前面剔除的变量有可能因以后变量的剔除,变为相对重要的变量,这样最后得到的"最优"回归方程中有可能漏掉相对重要的变量。

3. 逐步回归法

向前引入法和向后剔除法的缺点原因已经清楚了,很自然地我们会想到找一种动态调和的方法来综合使用这2种技术,逐步回归法就应运而生了,逐步回归法是上述两个方法的综合。向前引入中被选入的变量,将一直保留在方程中。向后剔除法中被剔除的变量,将一直排除在外。这两种方程在某些情况下会得到不合理的结果。于是,可以考虑到,被选入的的变量,当它的作用在新变量引入后变得微不足道时,可以将它删除;被剔除的变量,当它的作用在新变量引入情况下变得重要时,也可将它重新选入回归方程。这样一种以向前引入法为主,变量可进可出的筛选变量方法,称为逐步回归法
逐个引入自变量。每次引入对Y影响最显著的自变量,并对方程中的老变量逐个进行检验,把变为不显著的变量逐个从方程中剔除掉,最终得到的方程中既不漏掉对Y影响显著的变量,又不包含对Y影响不显著的变量

3. 根据训练样本(观测数据)来推测出多元线性模式的参数 - 最大似然估计思想

多元线性回归模型包含多个解释变量,多个解释变量同时对被解释变量发生作用,若要考察其中一个解释变量对的影响就必须假设其它解释变量保持不变来进行分析。因此多元线性回归模型中的回归系数为偏回归系数,即反映了当模型中的其它变量不变时,其中一个解释变量对因变量的均值的影响。

由于参数都是未知的,可以利用样本观测值对它们进行估计。若计算得到的参数估计值为,用参数估计值替代总体回归函数的未知参数,则得多元线性样本回归方程: .其中参数估计值样本回归值样本拟合值样本估计值

其矩阵表达形式为:

其中拟合值列向量样本观测矩阵参数估计值列向量

4. 多元线性模型下怎么评估拟合程度的好坏?

1. 残差平方估计

和一元线性回归一样,在多元的情况下也可以使用最小二乘估计来得到拟合值和实际值的差距

观测值与回归值的残差为:

由最小二乘法可知从训练样本估计得到的参数估计值应使全部观测值与回归值的残差的平方和最小,即使


取得最小值。根据多元函数的极值原理,分别对求一阶偏导,并令其等于零,即

化简得下列方程组

 (3.3)

上述个方程称为正规方程,其矩阵形式为


因为

为参数估计值向量

根据上式可得到正规方程组:

2. 可决系数R2

与一元线性回归中可决系数r2相对应,多元线性回归中也有多重可决系数r2,它是在因变量的总变化中,由回归方程解释的变动(回归平方和)所占的比重,R2越大,回归方各对样本数据点拟合的程度越强,所有自变量与因变量的关系越密切。计算公式为:

R^2=\frac{\sum(\hat{y}-\bar{y})^2}{\sum(y-\bar{y})^2} =1-\frac{\sum(y-\hat{y})^2}{\sum(y-\bar{y})^2}

分母表示实际值和实际均值的残差平方和,分子表示拟合值和实际均值的残差平方和

3. 估计标准误差

估计标准误差,即因变量y的实际值与回归方程求出的估计值\hat{y}之间的标准误差,估计标准误差越小,回归方程拟合程度越好

S_y=\sqrt{\frac{\sum(y-\hat{y})^2}{n-k-1}}

其中,k为多元线性回归方程中的自变量的个数。除此之后还显著性检验,F检验等,本质上都类似的,都是用来评估拟合值和真实值之间的差距程度,这里就不一一列举
注意多重共线性问题
多重共线性是指在多元线性回归方程中,自变量之间有较强的线性关系,这种关系若超过了因变量与自变量的线性关系,则回归模型的稳定性受到破坏,回归系数估计不准确。需要指出的是,在多元回归模型中,多重共线性的难以避免的,只要多重共线性不太严重就行了。判别多元线性回归方程是否存在严惩的多重共线性,可分别计算每两个自变量之间的可决系数r2,若r2 > R2或接近于R2,则应设法降低多重线性的影响
降低多重共线性的办法主要是转换自变量的取值,如
1. 变绝对数为相对数或平均数
2. 或者更换其他的自变量 

Relevant Link:

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html 
https://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E5%9B%9E%E6%AD%B8
https://medium.com/towards-data-science/simple-and-multiple-linear-regression-in-python-c928425168f9https://baike.baidu.com/item/%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E6%A8%A1%E5%9E%8B
http://www.cnblogs.com/dfcao/p/ng_ml_2.html
http://www.cnblogs.com/zgw21cn/archive/2008/12/24/1361287.html 
https://onlinecourses.science.psu.edu/stat501/node/311
http://wiki.mbalib.com/wiki/%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E9%A2%84%E6%B5%8B

0x4:非线性回归

1. 非线性模型和线性模型的区别

非线性回归生成一个用于描述连续响应变量与一个或多个预测变量之间的非线性关系的方程,并预测新观测值。注意:线性回归和非线性回归之间的根本差别,以及两种分析的命名依据,在于可接受何种形式的模型函数

1. 线性回归要求线性参数: 这限制方程只能有一种基本形式。当模型中的各项之间是相加关系,并且每一项只包含一个与该项相乘的参数时,参数是线性的,即 y = βo + β1X1 + β2X2 + ... + βkXk
2. 而非线性回归则不要求,它既可以是线性参数也可以是非线性参数

除此之外,非线性回归使用不同于线性回归的过程来使残差误差平方和 (SSE) 最小化

2. 非线性回归数学模型

和线性回归模型一样,在训练之前需要先建立非线性回归的数学模型,模型代表了从实际场景中问题的数学抽象,更具体来说就是我们需要对我们要拟合/预测的问题有一个先验的了解,这个了解包括

1. 我们可以抽象出的特征有哪些
2. 特征和待预测值的关系是怎样的?线性地还是非线性的?如果是非线性的那曲线形状大致是怎样的?

换句话说,如果样本数据足够好,特征足够有效,规律本身就已经呼之欲出了,用什么模型去拟合都查不了太多,效果都会是很好的

下表列举了一些的非线性回归模型的示例模型语法。随机选择的模型不太可能很好地拟合数据。参数的适当起始值是必要的,有些模型还要求使用约束才能实现收敛性

名称模型表达式
渐近回归 b1 + b2 * exp(b3 * x)
渐近回归 b1 – (b2 * (b3 ** x))
密度(D) (b1 + b2 * x) ** (–1 / b3)
Gauss b1 * (1 – b3 * exp(–b2 * x ** 2))
Gompertz b1 * exp(–b2 * exp(–b3 * x))
Johnson-Schumacher b1 * exp(–b2 / (x + b3))
对数修改 (b1 + b3 * x) ** b2
对数 Logistic b1 – ln(1 + b2 * exp(–b3 * x))
Metcherlich 的收益递减规律 b1 + b2 * exp(–b3 * x)
Michaelis Menten b1 * x / (x + b2)
Morgan-Mercer-Florin (b1 * b2 + b3 * x ** b4) / (b2 + x ** b4)
Peal-Reed b1 / (1+ b2 * exp(–(b3 * x + b4 * x **2 + b5 * x ** 3)))
三次比 (b1 + b2 * x + b3 * x ** 2 + b4 * x ** 3) / (b5 * x ** 3)
四次比 (b1 + b2 * x + b3 * x ** 2) / (b4 * x ** 2)
Richards b1 / ((1 + b3 * exp(–b2 * x)) ** (1 / b4))
Verhulst b1 / (1 + b3 * exp(–b2 * x))
Von Bertalanffy (b1 ** (1 – b4) – b2 * exp(–b3 * x)) ** (1 / (1 – b4))
韦伯 b1 – b2 * exp(–b3 * x ** b4)
产量密度 (b1 + b2 * x + b3 * x ** 2) ** (–1)

在选定预期函数后,若变量间非线性关系式已知(多数未知),且难以用变量变换法将其线性化,则进行数值迭代的非线性回归分析

这里需要注意的是,虽然理论上我们需要事先指定用于执行非线性回归的预期函数,设定了预期函数之后才能够根据训练集去训练出模型参数,但在实际的业务场景问题建模过程中,我们遇到的最多的问题就是:

1. 要解决问题似乎太过复杂,导致肉眼或者先验经验无法给出判断该用什么预期函数建模
2. 可能需要付出很多精力才能确定可以为数据提供最佳拟合的函数。这通常需要额外的研究、专业领域知识和试错分析。另外,对于非线性方程,在确定每个预测变量对响应的影响时可能不如线性方程那样直观

若实际问题的曲线类型不易确定时,由于任意曲线皆可由多项式来逼近,故常可用多项式回归来拟合曲线。但这样就导致参数的解空间很大,也就要花费更多的时间去拟合样本数据,深度神经网络DNN就是典型的例子

3. 非线性回归参数估计策略

非线性模型中的参数估计无法像线性模型中那样直接求解一个closed form,本质上还是求导太复杂,因此在非线性模型中需要使用基于估计思想的方法进行逐步估计

非线性回归分析参数估计的方法也有多种,主要方法有

1. 非线性最小二乘估计(nonlinear least squares estimator, NLS):模型本身复杂无法一次得到全局最优解,只能通过迭代的方法来逐步进行参数优化
2. 非线性最大似然估计(Nonlinear maximum likelihood estimator, NMLE)

4. 非线性回归参数估计迭代算法介绍

实际上,非线性最小二乘估计和非线性极大似然估计都是非线性优化的问题,虽然策略方法不变,但是因为最小二乘涉及到求导极值方程,这在线性情况是下很容易的,但是到了非线性领域对高阶方程求偏导就变得十分困难,有时候甚至无法完成。这意味着在非线性回归方程中,我们无法通过直接求导得到极值,所以非线性回归中常常使用"逐步逼近"的思想,在不断地迭代中不断逼近最优的模型参数

最速下降法

最速下降法(又称梯度法,或Steepest Descent),是无约束最优化领域中最简单的算法,它属于比较古老提出的一种算法。但是,它的理念思想却对之后提出的非线性回归模型的参数搜索奠定了基础,我们会发现在其他某些算法中,也有最速下降法的“影子”

最速下降法只使用目标函数的一阶导数信息,从“梯度法”这个名字可以看出它的本意是取目标函数值“最快下降”的方向作为搜索方向。于是问题来了:沿什么方向,目标函数 f(x)的值下降最快呢?答案是沿负梯度方向  d =gk (即负一阶导数方向),函数值下降最快。我们通过公式推导来说明一下该结论的原理

将目标函数在点处泰勒展开:

高阶无穷小 o(α) 可忽略,由于我们定义了步长 α>0(即朝某个方向前进的一段距离),同时,只有当 时, f(x)<f(xk) (即函数值是下降的)。所以 dk和gk的方向至少需要是相反的,才能达到下降的目的
同时Cauchy-Schwartz不等式(柯西-许瓦兹不等式)可得:
当且仅当 dk=gk 时,等号成立,所以 dk =gk 时, 最小(<0), f(x) 下降量最大

所以 gk 是最快速下降方向

但是最速下降法并不如它名字里说的是最速的,事实是,它只在局部范围内具有“最速”性质。对整体求解过程而言,它的下降非常缓慢。

dk = -gk本质上意味着GD不断在走90度折角的Z字型下降,所以下降过程是不断来回折的,并不快

最速下降法(梯度法)衍生改进 - 批量梯度下降法(Batch Gradient Descent,BGD)

BGD顾名思义,是一次使用整批m个样本参与计算loss function

(1)将J(theta)对theta求偏导,得到每个theta对应的的梯度,m代表样本个数:

(2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta:

(3)从上面公式可以注意到每更新一步,都要用到样本的所有的数据,如果m很大,那么可想而知这种方法的迭代速度会相当的慢。对于批量梯度下降法,样本个数m,x为n维向量,一次迭代需要把m个样本全部带入计算,

迭代一次计算量为m*n2

批量梯度下降法改进 - 随机梯度下降(Stochastic Gradient Descent,SGD)

BGD的缺点是一次用到了整批样本参与运算,然而我们知道冗余特性在很多数据集中都是广泛存在的,即一个样本集中存在部分的样本在各个维度上的特征是类似的,对于这种情况,

即使我们不使用全部的样本集参与运算也不会损失太多精确度。随机梯度下降正是借助"随机思想"从完整的样本集中采样一个相对较小批次的子数据集作为本次loss function的运算输入,

在降低m的前提下力求尽量少的损失精确度,两者的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量

但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向

高斯 - 牛顿法

牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快

首先,选择一个接近函数 (x)零点的 x0,计算相应的 (x0) 和切线斜率f  ' (x0)(这里f ' 表示函数 f  的导数)。然后我们计算穿过点(x0,  f  (x0)) 并且斜率为'(x0)的直线和 轴的交点的x坐标,也就是求如下方程的解:

我们将新求得的点的 坐标命名为x1,通常x1会比x0更接近方程f  (x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

已经证明,如果f  ' 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内(如果不在这个区域内就可能出现局部最优但全局不最优),那么牛顿法必定收敛。 并且,

如果f  ' (x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。下图为一个牛顿法执行过程的例子。

由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"

牛顿法的优缺点

优点:
1. 顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

缺点:
1. 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径

注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径

牛顿法改进 - 拟牛顿法(Quasi-Newton Methods)

拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度

拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效

牛顿一拉夫森法

牛顿—拉夫森(Newton-raphson)法的基本思想也是利用泰勒级数展开近似,通过迭代运算寻找最小二乘函数最优解的数值解法。

但区别在于,牛顿—拉夫森法的迭代运算,相当于在前一个参数估计向量的基础上,按单位移动幅度(通常称为“步长”)搜索更好的参数估计值,因此牛顿—拉夫森法也是一 种搜索法(不断进行局部最优搜索)

牛顿—拉夫森法的优点是搜索方向和步长的确定比较科学,因此找到满足精度要求最优水平的搜索次数一般要小一些。

牛顿—拉夫森方法的缺点是迭代运算中需要反复计算梯度向量,特别是海塞矩阵的逆矩阵,因此计算工作量很大。事实上,人们在实际应用中常常并不按照牛顿一 拉夫森法进行搜索,而是根据一些简单法则确定搜索的步长,如“双向线性搜索法”就是其中常用的方法之一

格点搜索法

Relevant Link:

https://support.minitab.com/zh-cn/minitab/18/help-and-how-to/modeling-statistics/regression/supporting-topics/nonlinear-regression/understanding-nonlinear-regression/
https://support.minitab.com/zh-cn/minitab/18/help-and-how-to/modeling-statistics/regression/supporting-topics/nonlinear-regression/understanding-algorithms-and-starting-values-in-nonlinear-regression/
http://blog.csdn.net/ice110956/article/details/22735535
http://202.121.199.249/foundrymate/lessons/data-analysis/24/241.HTM
http://www.cnblogs.com/maybe2030/p/4751804.html#_label1
https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E5%86%8D%E8%B0%88-%E6%9C%80%E9%80%9F%E4%B8%8B%E9%99%8D%E6%B3%95%E6%A2%AF%E5%BA%A6%E6%B3%95steepest-descent/
http://gaolei786.github.io/r/statistics/nlm.smooth.reg.html 
http://kuangnanfang.com/zb_users/upload/2015/09/201509201442740102956811.pdf

 

3. 线性分类模型

0x1: 逻辑斯蒂回归分类模型

逻辑斯蒂回归(logistic regression)是统计学中的经典分类方法,它属于对数线性模型。逻辑斯蒂回归模型源自逻辑斯蒂分布,其分布函数F(x)是S形函数。逻辑斯蒂回归模型是由输入的线性函数表示的输出的对数几率模型

1. 逻辑斯蒂分布(logistic distribution)

逻辑斯谛分布是指连续随机变量X具备下列分布函数和密度函数

其中,u为未知参数,r > 0为形状参数

可以看到,逻辑斯谛分布函数是一条S形曲线(sigmoid curve),该曲线以点(u, 1/2)为中心对称。曲线在中心附近增长速度较快,在两端增长速度较慢

1. 形状参数r的值越小,曲线在中心附近增长得越快,也即越接近阶跃函数
2. 阶跃点由位置参数u决定

2. 二项逻辑斯蒂回归模型(二项即代表label只有两种可能)

二项逻辑斯蒂回归模型(binomial logistic regression model)是一种分类模型,由条件概率分布P(Y | X)表示,形式为参数化的逻辑斯谛分布,随机变量X取值为实数,Y取值为0或1,通过监督学习的方法来估计模型参数

对于给定的输入实例x,按照上式可以求得P(Y = 1 | x)和P(Y = 0 | x),逻辑斯蒂回归比较两个条件概率值的大小,将实例x分到概率值较大的那一类

3. 逻辑斯蒂回归模型的特点

我们前面说过,逻辑斯蒂回归模型属于对数线性模型,通过两边加入对数log,可以让逻辑斯蒂回归呈现出线性形式,我们来引出下一个话题:几率

一个事件的几率(odds):指该事件发生与不发生的概率比值,若事件发生概率为p,那么事件发生的几率就是:那么该事件的对数几率(log odds或者logit)就是: 

那么,对逻辑回归而言,Y=1对数几率就是: 

也就是说,输出Y=1的对数几率是由输入x的线性函数表示的模型,这就是 逻辑回归模型。当 w⋅x的值越接近正无穷,P(Y=1|x) 概率值也就越接近1.

这看起来是一个非常直观的概率模型,所以,在神经网络中也引入了sigmoid函数作为激活函数的概念,每一个sigmoid函数就是一个决策单元

4. 逻辑斯蒂回归模型参数估计

模型建立后,接下来如何去求解模型中的参数。在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的训练样本数据被正确分类的似然度(概率)最大

逻辑斯蒂回归模型学习时,对于给定的训练数据集T = {(x1, y1),(x2,y2),....,(xn, yn)},设:

似然函数:

对数似然函数:

现在要求 w 使得L(w) 最大,这样,问题就变成了以对数似然函数为目标函数的最优化问题,逻辑斯蒂回归属于非线性模型,常用的最优化方法是梯度下降GD或者拟牛顿法

假设w的极大似然估计值是,那么学到的逻辑斯蒂回归模型为:,该模型可用于之后的预测中

这里我们插入一个问题:为什么不是最小化损失函数策略,确实最大化似然函数策略?

实际上,对数似然损失在单个数据点上的定义为: 

如果取整个数据集上的平均对数似然损失,我们恰好可以得到: 

即在逻辑回归模型中,我们最大化似然函数和最小化对数似然损失函数这两种策略实际上是等价的。可见损失函数背后的本质还是概率

5. 多项式逻辑斯蒂回归(多项代表label有多种可能)

在大于2的多分类问题中,要用到多项式逻辑斯蒂回归模型(multi-nominal logistic regression model)。假设离散型随机变量Y的取值集合是{1,2,...,K},则模型公式为:

同样,二项逻辑斯蒂回归的参数估计法也可以推广到多项逻辑斯蒂回归

虽然逻辑回归能够用于分类,不过其本质还是线性回归。它仅在线性回归的基础上,在特征到结果的映射中加入了一层sigmoid函数(非线性)映射,即先把特征线性求和,然后使用sigmoid函数来预测。
正是这个简单的逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,神经网络中的感知机中也有逻辑斯蒂回归回归模型的影子

逻辑斯蒂回归比线性回归优势在于:线性回归在整个实数域内敏感度一致。而逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型。逻辑曲线在z=0时,十分敏感,这让模型能够对数据集中细节的差别具备较灵敏的分类能力(未知参数r越小,灵敏度越高),在z>>0或z<<0处(两头位置),都不敏感

逻辑斯蒂回归可以看成是一个通过log压缩到【0,1】值域中的线性回归模型

Relevant Link:

http://blog.csdn.net/xbinworld/article/details/43919445
http://blog.sciencenet.cn/blog-427701-688352.html
http://blog.csdn.net/ppn029012/article/details/8775597
http://blog.csdn.net/richard2357/article/details/17241039
http://blog.sciencenet.cn/blog-508318-633085.html
http://blog.csdn.net/daunxx/article/details/51816588
https://chenrudan.github.io/blog/2016/01/09/logisticregression.html
http://www.52cs.org/?p=286
https://www.zhihu.com/question/21329754/answer/18004852
https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/articles/%E5%9B%9E%E5%BD%92%E9%97%AE%E9%A2%98.html

0x2: 最大熵模型

1. 最大熵原理

最大熵模型(maximum entropy model)由最大熵原理推导实现。最大熵原理是概率模型学习中的一个准则,即

学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型是最好的模型。通常用约束条件来确定概率模型的集合,所以,最大熵原理也可以表述为在满足约束条件的模型集合中选取熵最大的模型

假设离散随即变量X的概率分布是P(X),则其熵:,熵满足下列不等式:,其中| X |代表X的取值个数,当且仅当X的分布是均匀分布时右边的等号成立,即当X服从均匀分布时,熵最大。

直观地说,最大熵原理认为要选择的概率模型首先必须满足已有的事实,即约束条件。在没有更多信息的情况下,那些不确定的部分都是"等可能的"(即等概率)。最大熵原理通过熵的最大化来表示等可能性。"等可能性"不好公式化,而熵则是一个可优化逼近的数值指标

2. 最大熵模型的定义(k=2)- 为了引出之后的论点:最大熵模型是逻辑斯蒂回归的泛化形式,逻辑斯蒂回归是最大熵对应类别为二类时的特殊情况

最大熵原理是统计学的一般原理,将它应用到分类得到最大熵模型,在进行下面推导之前,先上几个数学符号定义

  1. π(x)u 表示,输入时x, 输出的 y=u的概率;
  2. A(u,v) 是一个指示函数,若u=v,则 A(u,v)=1;否则 A(u,v)=0
  3. 我们的目标,就是从训练数据中,学习得到一个模型,使得 π(x)u 最大化,也就是输入x,预测结果是 y 的概率最大,也就是使得 π(x)y 最大;

最大熵模型满足下列的一些性质:

基于信息论理论,我们可以得到π() 的,定义如下:

根据最大熵原理,有了目标(策略)π() 最大,在上面的4个约束条件下。求解约束最优化问题

为了简化运算。可以通过拉格朗日乘子,将约束最优化问题转换为无约束最优化的对偶问题。我们的拉格朗日式子可以写成如下:,对L求偏导,得到:,令偏导=0,得到:,从而得到:,因为有约束条件:,所以:,因此,可以得到:,把代入π(),并且简化一下式子:

3. 最大熵模型是逻辑斯蒂回归的泛化形式(k=2)

最大熵模型和逻辑斯蒂回归模型的背后都是概率统计原理,逻辑回归跟最大熵模型没有本质区别。逻辑回归是最大熵对应类别为二类时的特殊情况,为了证明这个论点,我们先来回顾逻辑斯蒂回归

标准的逻辑回归是二类模型,有: ,我们用一个更加泛化的形式来表达 π()

可以看到,在k=2的情况下,最大熵模型和逻辑斯蒂回归模型是等价的

1. 逻辑回归跟最大熵模型没有本质区别。逻辑回归是最大熵对应类别为二类时的特殊情况
2. 指数簇分布的最大熵等价于其指数形式的最大似然 

3. 二项式分布的最大熵解等价于二项式指数形式(sigmoid)的最大似然  
4. 多项式分布的最大熵等价于多项式分布指数形式(softmax)的最大似然 

最大熵模型与逻辑斯蒂回归模型有类似的形式,它们又称为对数线性模型(log linear model)(即在对数化情况下呈现线性性),模型学习就是在给定的训练数据条件下对模型进行极大似然估计(经验风险最小化)或正则化的极大似然估计(结构风险最小化)

Relevant Link: 

http://blog.csdn.net/cyh_24/article/details/50359055

 

4. 从鸢尾花例子看回归和分类问题的共性和区别

鸢尾花数据集是一个很经典的数据集,每个样本包含4个维度的特征:的花瓣和萼片长度和宽度。样本量150个,label标签有Setosa,Versicolour、Virginica这3种

0x1: 前2维特征+4维PCA降维到3维的可视化数据集展示

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

if __name__ == '__main__':
    # import some data to play with
    iris = datasets.load_iris()
    X = iris.data[:, :2]  # we only take the first two features.
    y = iris.target

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

    plt.figure(2, figsize=(8, 6))
    plt.clf()

    # Plot the training points
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,
                edgecolor='k')
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')

    plt.xlim(x_min, x_max)
    plt.ylim(y_min, y_max)
    plt.xticks(())
    plt.yticks(())

    # To getter a better understanding of interaction of the dimensions
    # plot the first three PCA dimensions
    fig = plt.figure(1, figsize=(8, 6))
    ax = Axes3D(fig, elev=-150, azim=110)
    X_reduced = PCA(n_components=3).fit_transform(iris.data)
    ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
               cmap=plt.cm.Set1, edgecolor='k', s=40)
    ax.set_title("First three PCA directions")
    ax.set_xlabel("1st eigenvector")
    ax.w_xaxis.set_ticklabels([])
    ax.set_ylabel("2nd eigenvector")
    ax.w_yaxis.set_ticklabels([])
    ax.set_zlabel("3rd eigenvector")
    ax.w_zaxis.set_ticklabels([])

    plt.show()

明确了数据集长什么样,我么接下来开始进行一个小实验,说逐步说明我们什么时候该用线性回归/非线性回归,什么时候该用分类模型,以及回归与分类的关系。在开始之前,我需要明确一下我们的目标:

建立一个模型(任意模型),当我输入鸢尾花的特征之后,你需要告诉我这个鸢尾花属于哪一类?

0x2: 使用1元线性回归模型建立一元线性回归模型

也许直觉上这个问题不适合用一元线性回归模型来做,但是我这里执意要这么做,并且要最大程度地发挥一元线性回归模型的威力使其帮助我们尽可能地好的去靠近这个目标

1. 选择和待预测值Y相关性最强的一个特征

我们只能选择一个特征,那肯定要选择一个能达到最好拟合预测能力的特征,使用可决系数R2的来帮我们评估

Feature_1 - Variance score: 0.58
Feature_2 - Variance score: 0.26
Feature_3 - Variance score: 0.90
Feature_4 - Variance score: 0.92

从可决系数的比较上来看,第4个特征和待拟合值的相关性最好,所以我们之后的实验都选择特征4

2. 建立一元线性回归模型

用X轴表示特征4,用Y轴表示label,通过plot可视化出来

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

if __name__ == '__main__':
    # import some data to play with
    iris = datasets.load_iris()

    # Use only one feature
    diabetes_X = iris.data[:, 3:4]  # we only take the two features.
    diabetes_y = iris.target

    # Split the data into training/testing sets
    split_len = int(len(diabetes_X) * 0.8)
    diabetes_X_train = diabetes_X[:split_len]
    diabetes_X_test = diabetes_X[split_len:]
    print "diabetes_X_train"
    print diabetes_X_train

    # Split the targets into training/testing sets
    diabetes_y_train = diabetes_y[:split_len]
    diabetes_y_test = diabetes_y[split_len:]
    print "diabetes_y_train"
    print diabetes_y_train

    # Create linear regression object
    regr = linear_model.LinearRegression()

    # Train the model using the training sets
    regr.fit(diabetes_X_train, diabetes_y_train)

    # Make predictions using the testing set
    diabetes_y_pred = regr.predict(diabetes_X_train)
    print "diabetes_y_pred"
    print diabetes_y_pred

    # 对线性回归模型的预测值进行离散采样归一化
    '''
    diabetes_y_pred_normal = list()
    for pred in diabetes_y_pred:
        if pred <= 0.5:
            diabetes_y_pred_normal.append(0.)
        elif pred <= 1.5:
            diabetes_y_pred_normal.append(1.)
        else:
            diabetes_y_pred_normal.append(2.)
    diabetes_y_pred = np.array(diabetes_y_pred_normal)
    print "diabetes_y_pred"
    print diabetes_y_pred
    '''

    # The coefficients
    print('Coefficients: ', regr.coef_)
    # The mean squared error
    # Explained variance score: 1 is perfect prediction
    # 可决系数R2越接近1,说明特征和拟合值的相关性越大
    print('Variance score: %.2f' % r2_score(diabetes_y_train, diabetes_y_pred))
    # 预测的准确度
    print "Prediction accurate: %2f" % np.mean(diabetes_y_pred == diabetes_y_train)

    # Plot outputs
    plt.scatter(diabetes_X_train, diabetes_y_train, color='black')
    plt.scatter(diabetes_X_train, diabetes_y_pred, color='blue', linewidth=3)

    plt.xticks(())
    plt.yticks(())

    plt.show()

黑色的点代表样本实际值,蓝色的点代表模型拟合值

3. 我们要预测的是[0, 1, 2]这3种离散的label类型,你给我一个连续性的线性回归模型怎么用?

得到的这个模型我们会发现无法进行预测,因为线性回归模型得到的值是连续值

为了解决这个问题,我们前面说过,我们可以对线性回归模型的连续预测值进行离散化采样,采样点的分界面(对一维来说就是分界线)可以大致假定一个0.5和1.5,即取【0,1,2】的中位数,进行了离散采样归一化之后的结果如下

两幅图分别是离散化前后的点可视化图,图中的两个箭头就是分界线,注意x(Y = 1.5)(Y值为1.5的x点)那个分界线,在分界线的两边都存在误分类(即误报)

对这种情况。我们也许可以建立一个损失函数的策略,即根据均方误差损失函数去求得最佳分类线X,这个例子很简单,从直观上就可以看出吗,第二个分界线不管怎么左右调整,损失函数都不可能降到0,因为在它的分类维度上,点集Y=1和点集Y=2是存在重合的,换句话说,点集Y=1和点集Y=2在当前特征维度上是线性不可分的,不管用多么高端的损失函数评价和回归策略都是一样的,数据本身和维度的限制限制了最终的效果

0x3: 使用多元线性回归模型建立多元线性回归模型 

既然一元回归模型维度太少了,我们就把维度提高,根据SVM核函数的思想,在低纬度不可分的数据集在高维度就有更大的可能是线性可分的,1维的分界线到了高维度变成了超分类面

为了便于理解,我们来看一个4维PCA后的3维点集图

可以看到,应该相对容易地我们用2个垂直于"2nd eigenvector" x "1st eigenvector"平面作为分类面,可以较好地把3类数据集给切分开来

所以同样的,我们还是用同样的思路

1. 这次同时用上鸢尾花的全部4个特征(当然其实这里是否要同时用到4个特征,也是值得展开的一个话题,严格地说这里应该进行特征选择工程,但我们暂时忽略)
2. 离散采样标准还是x(Y = 0.5)、x(Y = 1.5),取样本Y实际值的中位数对应的X点作为超分界面,只是这时候X不在是一个线,而是一个4维超平面

训练集得到的模型对训练集本身的离散化预测结果如下

Variance score: 0.98
Prediction accurate: 0.991667

这次的整体可决系数和准确度都得到的大幅度提高,对测试集的泛化能力也不错,达到了80%

0x4: 使用非线性回归模型对数据集进行拟合

我们试着用非线性回归模型来帮助我们更好地拟合样本点

0x5: 使用Logistic regression对数据集进行分类

逻辑斯蒂回归模型是在回归模型的基础上进行离散化采样得到分类结果,属于回归分类模型

#!/usr/bin/python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
Y = iris.target

h = .02  # step size in the mesh

logreg = linear_model.LogisticRegression(C=1e5)

# we create an instance of Neighbours Classifier and fit the data.
logreg.fit(X, Y)

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# 预测的准确度
X_pre = logreg.predict(X)
print X_pre
print "Prediction accurate: %2f" % np.mean(X_pre == Y)


# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())

plt.show()

每次判断时,多项式逻辑斯蒂回归模型基于最大似然估计原理,根据样本在所有条件概率中最大的对应的那个类作为最终判断结果(softmax)

可以看到,用逻辑斯蒂回归模型对鸢尾花的2个特征进行分类,得到了80%的准确度

0x6: 使用SVM直接寻找超分类面对数据集进行分类

SVM不进行回归训练,而是直接寻找最优超分类面

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets


def make_meshgrid(x, y, h=.02):
    """Create a mesh of points to plot in

    Parameters
    ----------
    x: data to base x-axis meshgrid on
    y: data to base y-axis meshgrid on
    h: stepsize for meshgrid, optional

    Returns
    -------
    xx, yy : ndarray
    """
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy


def plot_contours(ax, clf, xx, yy, **params):
    """Plot the decision boundaries for a classifier.

    Parameters
    ----------
    ax: matplotlib axes object
    clf: a classifier
    xx: meshgrid ndarray
    yy: meshgrid ndarray
    params: dictionary of params to pass to contourf, optional
    """
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out


# import some data to play with
iris = datasets.load_iris()
# Take the first two features. We could avoid this by using a two-dim dataset
X = iris.data[:, :2]
y = iris.target

# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0  # SVM regularization parameter
models = (svm.SVC(kernel='linear', C=C),
          svm.LinearSVC(C=C),
          svm.SVC(kernel='rbf', gamma=0.7, C=C),
          svm.SVC(kernel='poly', degree=3, C=C))
models = (clf.fit(X, y) for clf in models)

# title for the plots
titles = ('SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel')

# Set-up 2x2 grid for plotting.
fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)

X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)

for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy,
                  cmap=plt.cm.coolwarm, alpha=0.8)
    ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Sepal length')
    ax.set_ylabel('Sepal width')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)

plt.show()

Relevant Link:

https://en.wikipedia.org/wiki/Iris_flower_data_set
http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
http://scikit-learn.org/stable/auto_examples/index.html
http://blog.csdn.net/golden1314521/article/details/46564227
http://scikit-learn.org/stable/auto_examples/semi_supervised/plot_label_propagation_versus_svm_iris.html#sphx-glr-auto-examples-semi-supervised-plot-label-propagation-versus-svm-iris-py
http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html 

Copyright (c) 2017 LittleHann All rights reserved

posted @ 2017-08-28 22:27 骑着蜗牛逛世界 阅读(...) 评论(...) 编辑 收藏