多项式回归原理以及代码实现--机器学习

多项式回归

多项式回归使用的情况:当因变量y与自变量x为非线性关系时,线性关系不满足拟合状态,找不到合适的曲线拟合,可采用一元多项式回归(如 f ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 f(x)=\theta_{0}+\theta_{1}x+\theta_{2}x^{2}+\theta_{3}x^{3} f(x)=θ0+θ1x+θ2x2+θ3x3),通过增加x的高次项对实测点进行逼近,直到拟合结果满意为止。

要说这个多项式回归吧,其实也能看做线性模型的一种。我们把 x 2 x^{2} x2看作第二个特征 x 2 x_{2} x2,把 x 3 x^{3} x3看作第三个特征 x 3 x_{3} x3,从而将模型转化为线性回归模型,这样多项式回归的函数可以看作 f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 f(x)=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x_{3} f(x)=θ0+θ1x1+θ2x2+θ3x3,看,这样不就跟线性回归一样了嘛,所以严格的来说,区分线性与非线性并不是看特征值x,而是主要看参数 θ \theta θ。线性回归参数比如: θ 1 , θ 2 , . . . \theta_{1},\theta_{2},... θ1,θ2,...,非线性的参数比如: θ 1 θ 2 , θ 2 2 . . . \theta_{1}\theta_{2},\theta_{2}^{2}... θ1θ2,θ22...等,所以下面的代码中,我们可以用sklearn库中的线性回归训练

代码实现

首先,了解大概实现思路:

  1. 数据读取 ,既然是要对某一文件中的数据进行多项式回归,那么代码实现之前,少不了对数据文件的读取;
  2. 数据分割 ,用切片把文件中的数据分为特征值X与预测值Y;或者训练集train和测试集test
  3. 实现多项式回归训练预测 获取对象进行模型训练预测;
    1.首先将原本的数据集经过PolynomialFeatures处理转化为多项式对应的特征样本数据
    2.经过数据归一化处理,(degree)X次项越高,拟合效果越好,但预测能力会变差,过高会导致overfitting(过拟合)
    3.把新的数据集传给线性回归算法,训练模型
  4. 结果可视化使用matplotlib画图,将拟合结果可视化。

接下来进行代码的实现:(此代码没有分train和test数据)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_absolute_error
#1.读数据
data=np.loadtxt('F:/comdata/SO2.txt',delimiter=',',dtype=np.float32)
#2.数据分割
X=data[:,0].reshape((-1,1))#将X转为1列的二维矩阵,可以print输出看一下结果
Y=data[:,1].reshape((-1,1))#将Y转为1列的二维矩阵
#3.使用多项式回归
#处理转化为多项式对应的特征样本数据,degree是最高次幂的设置,一般默认为2
poly_reg=PolynomialFeatures(degree=3)
#将原本数据集 X 的每一种特征,转化为对应的多项式的特征
x_new=poly_reg.fit_transform(X)
 #print(x_new)
 #获取线性回归对象
linear=LinearRegression()
linear.fit(x_new,Y)#训练经过多项式处理的数据与y值的模型
y_predict=linear.predict(x_new)#使用处理的多项式数据,用模型进行预测,得出预测结果新的y值
plt.scatter(X,Y,c='r')#真实数据的散点图
plt.plot(X,y_predict,c='g')#预测数据可视化,看的是X和预测值y的关系
plt.show()

这里区分一下fit_transform()和tranform()
即fit_transform()的作用就是拟合数据,然后转化它将其转化为标准形式
tranform()的作用是通过找中心和缩放等实现标准化
fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法

具体可以点击看一下这篇:fit_transform()和tranform()详解

分train和test数据的代码如下:

import numpy as np
from sklearn.metrics import mean_absolute_error,mean_squared_error,median_absolute_error,r2_score#用于模型作评价使用
from sklearn.linear_model import LinearRegression#线性模型
from sklearn.model_selection import  train_test_split#用于分割训练集和测试集
from sklearn.preprocessing import PolynomialFeatures#多项式特征
import matplotlib.pyplot as plt

#1.读取数据
data = np.loadtxt("F:/comdata/SO2.txt", delimiter=",", dtype=np.float32)
#数据切片分割,转换为二维矩阵
X = data[:, 0].reshape(-1, 1)  # 特征集 二维矩阵
Y = data[:, 1].reshape(-1, 1)  # 目标(标签label)集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.8)#分为训练集和测试集数据,test样本占比80%

#使用一元线性回归(与多元线性回归结果可以做对比使用)
liner_model=LinearRegression()
liner_model.fit(X_train,y_train)#拟合
y_predict=liner_model.predict(X_test)
print("mse:",mean_squared_error(y_predict,y_test))
# plt.scatter(X_test,y_test)   #对测试集数据描点
# plt.plot(X_test,y_predict,c="red")
# plt.show()


#使用多项式回归
ploy=PolynomialFeatures(degree=2)#添加一个最高次项为2的多项式特征
X_train_new=ploy.fit_transform(X_train)
#将原本数据集 X 的每一种特征,转化为对应的多项式的特征,生成的多项式特征相应的数据集赋值给新的数据集
X_test_new=ploy.fit_transform(X_test)
#使用线性回归算法
liner_model=LinearRegression()
#把多项式特征数据传给线性回归拟合
liner_model.fit(X_train_new,y_train)
#预测y值
y_predict=liner_model.predict(X_test_new)
#模型评价:求模型的预测值与真实值均方误差,接近0的效果好
print("mse2:",mean_squared_error(y_predict,y_test))
plt.scatter(X_test,y_test)   #对测试集数据描点
plt.plot(X_test,y_predict,c="red")
plt.show()

数据集SO2部分如下
在这里插入图片描述
运行结果:
在这里插入图片描述

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值