[集成学习]基于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
idstylea1a2a3a4a5a6a7a8...B9B10B11B12B13B14B15B16B17isorno
012753.03539987.65379181.55817185.61159385.62967885.80757682.34645384.769555...6142319.011103050
12388.92279082.94626285.16608185.18972477.76249883.59557982.15236788.872546...654418.01080300
23395.04829493.33313177.66037593.03427488.86999894.16996295.60265595.877373...495224.01017000
34371.15232876.78576766.69170181.92612566.65499877.77367477.58024776.989502...6104727.0101018250
45370.57396271.64594970.44455474.02983266.65499866.33609262.09302174.436962...6134225.01515000
..................................................................
19591960271.35766375.37369070.44455477.76704468.43027675.02696575.48226170.333970...563525.01120000
19601961299.03688899.03017299.03255099.98334299.97749899.99186799.99271399.980365...5147929.09930200
19611962290.77128191.92105592.67178796.71974394.96189997.24515895.60265595.877373...684539.020170300
19621963282.42732788.51148974.05246493.03427476.46171194.70467691.16357295.877373...684421.012720200
19631964277.80869277.803468702.99611477.76704461.80365377.77367473.19018958.796528...674325.010122500

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 新数据预测结果

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

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

相关文章

业务架构、数据架构、应用架构和技术架构分析

一文看懂:什么是业务架构、数据架构、应用架构和技术架构 TOGAF(开放集团架构框架)是企业广泛应用的架构设计和管理利器。其核心在于四大架构领域:业务、数据、应用和技术,助力组织高效运作。TOGAF,让架构设…

【深度学习入门篇 ⑩】Seq2Seq模型:语言翻译

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! &…

unity渲染人物模型透明度问题

问题1:有独立的手和衣服的模型,但最终只渲染出来半透明衣服 问题2:透明度贴图是正确的但显示却不正确 这上面两个模型的问题都是因为人物模型是一个完整的,为啥有些地方可以正常显示,有些地方透明度却有问题。 其中…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明:这是自己做的课程设计作业,得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线,分别是存储用户信息和商品信息,并且都设为公共属性,方便对用户信息和商品信息…

艺术与技术的交响曲:CSS绘图的艺术与实践

在前端开发的世界里,CSS(层叠样式表)作为网页布局和样式的基石,其功能早已超越了简单的颜色和间距设置。近年来,随着CSS3的普及,开发者们开始探索CSS在图形绘制方面的潜力,用纯粹的代码创造出令…

UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据

UniApp 实现长列表分页,通过 onReachBottom 方法上划分次加载数据 项目实战中比较常见,方便下次使用 文章目录 一、应用场景? 二、作用 三、使用步骤?          3.1 实现的整体思路?    …

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

目录 专题一、深度学习发展与机器学习 专题二、深度卷积网络基本原理 专题三、TensorFlow与Keras介绍与入门 专题四、PyTorch介绍与入门 专题五、卷积神经网络实践与遥感图像场景分类 专题六、深度学习与遥感图像检测 专题七、遥感图像检测案例 专题八、深度学习与遥感…

字节码编程之bytebuddy结合javaagent支持多种监控方式

写在前面 打印方法执行耗时是监控,获取程序运行的JVM信息是监控,链路追踪也是监控。 本文看下如何实现一个通用的监控解决方案。 1:程序 定义premain: package com.dahuyou.multi.monitor;import com.dahuyou.multi.monitor.…

安卓逆向入门(3)------Frida基础

安装frida pip install frida pip install frida-tools //验证安装成功 frida --versionfrida连接手机 1、Android(已ROOT) frida-server 参考:https://www.jianshu.com/p/c349471bdef7 2、Android(非ROOT) pip3 in…

智能门锁的工作原理

智能门锁的工作原理是一个复杂而精密的过程,它结合了物联网、密码学、身份认证和通信技术等多个领域的先进技术。以下是智能门锁工作原理的详细解析: 一、身份认证 智能门锁通过身份认证机制来确保只有授权的用户才能开启门锁。常见的身份认证方式包括…

数据库内核研发学习之路(五)创建postgres系统表

写在前面 在使用postgres的时候,有很多表是我们一开始安装好数据库就存在的,这些表称为系统表,他们记载一些数据库信息,比如我们做运维工作常用的pg_stat_activity;我们在数据库中查询这张表可以发现他存储了一些数据库连接信息。…

多租户架构的艺术:在SQL Server中实现数据库的多租户

多租户架构的艺术:在SQL Server中实现数据库的多租户 在云计算和SaaS(软件即服务)时代,多租户架构(Multi-Tenancy)成为了数据库设计中的一个关键概念。它允许多个租户(客户)共享相同…

初等数论精解【2】

文章目录 素数基础素数理论互素定义性质应用示例最大公约数方法一:欧几里得算法方法二:列举法(适用于较小的数)欧几里得算法编程实现扩展欧几里得算法概述算法背景算法原理算法步骤应用场景示例代码 结论素数分布素数概述一、定义…

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族(TCP/IP) 1.2 TCP/IP四层模型 1. 网络访问层(Network Access Layer) 2. 网络层(Internet Layer) 3. 传输层(Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

机器学习-19-基于交互式web应用框架streamlit和gradio转化数据和机器学习模型

参考Streamlit:简单快速的Python Web应用开发工具 参考Python(Web时代)—— 超简单:一行代码就能搭建网站 参考对比Streamlit和Gradio:选择最适合你的Python交互式应用框架 参考Gradio:构建交互式界面的简单而强大的Python库 参考【吴恩达 X HuggingFace】使用Gradio快速…

【JavaScript 算法】双指针法:高效处理数组问题

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现示例问题1:两数之和 II - 输入有序数组示例问题2:反转字符串中的元音字母注释说明: 三、应用场景四、总结 双指针法(Two Pointer Technique&#xff…

sqlalchemy_dm

1、参考文档: https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…

高等数学用到的初等数学

指数 同指不同底乘法 (ab)xaxbx