用Python开始机器学习(3:数据拟合与广义线性回归)

机器学习中的预测问题通常分为2类:回归分类

简单的说回归就是预测数值,而分类是给数据打上标签归类。

本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。

本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。
拟合的目的是使得根据训练数据能够拟合出一个多项式函数,这个函数能够很好的拟合现有数据,并且能对未知的数据进行预测。

代码如下:

[python] view plain copy

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import scipy as sp
  4. from scipy.stats import norm
  5. from sklearn.pipeline import Pipeline
  6. from sklearn.linear_model import LinearRegression
  7. from sklearn.preprocessing import PolynomialFeatures
  8. from sklearn import linear_model
  9. ‘‘‘‘‘ 数据生成 ‘‘‘
  10. x = np.arange(0, 1, 0.002)
  11. y = norm.rvs(0, size=500, scale=0.1)
  12. y = y + x**2
  13. ‘‘‘‘‘ 均方误差根 ‘‘‘
  14. def rmse(y_test, y):
  15. return sp.sqrt(sp.mean((y_test - y) ** 2))
  16. ‘‘‘‘‘ 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档  ‘‘‘
  17. def R2(y_test, y_true):
  18. return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum()
  19. ‘‘‘‘‘ 这是Conway&White《机器学习使用案例解析》里的版本 ‘‘‘
  20. def R22(y_test, y_true):
  21. y_mean = np.array(y_true)
  22. y_mean[:] = y_mean.mean()
  23. return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true)
  24. plt.scatter(x, y, s=5)
  25. degree = [1,2,100]
  26. y_test = []
  27. y_test = np.array(y_test)
  28. for d in degree:
  29. clf = Pipeline([(‘poly‘, PolynomialFeatures(degree=d)),
  30. (‘linear‘, LinearRegression(fit_intercept=False))])
  31. clf.fit(x[:, np.newaxis], y)
  32. y_test = clf.predict(x[:, np.newaxis])
  33. print(clf.named_steps[‘linear‘].coef_)
  34. print(‘rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f‘ %
  35. (rmse(y_test, y),
  36. R2(y_test, y),
  37. R22(y_test, y),
  38. clf.score(x[:, np.newaxis], y)))
  39. plt.plot(x, y_test, linewidth=2)
  40. plt.grid()
  41. plt.legend([‘1‘,‘2‘,‘100‘], loc=‘upper left‘)
  42. plt.show()

该程序运行的显示结果如下:

[-0.16140183  0.99268453]
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82

[ 0.00934527 -0.03591245  1.03065829]
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[  6.07130354e-02  -1.02247150e+00   6.66972089e+01  -1.85696012e+04
......

-9.43408707e+12  -9.78954604e+12  -9.99872105e+12  -1.00742526e+13
-1.00303296e+13  -9.88198843e+12  -9.64452002e+12  -9.33298267e+12
  -1.00580760e+12]

rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89

显示出的coef_就是多项式参数。如1次拟合的结果为

y = 0.99268453x -0.16140183

这里我们要注意这几点:

1、误差分析

做回归分析,常用的误差主要有均方误差根(RMSE)和R-平方(R2)。

RMSE是预测值与真实值的误差平方根的均值。这种度量方法很流行(Netflix机器学习比赛的评价方法),是一种定量的权衡方法。

R2方法是将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况。

R2的计算方法,不同的文献稍微有不同。如本文中函数R2是依据scikit-learn官网文档实现的,跟clf.score函数结果一致。

而R22函数的实现来自Conway的著作《机器学习使用案例解析》,不同在于他用的是2个RMSE的比值来计算R2。

我们看到多项式次数为1的时候,虽然拟合的不太好,R2也能达到0.82。2次多项式提高到了0.88。而次数提高到100次,R2也只提高到了0.89。

2、过拟合

使用100次方多项式做拟合,效果确实是高了一些,然而该模型的据测能力却极其差劲。

而且注意看多项式系数,出现了大量的大数值,甚至达到10的12次方。

这里我们修改代码,将500个样本中的最后2个从训练集中移除。然而在测试中却仍然测试所有500个样本。

clf.fit(x[:498, np.newaxis], y[:498])

这样修改后的多项式拟合结果如下:

[-0.17933531  1.0052037 ]
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935  0.01922011  0.99193521]
rmse=0.10, R2=0.90, R22=0.69, clf.score=0.90

...

rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57

仅仅只是缺少了最后2个训练样本,红线(100次方多项式拟合结果)的预测发生了剧烈的偏差,R2也急剧下降到0.57。

而反观1,2次多项式的拟合结果,R2反而略微上升了。

这说明高次多项式过度拟合了训练数据,包括其中大量的噪音,导致其完全丧失了对数据趋势的预测能力。前面也看到,100次多项式拟合出的系数数值无比巨大。人们自然想到通过在拟合过程中限制这些系数数值的大小来避免生成这种畸形的拟合函数。

其基本原理是将拟合多项式的所有系数绝对值之和(L1正则化)或者平方和(L2正则化)加入到惩罚模型中,并指定一个惩罚力度因子w,来避免产生这种畸形系数。

这样的思想应用在了岭(Ridge)回归(使用L2正则化)、Lasso法(使用L1正则化)、弹性网(Elastic net,使用L1+L2正则化)等方法中,都能有效避免过拟合。更多原理可以参考相关资料。

