8-1 多项式回归

本文介绍了多项式回归的概念,通过实例展示了如何使用scikit-learn库进行多项式回归,包括使用Pipeline进行特征转换、数据归一化和线性回归。讨论了PolynomialFeatures类的作用,并提醒了过拟合和欠拟合的风险。
摘要由CSDN通过智能技术生成

什么是多项式回归

改进线性回归法,使其可以对非线性的数据进行处理和预测,这就是多项式回归法
在这里插入图片描述 x x x是样本的一个特征
在这里插入图片描述
x x x x 2 x^2 x2非别看成样本的特征
 

多项式回归¶

import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform(-3,3,size=100)#在-3到3之间随意的生成100个数
X = x.reshape(-1,1)
y = 0.5 * x ** 2 + x + 2 + np.random.normal(0,1,size=100)
plt.scatter(x,y)
plt.show()

输出图片:
在这里插入图片描述
使用直线来拟合图像

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
输出:LinearRegression()
y_predict = lin_reg.predict(X)

plt.scatter(x,y)
plt.plot(x,y_predict,color='r')
plt.show()#拟合效果不太理想

输出图片:
在这里插入图片描述
解决方案,添加一个特征

(X ** 2).shape
输出:(100, 1)

X2 = np.hstack([X,X**2])
X2.shape
输出:(100, 2)

lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
y_predict2 = lin_reg2.predict(X2)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color='r')#要对x进行排序,以及对应的y进行排序,才会得到平滑的曲线
plt.show()

输出图片:
在这里插入图片描述

lin_reg2.coef_#得到x和x平方前面的系数
array([0.98527017, 0.50047576])
lin_reg2.intercept_#得到截距
1
lin_reg2.intercept_#得到截距
2.089973878551355

PCA算法是对数据进行降维处理,而多项式回归算法让数据集升维,在给数据集添加新的特征后使得算法可以更好的拟合高维度的相应的数据

scikit-learn中的多项式回归和Pipeline

import numpy as np
import matplotlib.pyplot as plt

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

from sklearn.preprocessing import PolynomialFeatures
样本转化为多项式的特征

poly = PolynomialFeatures(degree=2)#表示为原本数据集添加最多几次幂的特征
poly.fit(X)
X2 = poly.transform(X)#将样本转化为多项式的特征
X2.shape
输出:(100, 3)

X2[:5,:]#第一列是x的0次方,第二列是x的一次方,第三列是x的二次方
输出:array([[ 1.        ,  2.290224  ,  5.24512598],
       [ 1.        ,  2.57354259,  6.62312144],
       [ 1.        ,  2.59266716,  6.72192302],
       [ 1.        , -2.43631319,  5.93562194],
       [ 1.        , -0.99412672,  0.98828794]])

X[:5,:]
输出:array([[ 2.290224  ],
       [ 2.57354259],
       [ 2.59266716],
       [-2.43631319],
       [-0.99412672]])

from sklearn.linear_model import LinearRegression

lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
y_predict2 = lin_reg2.predict(X2)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color='r')
plt.show()

输出图片:
在这里插入图片描述

lin_reg2.coef_
输出:array([0.        , 0.99304709, 0.46258612])

lin_reg2.intercept_
输出:1.9929786260201396

关于PolynomialFeatures

X = np.arange(1,11).reshape(-1,2)
X.shape
输出:(5, 2)

X
输出:array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]])

poly = PolynomialFeatures(degree=2)
poly.fit(X)
X2 = poly.transform(X)
X2.shape
输出:(5, 6)


X2#第一列是x的0次方,第二三列是原来的X中的特征,第四六列是X中原来数的平方,第五列是原来两列数相乘得到的
输出:array([[  1.,   1.,   2.,   1.,   2.,   4.],
       [  1.,   3.,   4.,   9.,  12.,  16.],
       [  1.,   5.,   6.,  25.,  30.,  36.],
       [  1.,   7.,   8.,  49.,  56.,  64.],
       [  1.,   9.,  10.,  81.,  90., 100.]])

当degree = 3的时候,对应的X3中每行有10个特征
在这里插入图片描述

关于Pipeline

我们在使用多项式回归时大致需要三个过程:多项式的特征(用PolynomialFeatures的方式生成)、数据的归一化(样本特征数据差异较大的情况下)、线性回归。而Pipeline可以帮助我们将这三部合在一起,使得我们每次调用的时候不需要再重复这三步

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


from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

poly_reg = Pipeline([
    ("poly",PolynomialFeatures(degree=2)),
    ("std_scaler",StandardScaler()),
    ("lin_reg",LinearRegression())
])

poly_reg.fit(X,y)
y_predict = poly_reg.predict(X)


plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()

输出图片:
在这里插入图片描述
多项式回归这样的方式虽然可以非常方便的对非线性的数据进行拟合,但是这个拟合的过程是有陷阱的,可能出现过拟合或者欠拟合的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值