ccc-sklearn-12-线性回归(2)

news2024/9/24 3:21:44

一、非线性问题:多项式回归
主要探讨:通过线性回归解决非线性问题
数据的线性与非线性
通常情况下,分类问题中决策函数往往是一个分段函数,这个函数明显不满足可以用一条直线进行表示的属性,因此分类问题中特征与标签[0,1]或者[-1,1]之间关系明显是非线性的。需要注意的是,回归图像绘制时,横坐标的特征,纵坐标是标签;分类中,横坐标与纵坐标分别是2个特征,前者数据分布若能为一条直线,则是线性的,后者若分布能使用一条直线来划分类别则是线性可分的

线性模型与非线性模型
回归中,线性数据可以使用如下的方程进行拟合:
y = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 3 + . . . w n x n y=w_0+w_1x_1+w_2x_2+w_3x_3+...w_nx_n y=w0+w1x1+w2x2+w3x3+...wnxn
这就是线性回归的方程,根据线性回归的方程可以拟合一组参数w从而建立一个线性回归模型。可以看到线性模型的一个特点:自变量都是一次项

建立一个明显非线性数据观察线性回归和决策树在拟合时的表现:
数据准备:

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

rnd = np.random.RandomState(42)
X = rnd.uniform(-3,3,size=100)

y = np.sin(X) + rnd.normal(size=len(X))/3
plt.scatter(X,y,marker='o',c='k',s=20)
plt.show()

在这里插入图片描述
建模处理:

X.shape
#sklearn只能接受二维以上作为特征矩阵的输入
X = X.reshape(-1,1)
LinearR = LinearRegression().fit(X,y)
TreeR = DecisionTreeRegressor(random_state=0).fit(X,y)
fig,ax1 = plt.subplots(1)
line = np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)
ax1.plot(line,LinearR.predict(line),linewidth=2,color='green',label="linear regression")
ax1.plot(line,TreeR.predict(line),linewidth=2,color='red',label='decision tree')
ax1.plot(X[:,0],y,'o',c='k')
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Result before discretization")
plt.tight_layout()
plt.show()

在这里插入图片描述
可以看到,线性回归基本上无法拟合正弦曲线,而决策树又明显过拟合。实际上,机器学习中线性模型也可以用来拟合非线性数据,非线性模型也可以用来拟合线性数据,接下来将一一探讨

  • 非线性模型拟合线性数据
    在这里插入图片描述
    线性数据对于非线性模型来说太简单,很容易导致训练集上 R 2 R^2 R2训练的很高,MSE训练的很低
  • 线性模型拟合非线性数据
    在这里插入图片描述
    一般用线性模型拟合非线性数据或者对非线性数据可分的数据进行分类,通常表现都很差。通常可以通过分箱的方式改善线性模型在非线性数据上的表现。线性模型的决策边界是平行的直线,而非线性模型的决策边界通常是曲线或者交叉的直线;对分类问题而言,如果一个分类模型的决策边界上自变量的最高次方为1,则称这个模型是线性模型
  • 还有即支持线性和非线性模型的支持向量机,不进行建模的KNN等
线性模型非线性模型
代表模型线性回归,逻辑回归,弹性网,感知机决策树,树的集成模型,使用高斯核的SVM
模型特点模型简单,运行速度快模型复杂,效果好,但速度慢
数学特征:回归自变量是一次项自变量不都是一次项
分类决策边界上的自变量都是一次项决策边界上的自变量不都是一次项
可视化: 回归拟合出的图像是一条直线拟合出的图像不是一条直线
分类决策边界在二维平面是一条直线决策边界在二维平面不是一条直线
擅长数据类型主要是线性数据,线性可分数据所有数据

二、使用分箱处理非线性问题

分箱也就是离散化,数据准备和处理和上一节相同
使用分箱进行建模和绘图

