【python】逐步回归(多元线性回归模型中的应用)

news2024/11/26 20:48:28

文章目录

  • 前言
  • 一、逐步回归
    • 1. 前进法(Forward Selection)
    • 2. 后退法(Backward Elimination)
    • 3. 逐步回归法(Stepwise Regression)
  • 二、示例
  • 三、代码实现----python


前言

  • Matlab中逐步回归的实现可以使用 Matlab 的 stepwise 函数,本文主要讨论逐步回归如何在 python 中使用。
  • 思路参考视频:
    https://www.bilibili.com/video/BV1kU4y1R7o2/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、逐步回归

  • 逐步回归(Stepwise Regression)是一种选择统计模型的技术,用于找到最优模型,即通过添加或移除变量来选择合适的特征。
  • 逐步回归主要有三种方法:前进法(Forward Selection)、后退法(Backward Elimination)和逐步回归法(Stepwise Regression)。下面是对这三种方法的简单介绍:

1. 前进法(Forward Selection)

概念

  • 前进法从一个空模型开始,即最初没有任何预测变量。
  • 然后逐步添加预测变量,每次添加一个变量,使得新模型的评价指标(如AIC、BIC、R^2等)最优。
  • 继续这个过程,直到添加任何更多的变量都不能显著提高模型的性能。

步骤

  1. 从空模型开始,不包含任何预测变量。
  2. 评估每个未加入模型的变量,将使模型性能最优的变量加入模型。
  3. 重复步骤2,直到添加任何变量都不能显著改善模型。

2. 后退法(Backward Elimination)

概念

  • 后退法从包含所有预测变量的模型开始。
  • 然后逐步移除预测变量,每次移除一个变量,使得新模型的评价指标最优。
  • 继续这个过程,直到移除任何更多的变量都不能显著提高模型的性能。

步骤

  1. 从包含所有可能的预测变量的全模型开始。
  2. 评估每个变量的显著性,移除最不显著的变量(即对模型贡献最小的变量)。
  3. 重复步骤2,直到移除任何变量都不能显著改善模型。

3. 逐步回归法(Stepwise Regression)

概念

  • 逐步回归法结合了前进法和后退法,既可以添加变量也可以移除变量。
  • 每次步骤既可以是添加一个新变量,也可以是移除一个现有变量,以达到模型性能的最优。

步骤

  1. 从空模型开始或包含所有预测变量的模型开始(具体取决于实现方式)。
  2. 在每一步中,评估所有可能的添加或移除变量的操作。
  3. 选择对模型性能最优的操作(添加或移除一个变量)。
  4. 重复步骤2和步骤3,直到添加或移除任何变量都不能显著改善模型。

二、示例

  • 水泥凝固时放出的热量 y y y 与水泥中 4 种化学成分 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4 有关,今测得一组数据如下,试用逐步回归确定一个线性模型,并找出影响水泥凝固时放出热量的必要因素
    在这里插入图片描述
    根据此示例,本文选用后退法选择出影响水泥凝固时放出热量的必要因素。

三、代码实现----python

1. 输入数据

import pandas as pd
import numpy as np
# 数据
x1 = np.array([7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10])
x2 = np.array([26, 29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68])
x3 = np.array([6, 15, 8, 8, 6, 9, 17, 22, 18, 4, 23, 9, 8])
x4 = np.array([60, 52, 20, 47, 33, 22, 6, 44, 22, 26, 34, 12, 12])
y = np.array([78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7, 72.5, 93.1, 115.9, 83.8, 113.3, 109.4])

# 自变量矩阵
X = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3, 'x4': x4})

2. 初始化

本文选用的后退法,所以被选择的因素初始化为包含所有因素,被排出的元素列表为空。

# 初始化未被选中的因素
excluded = list(initial_list)
# 初始化被选中的因素
included = list(set(X.columns) - set(excluded))

3. 评估每个变量的显著性

本文中使用 P P P 值的大小评估每个变量的显著性。

