前言

在面对一些简单的线性问题时。线性回归能够用一个直线较为精确地描述数据之间的关系。但对于复杂的非线性数据问题时。线性回归的效果就大大不如意了。对特征数据进行多项式变化,再使用线性回归的做法就能提高模型的拟合效果,这种方法就是多项式回归。

上面图中可以看到线性回归不能准确描述数据关系。无论一次方、二次方、三次方、四次方都不能单独完美拟合数据。在多项式中集成了一次方、二次方、三次方、四次方后使用线性回归就能完美拟合数据的非线性关系。


代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressionx = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 3*x**3 + 6 * x**2 + 4* x  + np.random.normal(0,10,100)
plt.scatter(x,y)
plt.show()


线性回归
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()


二次方
lin_reg2 = LinearRegression()
X2 = np.hstack([X**2])
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()


三次方
X3 = np.hstack([X**3])
lin_reg3 = LinearRegression()
lin_reg3.fit(X3,y)
y_predict3 = lin_reg3.predict(X3)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict3[np.argsort(x)],color='r')
plt.show()


四次方
X4 = np.hstack([X**4])
lin_reg4 = LinearRegression()
lin_reg4.fit(X4,y)
y_predict4 = lin_reg4.predict(X4)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict4[np.argsort(x)],color='r')
plt.show()


多项式回归
X_mut = np.hstack([X,X**2,X**3,X**4])
lin_reg_mut = LinearRegression()
lin_reg_mut.fit(X_mut,y)
y_predict_mut = lin_reg_mut.predict(X_mut)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict_mut[np.argsort(x)],color='r')
plt.show()


sklearn中多项式回归 (LinearRegression)

多项式回归本质上是线性回归,线性回归损失函数:
loss=ωmin12nsamples∣∣Xω−y∣∣22loss=\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2loss=ωmin2nsamples​1​∣∣Xω−y∣∣22​
PolynomialFeatures:多项式特征函数
StandardScaler:标准变换
LinearRegression:线性回归

def PolynomialRegression(degree):return Pipeline([("poly", PolynomialFeatures(degree=degree)),("std_scaler", StandardScaler()),("lin_reg", LinearRegression())])poly_reg = PolynomialRegression(degree=20)
poly_reg.fit(X_train, y_train)X_plot = np.linspace(-3, 3, 100).reshape(100, 1)
y_plot = poly_reg.predict(X_plot)plt.scatter(x, y)
plt.plot(X_plot[:,0], y_plot, color='r')
plt.axis([-3, 3, 0, 6])
plt.show()

多项式回归弊端

多项式回归很容易过拟合,学习过多噪音,得到的模型过于复杂。解决办法之一就是对模型进行正则化,惩罚模型中的参数,参数越复杂,惩罚越重。根据在损失函数中加入惩罚项的不同,分为岭回归、Lasso回归、弹性网络( Elastic Net)。


sklearn中岭回归 (Ridge)

岭回归损失函数:
loss=ωmin12nsamples∣∣Xω−y∣∣22+α2∣∣ω∣∣22loss=\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2+\frac{\alpha}{2}||\omega||_2^2loss=ωmin2nsamples​1​∣∣Xω−y∣∣22​+2α​∣∣ω∣∣22​
岭回归不断使损失函数趋于最小,也使 w 参数向量也趋于最小
PolynomialFeatures:多项式特征函数
StandardScaler:标准变换
Ridge:岭回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridgefrom sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegressiondef RidgeRegression(degree, alpha):return Pipeline([("poly", PolynomialFeatures(degree=degree)),("std_scaler", StandardScaler()),("ridge_reg", Ridge(alpha=alpha))])np.random.seed(42)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x + 3 + np.random.normal(0, 1, size=100)plt.scatter(x, y)
plt.show()from sklearn.model_selection import train_test_splitnp.random.seed(666)
X_train, X_test, y_train, y_test = train_test_split(X, y)def plot_model(model):X_plot = np.linspace(-3, 3, 100).reshape(100, 1)y_plot = model.predict(X_plot)plt.scatter(x, y)plt.plot(X_plot[:,0], y_plot, color='r')plt.axis([-3, 3, 0, 6])plt.show()ridge3_reg = RidgeRegression(20, 100)
ridge3_reg.fit(X_train, y_train)plot_model(ridge3_reg)


sklearn中Lasso回归 (Lasso)

Lasso回归损失函数:
loss=ωmin12nsamples∣∣Xω−y∣∣22+α∣∣ω∣∣1loss=\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2+\alpha||\omega||_1loss=ωmin2nsamples​1​∣∣Xω−y∣∣22​+α∣∣ω∣∣1​
Lasso回归不断使损失函数趋于最小,也使 w 参数向量中个别项变成0,固有特征选择的作用
PolynomialFeatures:多项式特征函数
StandardScaler:标准变换
Lasso:Lasso回归

from sklearn.linear_model import Lassodef LassoRegression(degree, alpha):return Pipeline([("poly", PolynomialFeatures(degree=degree)),("std_scaler", StandardScaler()),("lasso_reg", Lasso(alpha=alpha))])lasso1_reg = LassoRegression(20, 0.01)
lasso1_reg.fit(X_train, y_train)plot_model(lasso1_reg)


sklearn中弹性网络( Elastic Net)