from sklearn.preprocessing import KBinsDiscretizer
enc = KBinsDiscretizer(n_bins=10,encode="onehot")
X_binned = enc.fit_transform(X)
line_binned = enc.fit_transform(line)
import pandas as pd 
pd.DataFrame(X_binned.toarray()).head()

fig,(ax1,ax2) = plt.subplots(ncols=2,sharey=True,figsize=(10,4))

ax1.plot(line,LinearR.predict(line),linewidth=2,color='green',label="linear regression")
ax1.plot(line,TreeR.predict(line),linewidth=2,color='red',label='decision tree')
ax1.plot(X[:,0],y,'o',c='k')
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Result before discretization")
LinearR_ = LinearRegression().fit(X_binned,y)
TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned,y)

ax2.plot(line,
        LinearR_.predict(line_binned),
        linewidth=2,
        color='green',
        label='linear regression')
ax2.plot(line,TreeR_.predict(line_binned),linewidth=2,color='red',
        linestyle=':',label='decision tree')
ax2.vlines(enc.bin_edges_[0],
          *plt.gca().get_ylim(),
          linewidth=1,alpha=.2)
ax2.plot(X[:,0],y,'o',c='k')
ax2.legend(loc="best")
ax2.set_xlabel("Input feature")
ax2.set_title("Result after discretization")
plt.tight_layout()
plt.show()

在这里插入图片描述
图像上可以看出,离散后线性回归和决策树预测相一致,也缓解了过拟合现象。当然,一般不使用分箱解决过拟合问题,因为树模型自身带有丰富有效的剪枝功能来防止
箱子数量对于模型结果的影响以及选取最优箱子数

enc = KBinsDiscretizer(n_bins=5,encode="onehot")
X_binned = enc.fit_transform(X)
line_binned = enc.fit_transform(line)

fig,ax2 = plt.subplots(1,figsize=(5,4))
LinearR_ = LinearRegression().fit(X_binned,y)
TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned,y)
ax2.plot(line,
        LinearR_.predict(line_binned),
        linewidth=2,
        color='green',
        label='linear regression')
ax2.plot(line,
        TreeR_.predict(line_binned),linewidth=2,color='red',
        linestyle=':',label='decision tree')
ax2.vlines(enc.bin_edges_[0],
          *plt.gca().get_ylim(),
          linewidth=1,alpha=.2)
ax2.plot(X[:,0],y,'o',c='k')
ax2.legend(loc="best")
ax2.set_xlabel("Input feature")
ax2.set_title("Result after discretization")
plt.tight_layout()
plt.show()

在这里插入图片描述
曲线拟合更加宽泛,理所当然的拟合效果没那么好,分箱会导致过拟合

from sklearn.model_selection import cross_val_score as CVS
import numpy as np
pred,score,var = [],[],[]
binsrange = [2,5,10,15,20,30]
for i in binsrange:
    enc = KBinsDiscretizer(n_bins=i,encode="onehot")
    X_binned = enc.fit_transform(X)
    line_binned = enc.fit_transform(line)
    LinearR_ = LinearRegression()
    cvresult = CVS(LinearR_,X_binned,y,cv=5)
    score.append(cvresult.mean())
    var.append(cvresult.var())
    pred.append(LinearR_.fit(X_binned,y).score(line_binned,np.sin(line)))
    
plt.figure(figsize=(6,5))
plt.plot(binsrange,pred,c="orange",label="test")
plt.plot(binsrange,score,c="k",label="full data")
plt.plot(binsrange,score+np.array(var)*0.5,c="red",linestyle="--",label="var")
plt.plot(binsrange,score-np.array(var)*0.5,c="red",linestyle="--")
plt.legend()
plt.show()

在这里插入图片描述
尽管测试数据和全数据集的分数不同,但总体趋势相似。如今工业场景中使用大量离散化特征的情况已经不多见了。

