Python机器学习:数据拟合与广义线性回归

谢谢大家支持,可以让有兴趣的人关注这个公众号。让知识传播的更加富有活力,谢谢各位读者。 很多人问博主为什么每次的头像是奥黛丽赫本,因为她是博主女神,每天看看女神也是不错的嘛!

查看之前文章请点击右上角,关注并且查看历史消息,谢谢您的阅读支持

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

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

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

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

代码如下:

[python] view plaincopy

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

量化投资与机器学习

知识、能力、深度、专业

勤奋、天赋、耐得住寂寞

原文发布于微信公众号 - 量化投资与机器学习(ZXL_LHTZ_JQXX)

原文发表时间:2016-02-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

程序员想搞机器学习?看看Nodejs之父这一年摸爬滚打的心路历程

本文是Nodejs之父Ryan Dahl在Google Brain做了一年深度学习后的心得体会,他在那里的目标是用机器学习将卓别林的老电影自动修改到4K画质。他...

4407
来自专栏ATYUN订阅号

Scikit-learn中文文档发布,Python爱好者们准备好了吗?

近日,Scikit-Learn中文文档已由开源组织ApacheCN完成校对,这对于国内机器学习用户有非常大的帮助。该中文文档依然包含了Scikit-Learn基...

2966
来自专栏PPV课数据科学社区

“小数据”的统计学

一、小数据来自哪里? 科技公司的数据科学、关联性分析以及机器学习等方面的活动大多围绕着”大数据”,这些大型数据集包含文档、 用户、 文件、 查询、 歌曲、 图片...

3556
来自专栏AI科技评论

学界 | 港中文AAAI录用论文详解:ST-GCN时空图卷积网络模型

AI 科技评论按:第 32 届 AAAI 大会(AAAI 2018)日前在美国新奥尔良进行,于当地时间 2 月 2 日至 7 日为人工智能研究者们带来一场精彩的...

5487
来自专栏量子位

GANs很难?这篇文章教你50行代码搞定(PyTorch)

作者:Dev Nag,Wavefront创始人、CTO,曾是Google、PayPal工程师。量子位编译。 2014年,Ian Goodfellow和他在蒙特利...

3485
来自专栏IT派

GANs很难?这篇文章教你50行代码搞定(PyTorch)

量子位编译自Medium,作者Dev Nag,数据可视化分析平台Wavefront创始人、CTO,曾是Google、PayPal工程师。

1292
来自专栏人工智能LeadAI

《机器学习基石》课程学习总结(二)

01 寻找函数g的pocket算法 前文提到,PLA算法有效的前提是D要是线性可分的,D中的数据可以看做由f产生而来。这样的假设过于理想化,现实中,D里面总会...

3946
来自专栏IT派

实战|如何利用深度学习诊断心脏病?

摘要: 本文探讨的是开发一个能够对心脏磁共振成像(MRI)数据集图像中的右心室自动分割的系统。到目前为止,这主要是通过经典的图像处理方法来处理的。而现代深度学习...

4383
来自专栏计算机视觉战队

一文读懂监督学习、无监督学习、半监督学习、强化学习这四种深度学习方式

一般说来,训练深度学习网络的方式主要有四种:监督、无监督、半监督和强化学习。在接下来的文章中,计算机视觉战队将逐个解释这些方法背后所蕴含的理论知识。除此之外,计...

2886
来自专栏量子位

称霸Kaggle的十大深度学习技巧

在各种Kaggle竞赛的排行榜上,都有不少刚刚进入深度学习领域的程序员,其中大部分有一个共同点:

1661

扫码关注云+社区

领取腾讯云代金券