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

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

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

本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。

拟合的目的是使得根据训练数据能够拟合出一个多项式函数,这个函数能够很好的拟合现有数据,并且能对未知的数据进行预测。

代码如下:

import matplotlib.pyplot as plt

import numpy as np

import scipy as sp

from scipy.stats import norm

from sklearn.pipeline import Pipeline

from sklearn.linear_model import LinearRegression

from sklearn.preprocessing import PolynomialFeatures

from sklearn import linear_model

''''' 数据生成 '''

x = np.arange(0, 1, 0.002)

y = norm.rvs(0, size=500, scale=0.1)

y = y + x**2

''''' 均方误差根 '''

def rmse(y_test, y):

return sp.sqrt(sp.mean((y_test - y) ** 2))

''''' 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档 '''

def R2(y_test, y_true):

return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum()

''''' 这是Conway&White《机器学习使用案例解析》里的版本 '''

def R22(y_test, y_true):

y_mean = np.array(y_true)

y_mean[:] = y_mean.mean()

return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true)

plt.scatter(x, y, s=5)

degree = [1,2,100]

y_test = []

y_test = np.array(y_test)

for d in degree:

clf = Pipeline([('poly', PolynomialFeatures(degree=d)),

('linear', LinearRegression(fit_intercept=False))])

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

y_test = clf.predict(x[:, np.newaxis])

print(clf.named_steps['linear'].coef_)

print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' %

(rmse(y_test, y),

R2(y_test, y),

R22(y_test, y),

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

plt.plot(x, y_test, linewidth=2)

plt.grid()

plt.legend(['1','2','100'], loc='upper left')

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误差,而且还具备优秀的预测能力。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python数据趋势算法_Python数据拟合与广义线性回归算法学习相关推荐

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

    用Python开始机器学习(数据拟合与广义线性回归) 原文:http://blog.csdn.net/lsldd/article/details/41251583 本文发现,有的时候,次数是100的时 ...

  2. python图形绘制星空图_Python数据可视化教程:基于Plotly的动态可视化绘图

    1. plotly 介绍 Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图, 下面我们以jupyter ...

  3. python数据科学库_Python数据科学库

    python数据科学库 什么是数据科学? (What is Data Science?) We live in an information age, where the challenge is t ...

  4. python前端框架实例_Python数据可视化:PyQt5 + ECharts框架实例

    引言 对于Python下桌面软件的开发已经有了很多数据可视化的库,如Matplotlib.Seaborn.Pyqtgraph.Plotly等等,但这些库更适合于后端程序员的软件开发. 实际上在前端网页 ...

  5. python降维之时间类型数据的处理_python数据预处理方式 :数据降维

    数据为何要降维 数据降维可以降低模型的计算量并减少模型运行时间.降低噪音变量信息对于模型结果的影响.便于通过可视化方式展示归约后的维度信息并减少数据存储空间.因此,大多数情况下,当我们面临高维数据时, ...

  6. python 访问网页 重定向_Python数据网络采集5--处理Javascript和重定向

    Python数据网络采集5--处理Javascript和重定向 到目前为止,我们和网站服务器通信的唯一方式,就是发出HTTP请求获取页面.有些网页,我们不需要单独请求,就可以和网络服务器交互(收发信息 ...

  7. python做前端可视化_Python数据可视化的四种简易方法

    摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据, ...

  8. python数据统计代码_Python 数据的累加与统计的示例代码

    问题 你需要处理一个很大的数据集并需要计算数据总和或其他统计量. 解决方案 对于任何涉及到统计.时间序列以及其他相关技术的数据分析问题,都可以考虑使用 Pandas库 . 为了让你先体验下,下面是一个 ...

  9. python中统计数据的总和_Python 数据的累加与统计的示例代码

    问题 你需要处理一个很大的数据集并需要计算数据总和或其他统计量. 解决方案 对于任何涉及到统计.时间序列以及其他相关技术的数据分析问题,都可以考虑使用 Pandas库 . 为了让你先体验下,下面是一个 ...

最新文章

  1. Application Installation Failed
  2. Web打印的解决方案之普通报表打印
  3. 广域存储和计算协同面临哪些挑战,具有哪些优势?
  4. tshark/wireshark抓包小结
  5. 集群服务器分析系统,集群服务器系统可扩展性的研究与实现
  6. 基于java的药品管理系统_基于Java药品管理系统
  7. Matlab来实现DDS功能
  8. fpga学习——zynq图像处理中的DVP流接口封装
  9. MATLAB 符号函数转换为数值函数?
  10. 中青杯数学建模竞赛是什么级别的比赛_2020年第三届中青杯全国大学生数学建模竞赛...
  11. ssm水电费管理系统java
  12. 数独基本规则_数独基本规则(数独游戏规则和技巧)
  13. 模电——电阻与电容并联作用
  14. ps aux指令詳解 http://blog.csdn.net/hanner_cheung/article/details/6081440
  15. 切换无线网卡失败服务器提示,无线网卡切换为AP模式时提示ICS启动失败的解决方法...
  16. Daimayuan Online Judge 上帝的集合
  17. python编程大赛队名_同行——团队展示
  18. 在线pdf转epub网站
  19. UC如被百度控股,手机qq浏览器改如何进攻和防守
  20. 关于find命令-perm 的用法

热门文章

  1. 自定义SOAP消息头
  2. ISP PIPLINE (九_2) Denoise 之 time domain denoise
  3. Java反射实践:从反射中理解class
  4. 使用Clonezilla克隆系统
  5. [实变函数]6 微分与不定积分
  6. ASP.Net中自定义Http处理及应用之HttpHandler篇
  7. Windows Server 2003 服务应用大全之DNS服务使用详解
  8. 300英雄服务器维护多久,300英雄7月19日停机更新公告
  9. php post可重复提交了,如何防止 POST 数据重复提交!
  10. c global 拦截 ajax,@RestControllerAdvice 全局拦截异常(示例代码)