步骤:

  1. 拟合回归模型
  2. 获取所有特征的P值
  3. 找到最大的P值及其对应的特征。
# 拟合选中的因素
model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()

# 得出被选中的因素里P值最大的
p_values = model.pvalues

# 排除常数项(截距项)的P值
p_values = p_values.drop('const')

# 找到最大的P值及其对应的特征
max_p_value = p_values.max()
print("最大的P值为:",max_p_value)

4. 判断函数退出的标志

直到被选中的因素拟合后得到的最大 P P P 值小于 α ( 0.05 ) \alpha(0.05) α(0.05),意味着移除任何变量都不能显著改善模型,函数退出。

def stepwise_selection(X, y, 
                       initial_list = [], 
                       threshold = 0.05,
                       mark = True):
                       
    # 初始化未被选中的因素
    excluded = list(initial_list)
    # 初始化被选中的因素
    included = list(set(X.columns) - set(excluded))

    while mark:

        # 拟合选中的因素
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()

        # 得出被选中的因素里P值最大的
        p_values = model.pvalues

        # 排除常数项(截距项)的P值
        p_values = p_values.drop('const')

        # 找到最大的P值及其对应的特征
        max_p_value = p_values.max()
        print("最大的P值为:",max_p_value)
        if max_p_value < threshold:
            mark = False
            print("最终模型:")
            print(model.summary())
            # 获取回归系数
            b = model.params
        else:
            max_p_feature = p_values.idxmax()
            print("最大的P值对应的特征为:",max_p_feature)

            # 从被选中的因素中去除
            included.remove(max_p_feature)
            print("更新后的因素为:",included)

    return included, b

5. 逐步回归的完整代码

import pandas as pd
import numpy as np
import statsmodels.api as sm

# 数据
x1 = np.array([7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10])
x2 = np.array([26, 29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68])
x3 = np.array([6, 15, 8, 8, 6, 9, 17, 22, 18, 4, 23, 9, 8])
x4 = np.array([60, 52, 20, 47, 33, 22, 6, 44, 22, 26, 34, 12, 12])
y = np.array([78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7, 72.5, 93.1, 115.9, 83.8, 113.3, 109.4])

# 自变量矩阵
X = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3, 'x4': x4})


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold=0.05,
                       mark = True):
        
    # 初始化未被选中的因素
    excluded = list(initial_list)
    # 初始化被选中的因素
    included = list(set(X.columns) - set(excluded))

    while mark:

        # 拟合选中的因素
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()

        # 得出被选中的因素里P值最大的
        p_values = model.pvalues

        # 排除常数项(截距项)的P值
        p_values = p_values.drop('const')

        # 找到最大的P值及其对应的特征
        max_p_value = p_values.max()
        print("最大的P值为:",max_p_value)
        if max_p_value < threshold:
            mark = False
            print("最终模型:")
            print(model.summary())
            # 获取回归系数
            b = model.params
        else:
            max_p_feature = p_values.idxmax()
            print("最大的P值对应的特征为:",max_p_feature)

            # 从被选中的因素中去除
            included.remove(max_p_feature)
            print("更新后的因素为:",included)

    return included, b

result, b = stepwise_selection(X, y)

print(result)
print(b)

运行结果:

评估变量显著性的过程:
在这里插入图片描述

最终的模型:
在这里插入图片描述

回归系数:
在这里插入图片描述

6. 生成三维图的代码

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# 计算Z的值
Z = b['const'] + b['x1'] * x1 + b['x2'] * x2

# 创建一个新的3D绘图对象
fig = plt.figure()
'''
111 的具体含义是:
第一位 1:整个图形只有 1 行。
第二位 1:整个图形只有 1 列。
第三位 1:子图在这个 1x1 网格中的第 1 个位置。
'''
ax = fig.add_subplot(111, projection='3d')

# 绘制散点图
ax.scatter(x1, x2, Z, c='r', marker='o', label='Data Points')