多项式回归PolynomialFeatures
在这里插入图片描述
线性模型中升维工具就是多项式变化。通过自变量上次数的增加,将数据映射到高维空间的方法
在这里插入图片描述
在这里插入图片描述
不难看出规律总结
在这里插入图片描述
这个规律在转换为二次多项式时同样适用。原本模型应该是形似直线方程的结构,升维后可以继续适用线性回归来进行拟合出如下的模型:
y = w 0 x 0 + w 1 x + w 2 x 2 + w 3 x 3 y=w_0x_0+w_1x+w_2x^2+w3x^3 y=w0x0+w1x+w2x2+w3x3
由此推断,假设多项式转化的次数是n,则数据会被转化成形如:
[ 1 , x , x 2 , x 3 . . . . x n ] [1,x,x^2,x^3....x^n] [1,x,x2,x3....xn]
拟合的方程为
y = w 0 x 0 + w 1 x + w 2 x 2 + w 3 x 3 . . . . . w n x n , ( x 0 = 1 ) y=w_0x_0+w_1x+w_2x^2+w3x^3.....w_nx^n,(x_0=1) y=w0x0+w1x+w2x2+w3x3.....wnxn,(x0=1)

当原始特征矩阵是二维时:
在这里插入图片描述
有如下规律:
在这里插入图片描述
得到如下方程:
在这里插入图片描述
同理,三次多项式会得到这样的规律:
在这里插入图片描述
因此,进行多项式转化的时候,多项式会产出最高次数为止的所有低高次项。随着原特征矩阵维度的上升,数据会 越来越复杂,维度会越来越多,并且这种维度的增加并不能用太简单的数学公式表达出来,因此多项式回归没有固定的模型表达式。

多项式回归处理非线性问题
数据准备:

from sklearn.preprocessing import PolynomialFeatures as PF
from sklearn.linear_model import LinearRegression
import numpy as np

rnd = np.random.RandomState(42)
X = rnd.uniform(-3,3,size=100)
y = np.sin(X) + rnd.normal(size=len(X)) / 3
X = X.reshape(-1,1)
line = np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)

升维与未升维对比:

LinearR = LinearRegression().fit(X,y)
d = 5 
LinearR_ = LinearRegression().fit(X,y)
X_ = PF(degree=d).fit_transform(X)
LinearR_ = LinearRegression().fit(X_,y)
line_ = PF(degree=d).fit_transform(line)

fig,ax1 = plt.subplots(1)
ax1.plot(line,LinearR.predict(line),linewidth=2,color='green',label="linear regression")
ax1.plot(line,LinearR_.predict(line_),linewidth=2,color='red',label="Polynomial regression")
ax1.plot(X[:,0],y,'o',c='k')
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Linear Regression ordinary vs poly")
plt.tight_layout()
plt.show()

在这里插入图片描述
可以看到多项式回归可以较好的拟合非线性数据,还不容易发生过拟合

多项式回归的可解释性
即使用get_feature_names来调用生成的新特征矩阵的各个特征上的名称

X = np.arange(9).reshape(3,3)
X
Poly = PolynomialFeatures(degree=5).fit(X)
Poly.get_feature_names()

在这里插入图片描述
即一系列特征之间相乘的组合

线性还是非线性模型

狭义线性模型:自变量上不能有高此项,自变量与标签之间不能存在非线性关系
广义线性模型:只要标签与模型拟合出的参数之间的关系是线性的,模型就是线性的

对于多项式回归本身的属性来说,如果考虑狭义线性模型的定义,那它就是不是线性模型,并且统计学中认为特征之间若精确存在相关关系或高度相关关系,线性模型的估计就会失真难以准确估计。但是如果考虑广义定义,那么多项式回归就是一种线性模型,它的系数w之间并没有相乘或者相除,python处理数据也不会知道特征的变化来源。所以一般认为多项式回归是一种特殊的线性模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依整合第三方登录

