机器学习 — 多项式回归

机器学习 — 多项式回归前言在面对一些简单的线性问题时。线性回归能够用一个直线较为精确地描述数据之间的关系。但对于复杂的非线性数据问题时。线性回归的效果就大大不如意了。对特征数据进行多项式变化,再使用线性回归的做法就能提高模型的拟合效果,这种方法就是多项式回归。从面对上图1中的数据,线性回归不能准确描述数据关系。无论一次方、二次方、三次方、四次方都不能单独完美拟合数据。在多项式中集成了一次方、二次方、三次方、四次方…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

前言

在面对一些简单的线性问题时。线性回归能够用一个直线较为精确地描述数据之间的关系。但对于复杂的非线性数据问题时。线性回归的效果就大大不如意了。对特征数据进行多项式变化,再使用线性回归的做法就能提高模型的拟合效果,这种方法就是多项式回归。
在这里插入图片描述
上面图中可以看到线性回归不能准确描述数据关系。无论一次方、二次方、三次方、四次方都不能单独完美拟合数据。在多项式中集成了一次方、二次方、三次方、四次方后使用线性回归就能完美拟合数据的非线性关系。


代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

x = 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()

Jetbrains全家桶1年46,售后保障稳定

在这里插入图片描述


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

多项式回归本质上是线性回归,线性回归损失函数:
l o s s = ω m i n 1 2 n s a m p l e s ∣ ∣ X ω − y ∣ ∣ 2 2 loss=\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2 loss=ωmin2nsamples1Xωy22
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)

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

def 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_split

np.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回归损失函数:
l o s s = ω m i n 1 2 n s a m p l e s ∣ ∣ X ω − y ∣ ∣ 2 2 + α ∣ ∣ ω ∣ ∣ 1 loss=\stackrel{\mathrm{min}}{\omega} \frac{1}{2n_{samples}}||X\omega-y||_2^2+\alpha||\omega||_1 loss=ωmin2nsamples1Xωy22+αω1
Lasso回归不断使损失函数趋于最小,也使 w 参数向量中个别项变成0,固有特征选择的作用
PolynomialFeatures:多项式特征函数
StandardScaler:标准变换
Lasso:Lasso回归

from sklearn.linear_model import Lasso

def 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回归损失函数:
ω m i n 1 2 n s a m p l e s ∣ ∣ X ω − y ∣ ∣ 2 2 + α ρ ∣ ∣ ω ∣ ∣ 1 + α ( 1 − ρ ) 2 ∣ ∣ ω ∣ ∣ 2 2 \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 ωmin2nsamples1Xωy22+αρω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)

在这里插入图片描述


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230815.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle 11g下载及安装

    Oracle 11g下载及安装Oracle11g下载及安装前言Oracle11g下载Oracle11g安装1.引入库2.读入数据总结前言因为笔者公司所用数据库是oracle,新同事来了都会习惯下重装电脑,所以记录下oracle的下载及安装。Oracle11g下载进入oracle官网,看到如下视图,点击进入oracle官网点击Products,选择OracleDatabase此时进入oracle数据库的详情页面,选择一个长期发行版本进行下载,此时长期发行的版本为19c选择下载19c的下载按钮,进入下载

    2022年5月29日
    33
  • 【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置

    【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置目录1、前言2、树莓派4B有什么特色?3、树莓派新手准备4、烧录RaspbianBuster系统到MicroSD卡开启SSH及配置无线连接5、启动安装树莓派系统启动树莓派6、树莓派的基本配置6.1系统配置6.2更改apt软件源与系统源6.3更改pip源6.4安装远程桌面6.5安装中文字体1、前言对于很多程序员而言,树莓派如今…

    2022年6月12日
    74
  • 网站被篡改_网页内容修改

    网站被篡改_网页内容修改   NetCMS的相关新闻显示是根据新闻的Tag来查找所有具有相同的Tag的新闻,然后将其显示的。如,某条新闻的Tag是“工资|奖金”,那么会用下列SQL语句来查找具有相同Tag的新闻:selecttop5*fromahjdcw.NT_NewsWhere[isRecyle]=0And[isLock]=0And[SiteID]=0   And([Tags]L

    2022年9月30日
    0
  • J1939协议之通俗易懂—-简介

    J1939协议之通俗易懂—-简介J1939简介 J1939协议简介J1939协议是由美国汽车工程师协会(SAE)(SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN(控制器区域网络,ISO11898)上。物理层(J1939/11)描述了针对客车的电气接口。数据链路层描述…

    2022年5月1日
    314
  • 如何简单运行Java程序

    如何简单运行Java程序本章开始,我们需要下苦功打基础,目标是完成一个会员管理系统哦!如何运行Java程序,用java命令即可,一定不要忘了写main方法哦,一个java文件里面可以写很多个class。步骤1java文件等于java类吗问大家一个问题,你认为java文件是java类吗?你可以用记事本写一个Demo.java的文本文件,编码是ansi,如果你的windows系统是简体中文的,那么所谓的ansi,其实就和GBK是一样的。在这个文件里,你可以写很多的class,但是声明为public的class只能有一个。

    2022年7月7日
    29
  • ScheduledExecutorService 延迟 / 周期执行线程池

    ScheduledExecutorService 延迟 / 周期执行线程池目录Executor结构图ScheduleExecutorService简述对象创建方式方法详解scheduleRunnablescheduleCallablescheduleAtFixedRatescheduleWithFixedDelay本文可参考《线程池理论2》Executor结构图ScheduleExecutorService…

    2022年5月5日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号