# 创建网格以绘制曲面
x1_range = np.linspace(min(x1), max(x1), 100)
x2_range = np.linspace(min(x2), max(x2), 100)
x1_grid, x2_grid = np.meshgrid(x1_range, x2_range)

# 计算曲面上的Z值
Z_surface = b['const'] + b['x1'] * x1_grid + b['x2'] * x2_grid

# 绘制曲面图
'''
alpha

意义:alpha 参数用于设置曲面的透明度。
取值范围:alpha 的取值范围是 0 到 1 之间。
0 表示完全透明,即不可见。
1 表示完全不透明。
作用:通过调整 alpha 参数,你可以在同一视图中更好地叠加多个图形,使得它们不会完全遮挡对方。

cmap

意义:cmap 参数用于设置曲面的颜色映射(colormap)。
常见的颜色映射:viridis, plasma, inferno, magma, cividis, jet, rainbow, coolwarm, hot 等。
作用:颜色映射用于根据 Z 值来着色曲面,帮助更清晰地展示高度或强度的变化。
'''
ax.plot_surface(x1_grid, x2_grid, Z_surface, alpha=0.5, cmap='viridis')

# 设置标签
ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('Z')

# 添加图例
ax.legend()

# 显示图形
plt.show()

运行结果:

在这里插入图片描述

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

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

相关文章

流量分析-Windows

目录 介绍步骤 介绍 1、Medusa工具是通过并行登陆暴力破解的方法&#xff0c;尝试获取远程验证服务访问权限&#xff0c;它支持AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NCP (NetWare),NNTP, PcAnywhere, POP3, PostgreSQL, rexec, rlogin, rsh, SMB, SMTP(AUTH/VRFY), SNM…

【Windows下Oracle 11G 安装教程】

Windows下 Oracle 11G 安装及配置教程 引言数据库安装安装流程1.运行可执行程序2.取消安装更新配置3.安装及配置数据库4.选择系统的类别5.安装位置及全局数据库6.检查配置及设置情况7.配置对应数据库管理的密码 引言 在网上各种安装教程其实已经很多了&#xff0c;没必要再出这…

共享内存及网络通信

共享内存 ------ 最高效的进程间通信 一个内核预留的空间&#xff0c;两进程绑定同一块共享空间 避免了用户空间 到 内核空间的数据拷贝 IPC 操作流程 key值 > 申请 >读写 >关闭 >卸载 1,产生key值 函数ftok key_t ftok(const char *pathname, int proj_id);…

谷粒商城实战笔记-230-商城业务-认证服务-页面效果完成

这一节主要是完善各种页面效果。 一&#xff0c;用户名密码登录接口存放session 之前是在微博登录成功后把用户信息放入session&#xff0c;用户名密码登录成功也需要把用户信息放入session。 PostMapping(value "/login")public String login(UserLoginVo vo, R…

江协科技STM32学习- P5 GPIO输出

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

坐牢第二十九天

思维导图 作业 作业&#xff1a; 运行1个服务器和2个客户端 实现效果&#xff1a; 服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接&#xff0c;2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视…

nginx-Web 服务端

nginx的简介 Nginx 是一款高性能的 Web 服务器和反向代理服务器。 高并发处理能力&#xff1a;采用异步非阻塞的方式处理请求&#xff0c;能够在高并发场景下快速响应。 轻量级和高效&#xff1a;资源消耗相对较少&#xff0c;启动速度快。 优秀的反向代理和负载均衡功能&a…

2053. 图的bfs遍历

代码 #include<bits/stdc.h> using namespace std; int a[20][20],q[20]; bool f[20]; int main() {int h,t,n,e,x,y,i;cin>>n>>e;for(i1;i<e;i){cin>>x>>y;a[x][y]1;a[y][x]1;}h1;t1;q[1]1;f[1]true;cout<<1<<" ";wh…

qps测试epoll和io_uring

​ 前边我们了解了Reactor模式和Proactor模式&#xff0c;哪个性能更好呢&#xff1f;需要我们进行测试。前边我们用io_uring实现了Proactor模式&#xff0c;io_uring是2019年才加入到Linux内核中的&#xff0c;提供了三个系统调用函数。都有些抽象&#xff0c;我是直接来拿跑的…

