Bobo老师机器学习笔记第八课-多项式回归

问题1: 什么是多项式回归?

以前我们学习了线性回归,但是线性回归比较适用于数据之间明显线性关系的。但有时我们使用的数据不一定它们之间有线性关系。那么这时候就要用到多项式回归。多项式我们以前学过,那么多项式的回归方程就类似于

问题2: 那么非线性的数据,我们如何做呢,比如下面数据?

如果利用上面的数据我们进行线性回归,结果是下面的

通过上图可以看出来,上面这条直线对数据回归不太好。回归的准确率也是50%。明显这个效果是不太理想的。 

针对这种情况,应该如何处理呢? 

由于这个数据我们大概能看出来是一个2次方的。所以我们可以原来基础数据上X在增加一个特征X**X。 

扫描二维码关注公众号,回复: 4371319 查看本文章

很显然上图回归的效果要好的多, 我们看看参数:

0.5758300432861141 [0.91972786 0.52439824] 

截图是0.57, X的系数是0.9, X**2的系数是0.5。 

这个系数和我们最初设置参数(y = 0.5 * x ** 2 + x + 0.6 + np.random.normal(0, 1., size=100)  )和相近。

问题3: 在上图中,我们增加了一个特征,从而使得一维升级到二维数据。但是在日常的数据中,我们又怎么知道是添加一个特征值还是多个特征值了,并且我们如何添加的这个特征的值是什么呢? 

在这里sklearn给我提供了一个方法,PolynomialFeatures,这个类专门生成由所有多项式组合组成的新特征矩阵, 度数小于或等于指定度数的特征.可以通过这样引入:

from sklearn.preprocessing import PolynomialFeatures

通过绘图可以看到,利用polynomialfeature处理的数据训练的结果和我们预期的相同。

训练的结果:(0.6407352027144722, array([0.        , 0.9814608 , 0.47231414]))

0.6是截距,0是因为经过polynomialfeature处理会在增加首列为1.下文可以看到。 0.98和0.47是我们要求的参数
('X.shape:', (100L, 1L))
('X_ploy.shape:', (100L, 3L))
[[ 0.07775644]
 [-1.77960351]]
[[ 1.          0.07775644  0.00604606]
 [ 1.         -1.77960351  3.16698866]]

运行结果中可以看出:

1、 X原先是100x1的矩阵,经过处理变成100x3的矩阵。打印出前2行,可以通过经过多项式处理后的数据增加了两列。

第一列是常数1,第三列是原来数据的平方。为什么是平方? 因为输入的矩阵只有1列,所有是按照X的0次幂,X的1次幂,X的次幂。如果是2列(a, b)结果就是[1, a, b, a^2, ab, b^2] 。 默认degress=2。

本例子中实例代码:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import P

x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x ** 2 + x + 0.6 + np.random.normal(0, 1., size=100)

# 简单绘制测试数据
'''

reg = LinearRegression()
reg.fit(X, y)
plt.scatter(x, y)
plt.show()
'''

# 方法一 增加一个X**2的特征

'''
reg = LinearRegression()
X2 = np.hstack([X, X ** 2])
reg.fit(X2, y)
y_predict = reg.predict(X2)
print (reg.intercept_, reg.coef_)
plt.scatter(x, y)
# 此处要注意,要根据X从小到大进行排序
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')
plt.show()
'''

# 使用PolynomialFeatures

poly = PolynomialFeatures()
poly.fit(X)
X_ploy = poly.transform(X)
reg = LinearRegression()
reg.fit(X_ploy, y)
y_predict = reg.predict(X_ploy)
print ( reg.intercept_, reg.coef_)
print ('X.shape:',X.shape)
print('X_ploy.shape:', X_ploy.shape)
print (X[:2, :])
print(X_ploy[:2, :])
plt.scatter(x, y)
# 此处要注意,要根据X从小到大进行排序
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')
plt.show()



参考文章:

【机器学习】多项式回归 

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

猜你喜欢

转载自blog.csdn.net/sxb0841901116/article/details/83959860