0&#xff1a;以gitee为例&#xff0c;首先开通gitee第三方登录&#xff1a;&#xff08;在设置里面的第三方应用里面新建&#xff09; 0.1&#xff1a;后端引入JustAuth第三方登陆框架&#xff1a; <dependency><groupId>me.zhyd.oauth</groupId><artif…

H5UI库、加密技术和二维码

一、H5UI库 1. 使用方法&#xff1a; ​ &#xff08;1&#xff09;页面中引入css文件 ​ h5ui.css &#xff08;h5ui.min.css&#xff09; ​ &#xff08;2&#xff09;页面中引入js文件 ​ ​ jquery.min.js ​ ​ h5ui.min.js 2. 组件…

十五、Kubernetes中Pod生命周期详解、实例

1、概述 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#xff0…

对于负载均衡服务器一致性哈希算法一些简单的想法

文章目录一致性哈希负载均衡的介绍一致性哈希负载均衡的介绍 负载均衡这个概念可以抽象为&#xff1a;从n个候选服务器中选择一个进行通信。 负载均衡算法有&#xff1a;随机&#xff0c;轮询&#xff0c;最小连接数等。今天的“猪脚”是一致性哈希负载均衡算法&#xff1b; 一…

Java语法:枚举

1.枚举是什么&#xff1f; 枚举是Java中的一种特殊类型。 2.枚举的作用 是为了做信息的标志和分类。 3.枚举的语法 定义语法&#xff1a; 修饰符 enum 枚举名称 {第一行都是罗列枚举类实例的名称。 } /*** 枚举类*/ public enum Season {//枚举的第一行必须罗列枚举类的…

流量劫持的危害及应对方法

流量劫持总体来说属于中间人攻击的一种&#xff0c;本质上攻击者在通信两端之间对通信内容进行嗅探和篡改&#xff0c;以达到插入数据和获取关键信息的目的。目前互联网上发生的流量劫持基本是两种手段来实现的: 域名劫持&#xff1a;通过劫持掉域名的DNS解析结果&#xff0c;…

那些年,我们crush的爆款小游戏大盘点

小游戏&#xff0c;即小程序游戏&#xff0c;是小程序的一个子类目&#xff0c;其最大的特点就是“即点即玩”&#xff0c;具备出色的用户体验。如今大家的生活逐渐向快节奏发展&#xff0c;在各种压力下&#xff0c;人们更倾向于方便快捷的娱乐方式&#xff0c;而这正推动了小…

一年时间,拿到了人生中的第一个20万

目录一、2021年度博客之星评选第二名二、博客新星导师三、哪吒社区四、粉丝群五、付费专栏六、Java学习路线总结&#xff0c;搬砖工逆袭Java架构师七、关于读书八、你好2023一、2021年度博客之星评选第二名 2022年&#xff0c;是哪吒收获的一年&#xff0c;收获了人生中的第一…

Java虚拟机(JVM)面试专题 下(初级程序员P6)

Java虚拟机&#xff08;JVM&#xff09;面试专题 下&#xff08;初级程序员P6&#xff09; 六、四种引用 1. 强引用 普通变量赋值即为强引用&#xff0c;如 A a new A(); 通过 GC Root 的引用链&#xff0c;如果强引用不到该对象&#xff0c;该对象才能被回收 2. 软引用&a…

Redis架构 - Cluster集群模式

简介 Redis Cluster是Redis数据库的分布式解决方案&#xff0c;它能够将数据分布在多个Redis节点之间&#xff0c;从而提高数据的存储和访问能力。 Redis Cluster使用哈希槽&#xff08;hash slot&#xff09;机制来将数据分布在多个节点之间。每个节点都负责存储一定数量的哈…

LabVIEW NI Switch Executive是什么