下面以岭回归为例看看100次多项式的拟合是否有效。将代码修改如下:

clf = Pipeline([(‘poly‘, PolynomialFeatures(degree=d)),
                    (‘linear‘, linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400])

结果如下:

[ 0.          0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0.          0.35936882  0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[  0.00000000e+00   2.63903249e-01   3.14973328e-01   2.43389461e-01
   1.67075328e-01   1.10674280e-01   7.30672237e-02   4.88605804e-02
   ......
   3.70018540e-11   2.93631291e-11   2.32992690e-11   1.84860002e-11
   1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90

可以看到,100次多项式的系数参数变得很小。大部分都接近于0.

另外值得注意的是,使用岭回归之类的惩罚模型后,1次和2次多项式回归的R2值可能会稍微低于基本线性回归。

然而这样的模型,即使使用100次多项式,在训练400个样本,预测500个样本的情况下不仅有更小的R2误差,而且还具备优秀的预测能力。

时间: 2024-08-28 09:49:07

用Python开始机器学习(3:数据拟合与广义线性回归)的相关文章

用Python开始机器学习(7:逻辑回归分类) --好!!

from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到过回归算法来进行数值预测.逻辑回归算法本质还是回归,只是其引入了逻辑函数来帮助其分类.实践发现,逻辑回归在文本分类领域表现的也很优秀.现在让我们来一探究竟. 1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小

python遗传算法实现数据拟合

python据说功能强大,触角伸到各个领域,网上搜了一下其科学计算和工程计算能力也相当强,具备各种第三方包,除了性能软肋外,其他无可指摘,甚至可以同matlab等专业工具一较高下. 从网上找了一个使用遗传算法实现数据拟合的例子学习了一下,确实Python相当贴合自然语言,终于编程语言也能说人话了,代码整体简洁.优雅.. 代码功能:给出一个隐藏函数 例如 z=x^2+y^2,生成200个数据,利用这200个数据,使用遗传算法猜测这些数据是什么公式生成的. (说的太直白,一点都不高大上) 代码如下:

python入门机器学习,3行代码搞定线性回归

本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. "机器学习"对于普通大众来说可能会比较陌生,但是"人工智能"这个词简直是太火了,即便是风云变化的股市中,只要是与人工智能.大数据.云计算相关的概念股票都会有很好的表现.机器学习是实现人工智能的基础,今天早上看了美国著名演员威尔斯密斯和世界最顶级的机器人进行对话的视频,视频中的机器人不论从语言还是表情都表达的非常到位,深感人工智能真的离我们越来越近了,所以学习人工智能前

如何解决机器学习中数据不平衡问题

作者:无影随想 时间:2016年1月. 出处:http://www.zhaokv.com/2016/01/learning-from-imbalanced-data.html 声明:版权所有,转载请联系作者并注明出处 这几年来,机器学习和数据挖掘非常火热,它们逐渐为世界带来实际价值.与此同时,越来越多的机器学习算法从学术界走向工业界,而在这个过程中会有很多困难.数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一. 一.数据不平衡 在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是

用Python开始机器学习(2:决策树分类算法)

http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树算法 决策树用树形结构对样本的属性进行分类,是最直观的分类算法,而且也可以用于回归.不过对于一些特殊的逻辑分类会有困难.典型的如异或(XOR)逻辑,决策树并不擅长解决此类问题. 决策树的构建不是唯一的,遗憾的是最优决策树的构建属于NP问题.因此如何构建一棵好的决策树是研究的重点. J. Ross Q

机器学习00:如何通过Python入门机器学习

我们都知道机器学习是一门综合性极强的研究课题,对数学知识要求很高.因此,对于非学术研究专业的程序员,如果希望能入门机器学习,最好的方向还是从实践触发. 我了解到Python的生态对入门机器学习很有帮助.因此希望以此作为突破口入门机器学习. 我将会记录一个系列的学习与实践记录.记录内容主要参考Youtube中sentdex发布的视频,有兴趣的读者可以自己FQ到油管看一下. 下面介绍一下我将如何通过Python入门机器学习. 学习Python基本语法 首先我在Python官网找到入门教程,快速过了一

python中matplotlib实现最小二乘法拟合的过程详解

这篇文章主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧. 前言 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法还

Python相关机器学习‘武器库’

开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多优秀的Python工具包可供使用,所以作为Pythoner,也是相当幸福的.如果仔细留意微博和论坛,你会发现很多这方面的分享,自己也Google了一下,发现也有同学总结了"Python机器学习库",不过总感觉缺少点什么.最近流行一个词,全栈工

从Python开始机器学习

目前机器学习红遍全球.男女老少都在学机器学习模型,分类器,神经网络和吴恩达.你也想成为一份子,但你该如何开始? 在这篇文章中我们会讲Python的重要特征和它适用于机器学习的原因,介绍一些重要的机器学习包,以及其他你可以获取更详细资源的地方. 加qq群813622576免费领取学习资料 为什么用Python做机器学习 Python很适合用于机器学习.首先,它很简单.如果你完全不熟悉Python但是有一些其他的编程经验(C或者其他编程语言),要上手是很快的.其次,Python的社区很强大.这使得P