【机器学习06】多项式回归

7 多项式回归

若希望回归模型更好的拟合训练样本数据,可以使用多项式回归器

一元多项式回归

hθ(x)=θo1x+θ2x23x3+…+θnxn

将高次项看做对一次项特征(自变量)的扩展得到:

hθ(x)=θo1x12x23x3+…+θnxn

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

所以一元多项式回归的实现需要两个步骤:

  1. 将一元多项式回归问题转换为多元线性回归问题(只需给出多项式最高次数即可)
  2. 将步骤1得到多项式的结果中θ12…θn,当做样本特征交给线性回归器训练多元线性模型

使用Sklearn提供的数据管线实现两个步骤的顺序执行

# pipeline库:管道机制
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm

# 多元线性回归 ----> 一元多项式回归模型
model=pl.make_pipeline(
	sp.PolynomialFeatures(10),     # 多项式特征扩展器(1列扩展为多列)
    lm.LinearRegression()          # 线性回归器
)

案例:

import numpy as np
import matplotlib.pyplot as plt
# pipeline库:管道机制
import sklearn.pipeline as pl
# 数据预处理库
import sklearn.preprocessing as sp
# sklearn库
import sklearn.linear_model as lm

# 加载数据:读文本
def loaddata():
    # x,y=np.loadtxt("data/single.txt",delimiter=",",unpack=True)
    data=np.loadtxt("data/single.txt",delimiter=",")
    cols=data.shape[1]    # data.shape[1]:列数
    x=data[:,0:cols-1] 
    y=data[:,-1].reshape(-1,1)          # data[:,-1]:获取所有行的最后一列
    return x,y

x,y=loaddata()

# 绘制散点图
plt.figure(figsize=(10,6))
plt.title("Poly Regression",fontsize=18)
plt.grid(linestyle=":")
# s:散点大小
plt.scatter(x,y,s=70,color="dodgerblue",label="Sample Points")
plt.xlabel("x")
plt.ylabel("y")

## 多元线性回归 ----> 一元多项式回归模型
# 创建模型(数据管线)
model=pl.make_pipeline(
    sp.PolynomialFeatures(10),     # 多项式特征扩展器(1列扩展为多列)根据测试集的R2_score(R方值)为参考选择合适的拟合多项式最高次数
    lm.LinearRegression()          # 线性回归器
)
# 模型训练
model.fit(x,y)
# 模型预测
pred_y=model.predict(x)

# 评估当前模型效果
# sklearn库
import sklearn.metrics as sm

# MSE(均方误差):1/mΣ(实际输出-预测输出)^2
print("MSE(均方误差):",sm.mean_squared_error(y,pred_y))
# RMSE(均方根误差):SQRT(1/mΣ(实际输出-预测输出)^2)
print("RMSE(均方根误差):",np.sqrt(sm.mean_squared_error(y,pred_y)))
# R2_score(R方值):(0,1]区间的分值,即分数越高,误差越小
print("R2_score(R方值):",sm.r2_score(y,pred_y))

# 绘制多项式函数图像:从min最小值到max最大值拆分500个点
# 预测500个函数值,按顺序连线
x=np.linspace(x.min(),x.max(),500)
# 整理输入集(二维)
x=x.reshape(-1,1)                 # 变维度:n行1列(参数有-1时,维度会自动计算)
pred_y=model.predict(x)
plt.plot(x,pred_y,color="orangered",label="Regression Line")
plt.legend()
plt.show()

【机器学习06】多项式回归_第1张图片

你可能感兴趣的:(Python机器学习,机器学习,回归,sklearn,python)