LLM驱动的AI Agent框架:引领行业变革的应用探索与未来展望

AI Agent框架&#xff08;LLM Agent&#xff09;&#xff1a;LLM驱动的智能体如何引领行业变革&#xff0c;应用探索与未来展望 1. AI Agent&#xff08;LLM Agent&#xff09;介绍 1.1. 术语 Agent&#xff1a;“代理” 通常是指有意行动的表现。在哲学领域&#xff0c;Agen…

视频直播平台选择服务器需要注意什么?

在当今数字化时代&#xff0c;直播平台已成为连接内容创作者与广大观众的重要桥梁。为了确保直播的流畅性、稳定性和安全性&#xff0c;服务器的选择与配置显得尤为重要。以下是搭建直播平台时&#xff0c;服务器所需具备的关键因素。 一、高性能与可扩展性 直播平台需要处理大…

黑神话悟空四十二项修改器 v1.0

软件简介 黑神话悟空四十二项修改器由风灵月影精心打磨&#xff0c;为《黑神话悟空》这款备受瞩目的游戏量身定制。这款修改器界面简洁、体积小巧、功能强大&#xff0c;它致力于为玩家提供便捷的游戏体验&#xff0c;让您能够根据个人喜好和需求&#xff0c;轻松调整游戏内的…

4-1-6 arduino控制42步进电机(电机专项教程)

4-1-6 arduino控制42步进电机&#xff08;电机专项教程&#xff09; 4-1-6 arduino控制42步进电机NEMA双极性步进电机A4988如何使用arduino连接A4988驱动模块Arduino控制Nema-17步进电机&#xff08;简化版&#xff09;A4988 Vref电压调节&#xff08;具体看视频&#xff09; 4…

Java数组05:Arrays类

本节内容视频链接&#xff1a;Java数组07&#xff1a;Arrays类讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p57&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌Array类是一个针对数组进行操作的工具类&#xff0c;‌提供了排序、‌…

SVG的基本图形:直线、圆、椭圆、矩形、多边形等的元素的使用说明。

1、先上个图看一下效果&#xff1a;这里面有直线、圆、矩形、椭圆、多边形。 SVG 可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。 SVG 使用 XML 格式定义图像。 2、代码实现&#xff1a; <svg width"500" height"200" viewBox&…

Kubernetes 如何给pod的 /etc/hosts文件里面添加条目

创建pod的时候&#xff0c;pod会在其/etc/hosts里面添加一个条目。 [rootmaster ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dns-test 1/1 R…

【RabbitMQ】高级特性

本文将介绍一些RabbitMQ的重要特性。 官方文档&#xff1a;Protocol Extensions | RabbitMQ 本文是使用的Spring整合RabbitMQ环境。 生产者发送确认(publish confirm) 当消息发送给消息队列&#xff0c;如何确保消息队列一定收到消息呢&#xff0c;RabbitMQ通过 事务机制 和 …

Java重修笔记 第三十八天 String翻转

String翻转 1. 要求将字符串指定的部分进行翻转 public class StringHomework {public static void main(String[] args) {// 要求将字符串指定的部分进行翻转// 例如:abcdef ---> a edcb f 1, 4System.out.print("转换前: ");String s "abcdef";…

Libcity笔记:strnn_encoder.py

1 cal_basetime 2 calc_timeoff 3 encode 所以对于 STRNN来说&#xff0c;它的eval_data的每个元素是&#xff1a;

《Python 异常捕获全解析及 yield 关键字详解》

在 Python 中&#xff0c;异常捕获是一种处理程序运行时错误的机制&#xff0c;它可以使程序在出现错误时继续运行&#xff0c;而不是崩溃。以下是对 Python 中异常捕获的详细介绍&#xff0c;包括try、except、else、finally关键字以及对yield关键字的介绍和案例。 一、异常捕…