stacking集成模型预测回归问题

article/2025/9/26 14:22:32

前言

关于各种集成模型,已经有很多文章做了详细的原理介绍。本文不再赘述stacking的原理,直接通过一个案例,使用stacking集成模型预测回归问题。
本文通过学习一篇stacking继承学习预测分类问题,对其代码进行了调整,以解决回归问题。

代码与解析

导包

使用KFold进行交叉验证
stacking基模型包含4种(GBDT、ET、RF、ADA)
元模型为LinearRegression
回归模型评价指标为r2_score

from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor as GBDT
from sklearn.ensemble import ExtraTreesRegressor as ET
from sklearn.ensemble import RandomForestRegressor as RF
from sklearn.ensemble import AdaBoostRegressor as ADA
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import numpy as np
import pandas as pd

关于为何使用KFold,这篇文章提到:
KFlod 适用于用户回归类型数据划分
stratifiedKFlod 适用于分类数据划分
并且在实验中也发现,stratifiedKFlod.split(X_train,y_train)的y_train不可为连续数据,因此无法使用,只能用KFold

数据载入

读取文件并用train_test_split划分数据集。划分后的数据类型为Dataframe,而由于后续使用array方便一点,所以划分之后需要进行数据转换。同时需要记录下Dataframe的列名,后续还会用到。

df = pd.read_csv("500.csv")
X = df.iloc[:, :6]
y = df.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_cols = X_train.columns
X_train = X_train.values
y_train = y_train.values
X_test = X_test.values

原数据(500.csv)如下图,有500个样本,前六个参数为特征,最后两个为输出。为简便起见,本案例只研究通过前六个特征预测最后一列输出。X_train为(400,6)
在这里插入图片描述

第一层模型

models = [GBDT(n_estimators=100),RF(n_estimators=100),ET(n_estimators=100),ADA(n_estimators=100)]X_train_stack = np.zeros((X_train.shape[0], len(models)))
X_test_stack = np.zeros((X_test.shape[0], len(models)))

这里,新建了两个ndarray,可见其大小为(400,4)和(100,4)。
结合stacking的原理来理解:
对每个模型的X_train进行了交叉验证,结束后会得到(400,1)大小的预测值。4个模型则为(400,4),作为第二层模型训练数据的输入。
交叉验证的同时每一折也会得到对X_test的预测,最后求平均得到(100,1)大小的预测值,4个模型则为(100,4),作为第二层模型test数据的输入。

第一层训练并且得到第二层所需数据

# 10折stacking
n_folds = 10
kf = KFold(n_splits=n_folds)for i, model in enumerate(models):X_stack_test_n = np.zeros((X_test.shape[0], n_folds))for j, (train_index, test_index) in enumerate(kf.split(X_train)):tr_x = X_train[train_index]tr_y = y_train[train_index]model.fit(tr_x, tr_y)# 生成stacking训练数据集X_train_stack[test_index, i] = model.predict(X_train[test_index])X_stack_test_n[:, j] = model.predict(X_test)# 生成stacking测试数据集X_test_stack[:, i] = X_stack_test_n.mean(axis=1)

首先是第一层i循环,是对4个模型循环。
这里新定义了X_stack_test_n用于存储10折交叉验证中,每折对X_test(100,6)的预测,得到(100,1)的结果。存储10次后大小为(100,10)。可以看到最后一行代码对该10列数据求了平均数,得到(100,1)的数据。最终4个模型得到(100,4),作为第二层模型test数据的输入。

然后再看第二层j循环,是在进行10折交叉验证。
train_index, test_index分别记录了每折验证时的训练与测试编号。如果没有设置shuffle=True,则为0-399个数据依次而不是随机取40个作为测试集划分。由于我原本的数据就比较随机分布,所以这里洗不洗牌无所谓。
由于之前转换了X_train数据类型为array,所以这里可以直接tr_x = X_train[train_index]将对应位置的数据取出。
通过train_index取出的数据进行模型训练,通过test_index取出的数据进行模型预测。
倒数二三行的代码将预测的结果分别给到了之前新建的array里。

第二层模型训练

model_second = LinearRegression()
model_second.fit(X_train_stack,y_train)
pred = model_second.predict(X_test_stack)
print("R2:", r2_score(y_test, pred))

在这里插入图片描述

到这里就很清晰了,第二层训练很简单。
训练的输入使用X_train_stack(400,4),y_train(400,1)
训练好的模型测试一下X_test_stack(100,4)得到结果pred(100,1)
然后获得评估指标r2_score即可

基模型指标

# GBDT
model_1 = models[0]
model_1.fit(X_train,y_train)
pred_1 = model_1.predict(X_test)
print("R2:", r2_score(y_test, pred_1))# RF
model_2 = models[1]
model_2.fit(X_train, y_train)
pred_2 = model_2.predict(X_test)
print("R2:", r2_score(y_test, pred_2))# ET
model_3 = models[2]
model_3.fit(X_train, y_train)
pred_3 = model_1.predict(X_test)
print("R2:", r2_score(y_test, pred_3))# ADA
model_4 = models[3]
model_4.fit(X_train, y_train)
pred_4 = model_4.predict(X_test)
print("R2:", r2_score(y_test, pred_4))

在这里插入图片描述

结论

最后得到的集成模型的学习结果显然要优于4个基模型。


http://chatgpt.dhexx.cn/article/AS9e672Z.shtml

相关文章

逻辑回归问题汇总

文章目录 1. Logistic回归与线性回归的区别与联系?2. Logistic回归有哪些基本假设?3. Logistic回归的损失函数?4. Logistic回归损失函数的求解方法?5. Logistic回归是如何进行分类的?6. Logistic回归为什么要用极大似然函数作为损失函数?7. 为什么在…

