今天主要讲述的内容是关于一元线性回归的知识,python实现,包括以下内容:
1.机器学习常用数据集介绍
2.什么是线性回顾
3.linearregression使用方法
4.线性回归判断糖尿病
前文推荐:
希望这篇文章对你有所帮助,尤其是刚刚接触数据挖掘以及大数据的同学,同时准备尝试以案例为主的方式进行讲解。如果文章中存在不足或错误的地方,还请海涵~
同时这篇文章是我上课的内容,所以参考了一些知识,强烈推荐大家学习斯坦福的机器学习ng教授课程和scikit-learn中的内容。由于自己数学不是很好,自己也还在学习中,所以文章以代码和一元线性回归为主,数学方面的当自己学到一定的程度,才能进行深入的分享及介绍。抱歉~
1.diabetes dataset数据集
这是一个糖尿病的数据集,主要包括442行数据,10个属性值,分别是:age(年龄)、性别(sex)、body mass index(体质指数)、average blood pressure(平均血压)、s1~s6一年后疾病级数指标。target为一年后患疾病的定量指标。

输出如下所示:
2.sklearn常见数据集
常见的sklearn数据集包括,强烈推荐下面这篇文章:
sklearn包含一些不许要下载的toy数据集,见下表,包括波士顿房屋数据集、鸢尾花数据集、糖尿病数据集、手写字数据集和健身数据集等。
3.uci数据集
1.机器学习简述
机器学习(machine learning )包括:
a.监督学习(supervised learning):回归(regression)、分类(classification)
例:训练过程中知道结果。小孩给水果分类,给他苹果告诉他是苹果,反复训练学习。在给他说过,问他是什么?他回答准确,如果是桃子,他不能回答为苹果。
b.无监督学习(unsupervised learning):聚类(clustering)
例:训练过程中不知道结果。给小孩一堆水果,如苹果、橘子、桃子,小孩开始不知道需要分类的水果是什么,让小孩对水果进行分类。分类完成后,给他一个苹果,小孩应该把它放到苹果堆中。
c.增强学习(reinforcement learning)
例:ml过程中,对行为做出评价,评价有正面的和负面两种。通过学习评价,程序应做出更好评价的行为。
d.推荐系统(recommender system)
2.斯坦福公开课:第二课 单变量线性回归
这是ng教授的很著名的课程,这里主要引用52nlp的文章,真的太完美了。推荐阅读该作者的更多文章:
<1>模型表示(model representation)
房屋价格预测问题,有监督学习问题。每个样本的输入都有正确输出或答案,它也是一个回归问题,预测一个真实值的输出。
训练集表示如下:
对于房价预测问题,讯息过程如下所示:
其中x代表房屋的大小,y代表预测的价格,h(hypothesis)将输入变量映射到输出变量y中,如何表示h呢?可以表示如下公式,简写为h(x),即带一个变量的线性回归或单变量线性回归问题。
<2>成本函数(cost function)
对于上面的公式函数h(x),如何求theta0和theta1参数呢?
构想: 对于训练集(x, y),选取参数0, 1使得hθ(x)尽可能的接近y。如何做呢?一种做法就是求训练集的平方误差函数(squared error function)。
cost function可表示为:
并且选取合适的参数使其最小化,数学表示如下:
总的来说,线性回归主要包括一下四个部分,分别是hypothesis、parameters、cost function、goal。右图位简化版,theta0赋值为0。
然后令1分别取1、0.5、-0.5等值,同步对比hθ(x)和j(θ0,θ1)在二维坐标系中的变化情况,具体可参考原ppt中的对比图,很直观。
<3>梯度下降(gradient descent)
应用的场景之一最小值问题:
对于一些函数,例如j(θ0,θ1)
目标: minθ0,θ1j(θ0,θ1)
方法的框架:
a. 给0, 1一个初始值,例如都等于0;
b. 每次改变0, 1的时候都保持j(θ0,θ1)递减,直到达到一个我们满意的最小值;
对于任一j(θ0,θ1) , 初始位置不同,最终达到的极小值点也不同,例如以下例子:
3.一元回归模型
<1>什么是线性回归?
回归函数的具体解释和定义,可查看任何一本“概率论与数理统计”的书。我看的是“陈希孺”的。
这里我讲几点:
1)统计回归分析的任务,就在于根据 x1,x2,...,xp 线性回归和y的观察值,去估计函数f,寻求变量之间近似的函数关系。
2)我们常用的是,假定f函数的数学形式已知,其中若干个参数未知,要通过自变量和因变量的观察值去估计未知的参数值。这叫“参数回归”。其中应用最广泛的是f为线性函数的假设:
这种情况叫做“线性回归”。
3)自变量只有一个时,叫做一元线性回归。
f(x) = b0+b1x
自变量有多个时,叫做多元线性回归。
f(x1,x2,...,xp) = b0 + b1x1 + b2x2 + ... + bpxp
4)分类(classification)与回归(regression)都属于监督学习,他们的区别在于:
分类:用于预测有限的离散值,如是否得了癌症(0,1),或手写数字的判断,是0,1,2,3,4,5,6,7,8还是9等。分类中,预测的可能的结果是有限的,且提前给定的。
回归:用于预测实数值,如给定了房子的面积,地段,和房间数,预测房子的价格。
<2>一元线性回归
假设:我们要预测房价。当前自变量(输入特征)是房子面积x,因变量是房价y.给定了一批训练集数据。我们要做的是利用手上的训练集数据,得出x与y之间的函数f关系,并用f函数来预测任意面积x对应的房价。
假设x与y是线性关系,则我们可以接着假设一元线性回归函数如下来代表y的预测值:
我们有训练集了,那么问题就成了如何利用现有的训练集来判定未知参数 (θ0,θ1) 的值,使其让h的值更接近实际值y? 训练集指的是已知x,y值的数据集合!
一种方法是计算它的成本函数(cost function),即预测出来的h的值与实际值y之间的方差的大小来决定当前的(θ0,θ1)值是否是最优的!
常用的成本函数是最小二乘法:
<3>模型总结
整个一元线性回归通过下面这张图总结即可:
最后,梯度下降和多元回归模型将继续学习,当我学到一定程度,再进行分享。
linearregression模型在sklearn.linear_model下,它主要是通过fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。
sklearn中引用回归模型的代码如下:
输出的函数原型如下所示:
fit(x, y): 训练。分析模型参数,填充数据集。其中x为特征,y位标记或类属性。
predict(): 预测。它通过fit()算出的模型参数构成的模型,对解释变量进行预测其类属性。预测方法将返回预测值y_pred。
这里推荐"搬砖小工053"大神的文章,非常不错,强烈推荐。
运行结果如下所示,首先输出数据集,同时调用sklearn包中的linearregression()回归函数,fit(x, y)载入数据集进行训练,然后通过predict()预测数据12尺寸的匹萨价格,最后定义x2数组,预测它的价格。
输出的图形如下所示:
线性模型的回归系数w会保存在他的coef_方法中,截距保存在intercept_中。score(x,y,sample_weight=none) 评分函数,返回一个小于1的得分,可能会小于0。
1.diabetes数据集(糖尿病数据集)
糖尿病数据集包含442个患者的10个生理特征(年龄,性别、体重、血压)和一年以后疾病级数指标。
然后载入数据,同时将diabetes糖尿病数据集分为测试数据和训练数据,其中测试数据为最后20行,训练数据从0到-20行(不包含最后20行),即diabetes.data[:-20]。
输出结果如下所示,可以看到442个数据划分为422行进行训练回归模型,20行数据用于预测。输出的diabetes_x_test共20行数据,每行仅一个特征。
2.完整代码
改代码的任务是从生理特征预测疾病级数,但仅获取了一维特征,即一元线性回归。【线性回归】的最简单形式给数据集拟合一个线性模型,主要是通过调整一系列的参以使得模型的残差平方和尽量小。
线性模型:y = βx+b
x:数据 y:目标变量 β:回归系数 b:观测噪声(bias,偏差)
运行结果如下所示,包括系数、残差平方和、方差分数。
绘制图形如下所示,每个点表示真实的值,而直线表示预测的结果,比较接近吧。
同时绘制图形时,想去掉坐标具体的值,可增加如下代码:
下面是优化后的代码,增加了斜率、 截距的计算,同时增加了点图到线性方程的距离,保存图片设置像素。
运行结果如下所示:
绘制图形如下所示:
强烈推荐下面线性回归相关的文章,希望读者自行阅读:
希望文章对你有所帮助,上课内容还需要继续探索,这篇文章更希望你关注的是python代码如何实现的,因为数学不好,所以详细的推导过程,建议看文中的链接。
(by:eastmount 2016-10-28 半夜3点半 )