为了账号安全,请及时绑定邮箱和手机立即绑定

基于Sklearn的多项式回归算法与Pipeline使用详解

标签:
机器学习

图片描述
基本思想:
将X^2与X理解为两个不同特征,所以平方项会让数据增加一个特征。
从[X^2,X,1]角度看,是一个线性方程
从[X,1]角度看,是一个非线性方程

1.多项式回归的由来

且看代码,比较两种线性回归方式的拟合效果



import numpy as np 
import matplotlib.pyplot as plt 
x = np.random.uniform(-3,3,size = 100)
#sklearn输入数据是矩阵类型,将x转换成二维矩阵
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()
#图像见Figure1

#Method1
#用线性回归拟合数据集:lin_reg
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)

plt.scatter(x,y)
plt.plot(x,y_predict,color = 'r')
plt.show()
#图像见Figure2

#Method2
#从图像看,线性回归拟合得不够好
#解决:添加一个特征X2
X2 = np.hstack([X,X**2]) 
#新的数据集增加了一列
#用新的数据集进行线性回归拟合:lin_reg2
lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
y_predict2 = lin_reg2.predict(X2)

plt.scatter(x,y)
plt.plot(x,y_predict2,color = 'r')
plt.show()
#图像见Figure3 
#Figure3的问题:x是没有顺序的

#要生成平滑的曲线,需要对x进行排序
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color = 'r')
plt.show()
#图像见Figure4
#多项式回归采用线性回归的思路,对特征进行升维,解决了非线性问题




Figure1
图片描述
Figure2
图片描述
Figure3
图片描述
Figure4
图片描述

二,Sklearn实现多项式回归



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)

from sklearn.preprocessing import PolynomialFeatures
#degree :为数据添加几次幂
ploy = PolynomialFeatures(degree = 2)
ploy.fit(X)
X2 = ploy.transform(X)
#里面已经在第一列添加一列1了,所以不需要增加一列纯1的X0

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()
#结果同Figure4


PolynomialFeatures机制

图片描述

三,基于sklearn-Pipeline的多项式回归

每次进行多项式回归需要重复三个步骤:
1.多项式的特征
2.数据的归一化
3.线性回归
使用Pipeline可以将这三步合在一起,避免调用时的重复

_________________________________________________________

构造Pipeline时,传入的是一个列表
列表中包含:实现多项式回归的每一个步骤对应的那个类
每一个步骤对应的那个类:以元组的形式传入
每一个元组包含:1.表示步骤名称的字符串,2.需要实例化的操作

from sklearn.pipeline import Pipeline
poly_reg = Pipeline([
	        ("poly",PolynomialFeatures(degree = 2)),
		  ("std_scaler",StandardScaler()),
		  ("lin_reg",LinearRegression())
	])

__________________________________________________________
完整代码



import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.preprocessing import StandardScaler

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

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

poly_reg.fit(X,y)
#预测时使用Pipeline实例的predict
y_predict = poly_reg.predict(X)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消