回归问题归一化总结

在用深度学习做回归问题时,对数据进行标准化处理是一个共识,将数据标准化,利用标准化后得数据进行数据分析。不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响…

分类和回归问题

前言 最近在复习一些深度学习和机器学习的基础知识,看到分类和回归,这里记录一下。 一、回归 首先,回归应用的场景是用来输出一系列连续的值,然后用于预测等任务。回归的目的是为了找到最优拟合的曲线,这个曲线可以…

回归问题一般解决方法

1. 回归问题 Given a labeled training set learn a general mapping which associates previously unseen independent test data with their correct continuous prediction. 回归问题和分类问题很相似,区别在于回归问题的输出是一个连续值。 上图是训练数据 和 对应的连续值…

对线性回归、逻辑回归、各种回归的概念学习

回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果 都满足线性。即不大于一次方。这个是针对 收集的数据而言。 收集的数据中…

回归问题

回归 回归(regression) 是监督学习的另一个重要问题。 回归用于预测输入变量(自变量) 和输出变量(因变量) 之间的关系, 特别是当输入变量的值发生变化时, 输出变量的值随之发生的…

回归问题原理

回归问题是一种常见的监督机器学习任务,在很多领域均有广泛应用。其典型应用包括销量预测、库存预测、股票价格预测、天气预测等。本问将讨论线性回归,包括线性回归模型的目标函数(损失函数和正则函数)、线性回归模型的优化求解、…

机器学习之回归问题

目录 前言 一、回归定义 二、回归建模步骤 1.模型假设-线性模型(Linear Model) (1)一元线性模型 (2)多元线性模型 2.模型评估-损失函数(Loss Funtion) 3.最佳模型-梯度下降&…

mac idea jrebel 激活

jrebel 官网提供注册,然后会给你一个注册码 首先 idea 安装 jrebel . 在安装完成之后,点击以下按钮 一开始 跟我的不一样,我的是注册完成之后,才会显示Change license 的这个提示, 之前好像是 Activate now 提示,点击即可 当注册完成之后,关闭弹出框 选择上图中的值,去官网注…

安装jrebel并激活

1.File-Settings-Plugins搜索jrebel,找到JRebel for IntelliJ ,点击install(我这里已经安装过了,所以显示的是更新) 2.重启idea 3.激活步骤,下载工具 ①下载激活工具 连接:https://pan.baidu.com/s/1Fh2v2zrAO2u50ZnS9LHBOQ 提取码…

JRebel激活步骤

JRebel简介: JRebel是与应用程序服务器集成的JVM Java代理,可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中,JRebel特别不依赖任何IDE或开发工具(除编译器外)。但是&…

关于JRebel 激活

具体JRebel安装教程参考: https://blog.csdn.net/lmdsoft/article/details/93769089 本文提供JRebel激活 Demo JRebel address was: 【http://jrebel.qekang.com:80/48dc7f8c-019f-4cb8-85d7-99b0134b69d0】, with any email.

JRebel插件激活

JRebel,一款好用的 Spring 热部署插件。 1. 安装 注意:截至到目前为止,作者只找到了 2022.4.1 的激活方式,更高版本皆未激活成功。 1.1. IDEA 中直接安装 在插件市场中直接搜索:JRebel and XRebel 注意,这…

2019.9最新JRebel激活方式

原文链接 最近JRebel离线方式到期, idea报无法激活JRebel了, 找了很多以前的方式都无法生效, ip或域名都已经失效了, 好在找到了大神有效的激活方式,以下是激活步骤: 1. 下载反向代理软件 下载地址: https://github.com/ilanyu/ReverseProxy/releases根据自己的操作系统下载…

jrebel激活服务器搭建教程

jrebel是一款热部署插件,很好用,但是是收费的软件,本博客将搭建起一个jrebel激活服务器,如果条件允许,请购买正版lisence,请购买正版lisence,请购买正版lisence重要的事说三遍。 本博客激活是基于码云上的一个开源程序…

jrebel 激活

jrebel是ideal是的一款插件,是一个很好的热部署工具 -作用: 在项目启动过程中编译代码后,无需再次run或者debug,节省程序启动时间。 主要操作file—》settings—》plugins在搜索框中,输入jrebel点击右侧的install安装好…

JRebel激活失效解决

问题: 使用Jrebel运行项目时报错:Jrebel is not yet activated.Do you want to activate Jrebel now? 意思是插件未激活,需要激活插件 解决办法: 1. 下载代理软件:ReverseProxy,下载成功后双击打开(未成…

【IDEA】IDEA使用——IDEA中全局查找和全局替换

【IDEA】IDEA使用——IDEA中全局查找和全局替换 IDEA是一款优秀的Java IDE,全局查找和全局替换功能在学习和开发过程中使用的最为频繁,本文将简要总结其使用方法。 1.全局查找 面板位置:Edit > Find > Find In Path快捷键:…

IDEA全局替换--解决快捷键不起作用

看了网上的帖子: 使用快捷键后出来是酱紫的: 后来发现应该是这样: 输入完直接点enter键即可

IDEA中的全局批量替换正则表达式

目录 一. 常用搜索快捷键二. IDEA中常用的正则1. ^xxx:匹配以xxx开始的文件2. xxx$:搜索以xxx为结尾的文件3. .xxx:搜索包含字符串xxx的文件4. 复杂搜索例子 三. 正则表达式四. 常用字符五. 特殊字符六. 限定字符 一. 常用搜索快捷键 CTRL …