python+sklearn实现多项式回归

本文所用文件的链接

链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ
提取码:p57s

多项式回归

一元多项式的一般形式:

y = w0 + w1 x + w2 x2 + w3 x3 + … wd xd

把一元多项式函数看做多元线性方程:

y = w0 + w1 x1 + w2 x2 + w3 x3 + … wd xd

所以一元多项式回归即可以看做多元线性回归, 可以使用LinearRegression模型对样本数据进行模型训练.

  1. 将一元多项式回归问题转换为多元线性回归问题.(只需给出最高次项的次数即可).
  2. 将1步骤中得到结果中w1 w2 … 当做样本特征, 交给线性回归器训练多元线性模型. 最终得到一组w0 w1 …使得损失函数接近极小值.
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm
# 通过管线(pipeline)把两个步骤连在一起执行
# 1. 多项式特征扩展器
# 2. 多元线性模型
model = pl.make_pipeline(
	sp.PolynomialFeatures(4),
    lm.LinearRegression()
)

  这里比较关键的是sp.PolynomialFeatures(4)中的这个数字参数,这个数字代表的是多项式的最高次项,下面展示不同最高次的图像,可以看出如果选择的不合适,会出现过拟合或者欠拟合。
过于简单的模型, 无论对于训练数据还是测试数据都无法给出足够高的预测精度, 这种现象称为欠拟合.

过于复杂的模型, 对于训练数据可以给出足够高的预测精度, 但是对于测试数据精度反而低. 这种现象称为过拟合.(模型训练过于依赖训练集)

所以一个性能可以接受的模型应该对训练集与测试集数据都有接近的预测精度, 而且精度不能太低.

"""
多项式回归
"""
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
import sklearn.metrics as sm
import sklearn.preprocessing as sp
import sklearn.pipeline as pl

x ,y = np.loadtxt('ml_data/single.txt', 
	delimiter=',', usecols=(0,1), 
	unpack=True)
# 把x改为n行1列  这样才可以作为输入交给模型训练
x = x.reshape(-1, 1)
# 训练多项式回归模型
model = pl.make_pipeline(
	sp.PolynomialFeatures(10), 
	lm.LinearRegression()
)
model.fit(x, y)
pred_y = model.predict(x)
# 为了绘制多项式模型曲线, 构建1000个点
test_x = np.linspace(x.min(), x.max(), 1000)
test_x = test_x.reshape(-1, 1)
pred_test_y = model.predict(test_x)


# 评估回归模型的误差
# 平均绝对值误差  1/m∑|预测输出-真实输出|
print(sm.mean_absolute_error(y, pred_y))
# 平均平方误差  sqrt(1/m∑(预测输出-真实输出)^2)
print(sm.mean_squared_error(y, pred_y))
# 中位数绝对值误差  median(|预测输出-真实输出|)
print(sm.median_absolute_error(y, pred_y))
# r2得分 (0,1]的一个分值,分数越高,误差越小
print(sm.r2_score(y, pred_y))

mp.figure('Linear Regression', facecolor='lightgray')
mp.title('Linear Regression', fontsize=18)
mp.xlabel('X', fontsize=16)
mp.ylabel('Y', fontsize=16)
mp.tick_params(labelsize=12)
mp.grid(linestyle=':')
mp.scatter(x, y, s=60, c='dodgerblue', 
	label='Points')
mp.plot(test_x, pred_test_y, c='orangered', 
	linewidth=2, label='Regression Line')
mp.legend()
mp.show()

最高项为3次时:
在这里插入图片描述
最高项为5次时:
在这里插入图片描述
最高项为7次时:
在这里插入图片描述
最高项为10次时:
在这里插入图片描述

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值