[集成学习]基于python的Stacking分类模型的客户购买意愿分类预测
1 导入必要的库
import pandas as pd
import numpy as np
import missingno as msno
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sns
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.metrics import confusion_matrix
# 忽略Matplotlib的警告(可选)
import warnings
warnings.filterwarnings("ignore")
# 设置中文显示和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2 导入数据
# 读取Excel文件
df = pd.read_excel('目标客户体验数据.xlsx')
df
| id | style | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | ... | B9 | B10 | B11 | B12 | B13 | B14 | B15 | B16 | B17 | isorno | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 753.035399 | 87.653791 | 81.558171 | 85.611593 | 85.629678 | 85.807576 | 82.346453 | 84.769555 | ... | 6 | 14 | 2 | 3 | 19.0 | 11 | 10 | 30 | 5 | 0 |
| 1 | 2 | 3 | 88.922790 | 82.946262 | 85.166081 | 85.189724 | 77.762498 | 83.595579 | 82.152367 | 88.872546 | ... | 6 | 5 | 4 | 4 | 18.0 | 10 | 8 | 0 | 30 | 0 |
| 2 | 3 | 3 | 95.048294 | 93.333131 | 77.660375 | 93.034274 | 88.869998 | 94.169962 | 95.602655 | 95.877373 | ... | 4 | 9 | 5 | 2 | 24.0 | 10 | 17 | 0 | 0 | 0 |
| 3 | 4 | 3 | 71.152328 | 76.785767 | 66.691701 | 81.926125 | 66.654998 | 77.773674 | 77.580247 | 76.989502 | ... | 6 | 10 | 4 | 7 | 27.0 | 10 | 10 | 18 | 25 | 0 |
| 4 | 5 | 3 | 70.573962 | 71.645949 | 70.444554 | 74.029832 | 66.654998 | 66.336092 | 62.093021 | 74.436962 | ... | 6 | 13 | 4 | 2 | 25.0 | 15 | 15 | 0 | 0 | 0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1959 | 1960 | 2 | 71.357663 | 75.373690 | 70.444554 | 77.767044 | 68.430276 | 75.026965 | 75.482261 | 70.333970 | ... | 5 | 6 | 3 | 5 | 25.0 | 11 | 20 | 0 | 0 | 0 |
| 1960 | 1961 | 2 | 99.036888 | 99.030172 | 99.032550 | 99.983342 | 99.977498 | 99.991867 | 99.992713 | 99.980365 | ... | 5 | 14 | 7 | 9 | 29.0 | 9 | 9 | 30 | 20 | 0 |
| 1961 | 1962 | 2 | 90.771281 | 91.921055 | 92.671787 | 96.719743 | 94.961899 | 97.245158 | 95.602655 | 95.877373 | ... | 6 | 8 | 4 | 5 | 39.0 | 20 | 17 | 0 | 30 | 0 |
| 1962 | 1963 | 2 | 82.427327 | 88.511489 | 74.052464 | 93.034274 | 76.461711 | 94.704676 | 91.163572 | 95.877373 | ... | 6 | 8 | 4 | 4 | 21.0 | 12 | 7 | 20 | 20 | 0 |
| 1963 | 1964 | 2 | 77.808692 | 77.803468 | 702.996114 | 77.767044 | 61.803653 | 77.773674 | 73.190189 | 58.796528 | ... | 6 | 7 | 4 | 3 | 25.0 | 10 | 12 | 25 | 0 | 0 |
1964 rows × 28 columns
3 数据预处理
# 可视化缺失值
msno.matrix(df)
plt.axis('off')
plt.show()
# 将“B7”列中的缺失值替换为整型数值0
df['B7'].fillna(0, inplace=True)
# 检测重复值并处理
print("重复值数量:", df.duplicated().sum())
df.drop_duplicates(inplace=True)
运行结果如图3-1所示:

图3-1 缺失值可视化与重复值检测
4 数据分布
4.1 箱线图
# 设置颜色风格为精简学术风格
sns.set_style("whitegrid")
# 设置图形大小
plt.figure(figsize=(15, 40))
features_to_plot_features = [col for col in df.columns]
# 对每个特征绘制箱线图子图
for i, feature in enumerate(features_to_plot_features): plt.subplot(len(features_to_plot_features) // 2 + 1, 4, i + 1) # 设置子图位置 sns.boxplot(df[feature], palette="Set3") # 使用Set3颜色风格plt.title(feature) plt.xlabel('')
# 显示图形
plt.tight_layout() # 调整子图间距
plt.show()
运行结果如图4-1所示:

图4-1 箱线图
4.2 pair plot
# 使用seaborn的pairplot绘制数据分布
sns.pairplot(df)
运行结果如图4-2所示:

图4-2 散点图
4.3 hist plot
# 设置颜色风格为精简学术风格
#sns.set_style("whitegrid")
# 设置图形大小
plt.figure(figsize=(15, 40))
features_to_plot_features = [col for col in df.columns]
# 对每个特征绘制
for i, feature in enumerate(features_to_plot_features): plt.subplot(len(features_to_plot_features) // 2 + 1, 4, i + 1) # 设置子图位置 #sns.kdeplot(df[feature], palette="Set3") # 使用Set3颜色风格sns.histplot(df[feature], palette="Set3",kde=True) # 使用Set3颜色风格plt.title(feature) plt.xlabel('')
# 显示图形
plt.tight_layout() # 调整子图间距
plt.show()
运行结果如图4-3所示:

图4-3 直方图
4.4 小提琴图
# 设置颜色风格为精简学术风格
sns.set_style("whitegrid")
# 设置图形大小
plt.figure(figsize=(15,45))
features_to_plot_features = [col for col in df.columns]
palette=['deep','muted','pastel','muted','pastel','viridis','dark','rocket','crest','mako','flare','magma','viridis','vlag','icefire','deep','muted','pastel','viridis','dark','colorblind','rocket','crest','mako','flare','magma','bright','vlag','icefire']
# 对每个特征绘制箱线图子图
for i, feature in enumerate(features_to_plot_features): plt.subplot(len(features_to_plot_features) // 2 + 1, 4, i + 1) # 设置子图位置 sns.violinplot(df[feature], palette=palette[i]) plt.title(feature) plt.xlabel('') # 移除x轴标签,因为只有一个变量
# 显示图形
plt.tight_layout() # 调整子图间距
plt.show()
运行结果如图4-4所示:

图4-4 小提琴图
5 相关性
5.1 heatmap
# 计算相关性矩阵
corr_matrix = df.corr()
# 绘制heatmap
plt.figure(figsize=(25,25))
sns.heatmap(corr_matrix, annot=True, cmap='PuOr', linewidths=.5)
plt.title('Heatmap of Correlation Matrix')
运行结果如图5-1所示:

图5-1 heatmap
5.2 clustermap
# 直接使用clustermap对原始数据进行聚类并绘制热图
sns.clustermap(df, standard_scale=1, cmap='PuBuGn', annot=False, fmt=".2f")
plt.title('Clustermap of DataFrame')
plt.show()
运行结果如图5-2所示:

图5-2 clustermap
6 划分数据集
from sklearn.model_selection import train_test_split
X = df.drop('isorno', axis=1)
y = df['isorno']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
7 Stacking分类模型建立
# 定义基础层分类器列表
base_learners = [ ('Logistic Regression', LogisticRegression()), ('Decision Tree', DecisionTreeClassifier()), ('SVM', SVC(probability=True)), ('KNN', KNeighborsClassifier(3)), ('Random Forest', RandomForestClassifier()), ('AdaBoost', AdaBoostClassifier()), ('XGBoost', XGBClassifier()), ('LightGBM', LGBMClassifier())
] # 使用StackingClassifier构建stacking集成学习模型
stacking_clf = StackingClassifier( estimators=base_learners, final_estimator=LogisticRegression()
)
8 训练模型
# 训练stacking集成学习模型
stacking_clf.fit(X_train, y_train)
模型结构如图8-1所示:

图8-1 Stacking分类模型结构
9 预测
# 预测
y_pred_stacking = stacking_clf.predict(X_test)
10 预测结果
indices = range(len(y_test)) # 绘制真实值和预测值的折线图
plt.figure(figsize=(10, 6))
plt.plot(indices, y_test, color='g', marker='o', markerfacecolor='none', markeredgecolor='black', label='True Values', linestyle='-')
plt.plot(indices, y_pred_stacking, color='black', marker='*',markerfacecolor='none',markeredgecolor='r',label='Predicted Values', linestyle='--')
plt.title('True vs Predicted Values')
plt.xlabel('Index in Test Set')
plt.ylabel('isorno Value')
plt.legend()
plt.grid(True)
plt.show()
运行结果如图10-1所示:

图10-1 预测结果
11 模型评估
11.1 混淆矩阵
plt.figure(figsize=(6,6))
# 假设 num_classes 是类别的数量
num_classes = len(np.unique(y_train)) # 确保我们可以将分类器数量和一个额外的堆叠模型的混淆矩阵放入布局中
# 这里我们假设最大可以显示9个基础分类器的混淆矩阵,以及一个堆叠模型的混淆矩阵
max_classifiers_to_show = 9 # 创建一个3x4的布局来容纳所有子图(9个基础分类器 + 1个堆叠模型)
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(18, 12)) # 调整figsize以适应你的需要
axes = axes.flatten()[:max_classifiers_to_show] # 只使用前max_classifiers_to_show个子图 # 创建一个颜色映射列表
#cmaps = sns.color_palette("husl", max_classifiers_to_show) # 使用seaborn的颜色映射
cmaps = ['Blues', 'plasma', 'Spectral', 'Purples', 'gist_stern', 'gist_ncar', 'inferno', 'BuGn', 'binary']
# 遍历分类器
for ax_idx, (name, clf) in enumerate(base_learners[:max_classifiers_to_show]): # 拟合模型 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 计算混淆矩阵 cm = confusion_matrix(y_test, y_pred) sns.heatmap(cm, annot=True, fmt='d', cmap=cmaps[ax_idx], ax=axes[ax_idx]) axes[ax_idx].set_xlabel('Predicted') axes[ax_idx].set_ylabel('True') axes[ax_idx].set_title(f'Confusion Matrix for {name}') # 添加堆叠集成学习模型的混淆矩阵
stacking_cm = confusion_matrix(y_test, y_pred_stacking)
sns.heatmap(stacking_cm, annot=True, fmt='d', cmap=cmaps[-1], ax=axes[-1]) # 使用最后一个颜色映射
axes[-1].set_xlabel('Predicted')
axes[-1].set_ylabel('True')
axes[-1].set_title('Confusion Matrix for Stacking') # 显示图形
plt.tight_layout() # 确保子图之间不重叠
plt.show()
运行结果如图11-1所示:

图11-1 混淆矩阵
11.2 ROC曲线
plt.figure(figsize=(6, 6))
markers = ['o', '.', '2', '^', '*', '>', '+', '1', 'p', '_', '8']
linestyles = ['-', '--', ':', '-.', 'solid', 'dashed', '-.', '-.', ':', '-', '--']
colors = ['b', 'g', 'r', 'c', 'r', 'y', 'k', 'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'] # 绘制基础分类器的ROC曲线
for i, (name, clf) in enumerate(base_learners): clf.fit(X_train, y_train) y_score = clf.predict_proba(X_test)[:, 1] fpr, tpr, thresholds = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr) plt.plot(fpr, tpr, color=colors[i % len(colors)], label=f'{name} (AUC = {roc_auc:.2f})', marker=markers[i % len(markers)], linestyle=linestyles[i % len(linestyles)]) # 绘制堆叠分类器的ROC曲线
stacking_y_score = stacking_clf.predict_proba(X_test)[:, 1]
stacking_fpr, stacking_tpr, _ = roc_curve(y_test, stacking_y_score)
stacking_roc_auc = auc(stacking_fpr, stacking_tpr)
plt.plot(stacking_fpr, stacking_tpr, color='black', label=f'Stacking (AUC = {stacking_roc_auc:.2f})', linestyle='--', marker='s') plt.plot([0, 1], [0, 1], color='grey', linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
运行结果如图11-2所示:

图11-2 ROC曲线对比
12 预测新数据
# 读取Excel文件
new_data = pd.read_excel('待判定的数据.xlsx')
# 将“B7”列中的缺失值替换为整型数值0
new_data['B7'].fillna(0, inplace=True)
# 检测重复值并处理
print("重复值数量:", new_data.duplicated().sum())
df.drop_duplicates(inplace=True)
if 'isorno' in new_data.columns: new_data = new_data.drop('isorno', axis=1)
# 预测
new_pred_stacking = stacking_clf.predict(new_data)
plt.plot(new_pred_stacking,color='black',marker='*',markerfacecolor='none',markeredgecolor='r',label='Predicted Values', linestyle='--')
新预测结果如图12-1所示:

图12-1 新数据预测结果
相关文章:
[集成学习]基于python的Stacking分类模型的客户购买意愿分类预测
1 导入必要的库 import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt from matplotlib import rcParams import seaborn as sns from sklearn.metrics import roc_curve, auc from sklearn.linear_model import LogisticRegres…...
FastApi地理坐标数据存取实践
说明: 应用Pydantic Model 验证/出入 数据, SqlAlchemy Model数据实体,Fastapi提供API机制支持。数据表的坐标字段采用Mysql的GEOMETRY类型目前还没成功使用Pydantic的Coordinate类型,待后续改良 要点: 输出的结果是…...
Docker容器——初识Docker,安装以及了解操作命令
一、Docker是什么? 是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源,用来管理容器和镜像的工具是在Linux容器里驱动运行应用的开源工具是一种轻量级的“虚拟机” 基于linux内核运行Docker的容器技术可以在一台主机上轻松为任何应用…...
JavaSE从零开始到精通
1.前置知识 JVM:java virtrual machine, java虚拟机, 专门用于执行java代码的一款软件。可以将class文件,转换为机器认识的机器码,因为我们的计算机只认识010101的二进制语言。JRE:java runtime enviroment, java运行时环境, jav…...
求解答word图标变白
把WPS卸载了之后就变成白色了,然后在注册表中把word的地址改成office word的地址之后图标变成这样了,怎么办...
Jenkins 离线升级
1. 环境说明 环境 A: jenkins 版本:2.253使用 systemctl 管理的 jenkins 服务 环境 B: 可以上网的机器,装有 docker-compose docker 和 docker-compose 安装,这里都略了。 2. 安装旧版本 2.1 环境 A jenkins 目录打包文件 …...
Unty 崩溃问题(Burst 1.8.2)
错误代码: Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本:2021.3.17F1,Burst 1.8.2 表现&…...
【大型实战】企业网络实验(华为核心交换、ESXI7.0vmware虚拟机、DHCP中继、服务端网络及用户端网络配置)
需求 实验 vmware网络配置(企业内部一般为ESXI) 这样服务器虚拟机使用192.168.200.X网段才能与用户侧互通 vmware虚拟机配置(DHCP服务器网络配置) 打开网络管理页面 nmtui重置一下网络连接(重启网卡) …...
vue2路由跳转是异步的
在 Vue 2 中,如果你在路由跳转函数中通过路由路径判断路径时,发现路径还是上一个路径,这是因为路由跳转是异步的。为了确保在路由跳转完成后进行判断,你可以使用路由的导航守卫或者 nextTick 来确保获取到最新的路由路径。 使用 …...
第一阶段面试题总结
1. 线程和进程的概念,区别、以及什么时候用线程什么时候用进程 1.1 线程概念 线程是进程中的一个执行单元,一个进程可以包含多个线程 线程是一个轻量级的进程 线程是CPU任务调度的最小单元 1.2 进程概念 进程是一个程序的运行实例,它包含了…...
设计模式(工厂模式,模板方法模式,单例模式)
单例模式: 确保一个类只有一个实例,并提供全局访问点。 单例模式举例: 配置信息类:用于存储应用程序的全局配置信息,例如数据库连接信息、日志配置等。 日志类:用于记录应用程序运行时的日志信息&#x…...
ES6 对象的新增方法(十四)
1. Object.assign(target, …sources) 特性:将一个或多个源对象的所有可枚举属性复制到目标对象。 用法:用于对象属性的合并。 const obj1 { a: 1, b: 2 }; const obj2 { b: 3, c: 4 }; Object.assign(obj1, obj2);console.log(obj1); // 输出&#…...
Spring Boot 学习总结(34)—— spring-boot-starter-xxx 和 xxx-spring-boot-starter 区别?
一、Spring Starter 简介 Spring Starter 是 Spring Boot 提供的一种便捷方式,帮助开发者快速集成和配置 Spring 应用中所需的依赖。每个 Starter 都是一个预配置的依赖集,可以自动配置应用的一部分或特定功能。这些 Starter 旨在消除手动编写大量样板代码和配置的需求。 1…...
昇思训练营打卡第二十五天(RNN实现情感分类)
RNN,即循环神经网络(Recurrent Neural Network),是一种深度学习模型,特别适用于处理序列数据。以下是对RNN的简要介绍: RNN的特点: 记忆性:与传统的前馈神经网络不同,R…...
昇思25天学习打卡营第02天|张量 Tensor
一、什么是张量 Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构。 张量可以被看作是一个多维数组,但它比普通的数组更加灵活和强大,因为它支持在GPU等加速…...
权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例
近日,2024全球数字经济大会——数字安全生态建设专题论坛(以下简称“论坛”)在京成功举办。由全球数字经济大会组委会主办,中国信息通信研究院及公安部第三研究所共同承办,论坛邀请多位专家和企业共同参与。 会上颁发…...
24.7.10|暑假-数组题目:实现整数的数字反转【学习记录】
1、题目: 32位有符号整数,将整数每位上的数字进行反转 输入:123 输出:321 输入:-123 输出:-321 输入:120 输出:21 !) 问题 怎么把整数转换成字符串ÿ…...
【ceph】ceph集群-添加/删除mon
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Django ORM中的Q对象
Q 对象在 Django ORM 中用于构建复杂的查询条件,特别是当你需要使用逻辑运算符(如 AND、OR、NOT)时。以下是一些使用 Q 对象进行复杂查询的实际例子。 Q对象使用 模型 假设我们有一个包含员工信息的模型 Employee: from djang…...
相控阵雷达原理详解
相控阵,即相位控制阵列,通过控制阵列各个单元的馈电相位来改变波束指向。 相控阵雷达的原理可以清晰地归纳为以下几点: 1. 基本构成: - 相控阵雷达,即相位控制电子扫描阵列雷达(Phased Array Radar, PAR&a…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