Elastic Net回归损失函数:
ωmin12nsamples∣∣Xω−y∣∣22+αρ∣∣ω∣∣1+α(1−ρ)2∣∣ω∣∣22\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2+\alpha\rho||\omega||_1+\frac{\alpha(1-\rho)}{2}||\omega||_2^2ωmin2nsamples​1​∣∣Xω−y∣∣22​+αρ∣∣ω∣∣1​+2α(1−ρ)​∣∣ω∣∣22​
Elastic Net 兼顾岭回归和Lasso回归的特性,通过调整参数 p,来调整占比
PolynomialFeatures:多项式特征函数
StandardScaler:标准变换
ElasticNet:Elastic Net回归

from sklearn.linear_model import ElasticNet
def ElasticNetRegression(degree, alpha,ration):return Pipeline([("poly", PolynomialFeatures(degree=degree)),("std_scaler", StandardScaler()),("elasticNet_reg", ElasticNet(alpha=alpha,l1_ratio=ration))])elasticNet_reg = ElasticNetRegression(20, 0.01,0.5)
elasticNet_reg.fit(X_train, y_train)plot_model(elasticNet_reg)


机器学习 -- 多项式回归相关推荐

  1. 机器学习-多项式回归、正规方程(标准方程)

    机器学习-多项式回归 多项式回归 线性回归并不适用于所有数据,因此有时我们会选择使用曲线来回归数据. 也就是我们在选择特征的时候,可以选择多个特征来进行回归. 如图所示,二次方模型最后会一直向下,很显 ...

  2. 机器学习----多项式回归

    多项式回归简介 考虑下面的数据,虽然我们可以使用线性回归来拟合这些数据,但是这些数据更像是一条二次曲线,相应的方程是y=ax2+bx+c,这是式子虽然可以理解为二次方程,但是我们呢可以从另外一个角度来 ...

  3. python机器学习 多项式回归模型正则化(拉索,岭,弹性网)

    多项式回归模型正则化(拉索,岭,弹性网) 目录 多项式回归模型正则化(拉索,岭,弹性网) 一.多项式回归模型正则化: 1.L1正则化(lasso)回归 2.L2正则化(Ridge)回归 3.弹性网(E ...

  4. python机器学习 | 多项式回归和拟合

    多项式回归和拟合.正则化 1 多项式回归 1.1 介绍 1.2 回归实现 2 拟合&正则化 2.1拟合问题 2.1.1 拟合出现的类型 2.2 解决拟合出现的问题 3 正则化 3.1 介绍 3 ...

  5. 05机器学习--多项式回归与模型泛化及python实现

    目录 ①什么是多项式回归 ②scikit-learn中的多项式回归和Pipelin ③过拟合与欠拟合 ④验证数据集与交叉验证 ⑤回顾网格搜索 ⑥偏差方差权衡 ⑦解决过拟合问题--模型正则化1--岭回归 ...

  6. 机器学习-多项式回归算法

    文章目录 简介 原理 代码 过拟合 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 简介 多项式回归(Polynomial Regression)顾 ...

  7. 【Python机器学习】——多项式回归

    Python机器学习--多项式回归 文章目录 Python机器学习--多项式回归 一.Python机器学习 多项式回归 一.Python机器学习 多项式回归 多项式回归(Polynomial Regr ...

  8. 5 大常用机器学习模型类型总结

    本文介绍了 5 大常用机器学习模型类型:集合学习算法,解释型算法,聚类算法,降维算法,相似性算法,并简要介绍了每种类型中最广泛使用的算法模型.我们希望本文可以做到以下三点: 1.应用性. 涉及到应用问 ...

  9. 【机器学习】多项式回归原理介绍

    [机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 在上一节中我们介绍了线性回归的原理,然后分别用python和sklearn实现了不同变 ...

最新文章

  1. SpringMVC+MyBatis+Druid使用MySQL8.0.11版本
  2. 二叉树的概念、算法简介及树的平衡
  3. 遍历二叉树的神级方法(Morris)
  4. PHPExcel所遇到问题的知识点总结
  5. 2020-11-7( servlet)
  6. 插入排序之Java实现
  7. ue4 改变枢轴位置_UE4渲染模块概述(四)---反射
  8. linux获取其他主机ipv6,linux – 如何获取IPv6主机的范围?
  9. VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)
  10. Ubuntu20.04 pycharm python打包制作DEB包详细步骤及雷区
  11. C++:unordered_map
  12. kratos import 飘红问题
  13. 各大排序算法的Objective-C实现以及图形化演示比较
  14. requests库post方法如何传json类型的data
  15. 楼市捞金术:我是怎么在9个月把房价炒高两三倍的
  16. IOS学习之UITableView滚动到指定位置
  17. 汇编语言属于计算机科学,汇编语言是一种依赖于计算机的低级程序设计语言吗...
  18. html浮动垂直居中对齐,css如何设置垂直居中对齐?
  19. Python 入门学习路线
  20. 小白的jquery学习之路之04效果新闻向上无缝循环显示

热门文章

  1. 算法:乐团站位 【模拟 vs 大数】
  2. 机器学习 | MATLAB实现MLP多层感知机模型设计
  3. matlab数字滤波器设计实验,用MATLAB设计IIR数字滤波器
  4. [转]睡五分钟等于六钟头的方法
  5. 【天赢金创】Puppet Hacking Guide —— Puppet 的启动:子命令
  6. 二.求生之路2服务器的搭建(Windows)
  7. netfilter内核实现概述
  8. 推荐:翟鸿燊的国学讲座
  9. 基于ZYNQ+AD936X的开源SDR硬件
  10. 服务器系统盘内存突然满了,服务器内存盘突然满