# Python机器学习从原理到实践(2)：数据拟合与广义线性回归

[python] view plaincopy

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

y = 0.99268453x -0.16140183

1、误差分析

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

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

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

2、过拟合

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

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

821 篇文章178 人订阅

0 条评论

## 相关文章

### 【BicycleGAN】NIPS 2017论文图像转换多样化，大幅提升pix2pix生成图像效果

【导读】你一定记得非常热门的加州大学伯克利分校在CVPR2017上提出的图片翻译 pix2pix，它使用GAN方法可以将白马“转化”为斑马，可以把积木“转化”为...

1.6K5

### LSTM的简单介绍，附情感分析应用

? 长短期记忆网络，通常称为“LSTM”(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出...

3396

### 【破解人类识别文字之谜】对图像中的字母进行无监督学习

【新智元导读】Nature 子刊 Nature Human Behavior 上最新发表了一篇关于人类行为的研究，通过对自然图像中的字母进行无监督学习，探讨了人...

3147

3036

4224

2944

### A Tutorial on Network Embeddings

NE 的中心思想就是找到一种映射函数，该函数将网络中的每个节点转换为低维度的潜在表示

2193

### [计算机视觉论文速递] 2018-05-22

Amusi 将日常整理的论文都会同步发布到 daily-paper-computer-vision 上。名字有点露骨，还请见谅。喜欢的童鞋，欢迎star、for...

972

2845

3356