LabVIEW NI Switch Executive是什么NI Switch Executive是一款智能开关管理与路由应用程序。它掀起了自动化测试设备(ATE)系统开关软件的新革命。借助NI Switch Executive&#xff0c;以交互方式配置和命名开关模块、外部连接和信号路由&#xff0c;从而提高开发效率。此外&…

Python笔记 -- 字符串和数字

文章目录1、print2、字符串2.1、改变大小写2.2、字符串拼接2.3、转义符2.4、移除空白3、数字3.1、运算3.2、下划线&#xff0c;多变量赋值python中定义变量时不需要指定数据类型 1、print print(1, 2, 3, 4, sep, end) print(10) print(1,2,3,4) #没写 sep 和 end 相当于 sep…

【开源代码】首个利用神经网络能够明确推断VIO中 IMU bias演化的方法

以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文##开源代码# Deep IMU Bias Inference for Robust Visual-Inertial Odometry with Factor Graphs 论文地址&#xff1a;https://arxiv.org/abs/2211.04517 作者单…

【尚医通】微信扫码登录和手机号登录冲突问题解决思路

【尚医通】微信扫码登录和手机号登录冲突问题解决思路 问题描述 最近做尚医通遇到一个问题&#xff0c;微信扫码登录和手机号登录在 特殊情况 下会发生冲突&#xff0c;导致无法登录的问题。下面就描述一下几种情况。 正常情况&#xff1a;用户第一次一上来就使用微信扫码登…

一碗云南米线,加剧速食食品赛道“内卷”?

说起云南&#xff0c;人们的印象往往是藏在苍山洱海、玉龙雪山里的风花雪月。然而&#xff0c;生活中最常见的“滇味”&#xff0c;却是一碗鲜香美味、软中带劲的米线。近年来&#xff0c;从广西的螺蛳粉到河南的酸辣粉&#xff0c;越来越多带着地域特色的主食被装进小小纸桶&a…

[ Azure - Subscriptions ] 解决办法:此订阅未在 Microsoft.Insights 资源提供程序中注册

问题描述 在使用新的 Azure 订阅中某个服务的时候出现错误&#xff0c;错误信息为&#xff1a;“此订阅未在 Microsoft.Insights 资源提供程序中注册。” 本文发生的示例是在使用 Azure Monitor 时&#xff0c;出现了该错误。 英文的错误提示&#xff1a; To run this query…

日本知名汽车零部件公司巡礼系列之株式会社141

株式会社141 业务内容&#xff1a; &#xff08;发动机系、燃料系、排气管系&#xff09;・A机器零件&#xff08;打印机用零件&#xff09; 搬运设备部件&#xff08;导轨部件&#xff09;・小型马达用部件&#xff08;轴类、壳体类、辅助部件&#xff09; 公司简介&#x…

如何外网访问登录员工管理系统平台

员工管理系统平台网站是企业常用办公工具之一&#xff0c;为了安全性和稳定性&#xff0c;一般都部署在公司内部内网web服务器上&#xff0c;在办公室内通过内网IP端口进行登录访问。那么&#xff0c;如何实现在外网或者在家也能访问公司内网的管理网站呢&#xff1f; 今天给大…

Spring Data JPA @DomainEvents 发布领域事件以及遇到的坑。

文章目录发布领域事件监听领域事件遇到的问题发布领域事件 通过repositories管理的实体是聚合根。在领域驱动设计(DDD)的应用中&#xff0c;这些聚合根通常会发布领域事件。Spring Data提供了一个名为DomainEvents的注解&#xff0c;可以在聚合根的一个方法上使用该注解&#…

JD青龙面板任务代理池部署与使用教程

JD脚本中一些任务会黑ip 导致没法跑或者跑不出东西 比如联盟跑出来全是劵 这时候就需要代理池 本文为3步 1.购买设置代理 2.部署代理池 3.脚本配置代理池 使用效果展示 1.设置代理 代理推荐购买星空 点我查看星空代理 按下图购买及生成API API填入部署的配置中(下文有说)…