机器学习每周挑战——客户流失数据预测

news2024/11/24 8:39:04

# 字段         说明
# RowNumber 每行数据的唯一标识符。
# CustomerId    客户的唯一标识符。
# Surname   客户的姓氏(出于隐私考虑,请对这些数据进行匿名处理)。
# CreditScore   客户在数据收集时的信用评分。
# Geography 客户所在的国家或地区,提供有关流失的地理趋势的见解。
# Gender    客户的性别。
# Age   客户的年龄,用于人口统计分析。
# Tenure    客户与银行合作的年限。
# Balance   客户的账户余额。
# NumOfProducts 客户购买或订阅的产品数量。
# HasCrCard 指示客户是否拥有信用卡(1表示是,0表示否)。
# IsActiveMember    指示客户是否为活跃会员(1表示是,0表示否)。
# EstimatedSalary   客户的预估工资。
# Exited    目标变量,指示客户是否已流失(1表示是,0表示否)。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder,StandardScaler
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score
from hyperopt import fmin,tpe,hp
from hyperopt import STATUS_OK


data = pd.read_csv('Customer Churn Dataset.csv')
pd.set_option("display.max_row",1000)
pd.set_option("display.max_column",1000)

读入数据,同时导入需要用到的数据库对于数据的处理,我们可以发现前三列都是类似于ID的数据,对我们数据的分析没有任何用处,因此我们将前三列数据删除。

# 来看问题
# 探索性数据分析:通过多维度客户数据的深度挖掘,揭示潜在关联、趋势与异常,直观呈现客户特征与流失风险之间的内在关系。
# 客户细分:依据客户的人口统计特征、金融行为及产品偏好等信息,划分出具有不同流失倾向的群体,为精细化营销与服务策略提供依据。
# 流失预测建模:利用包含目标变量(Exited)的数据集训练预测模型,准确评估每个客户的未来流失概率,为预防性干预措施提供精准导向。
# 特征重要性分析:计算模型中各特征的贡献度或重要性得分,揭示影响客户流失的关键因素。
data_geography = pd.crosstab(data['Geography'],data['Exited'])
data_geography.plot(kind='bar',stacked=False,color=['blue','red'],figsize=(10,8))
plt.xlabel('地理因素')
plt.ylabel('客户流失数量')
plt.tight_layout()
# plt.show()

data_gender = pd.crosstab(data['Gender'],data['Exited'])
data_gender.plot(kind='bar',stacked=True,color=['green','pink'],figsize=(10,8))
plt.xlabel('性别因素')
plt.ylabel('客户流失数量')
plt.tight_layout()

bins = [0,20,30,40,50]
data['Age'] = pd.cut(data['Age'],bins=bins)
data_age = pd.crosstab(data['Age'],data['Exited'])
data_age.plot(kind='bar',stacked=True,color=['yellow','red'],figsize=(10,8))
plt.xlabel('年龄因素')
plt.ylabel('客户流失数量')
plt.tight_layout()

plt.show()

 

plt.figure(figsize=(10,8))
sns.boxplot(x=data['Exited'],y=data['Tenure'])
plt.xlabel('客户是否流失')
plt.xticks([0,1],labels=['已流失','未流失'])
plt.ylabel('与银行合作年限')
plt.tight_layout()


plt.figure(figsize=(10,8))
sns.boxplot(x=data['Exited'],y=data['Balance'])
plt.xlabel('客户是否流失')
plt.xticks([0,1],labels=['已流失','未流失'])
plt.ylabel('客户的银行账户余额')
plt.tight_layout()

plt.figure(figsize=(10,8))
sns.boxplot(x=data['Exited'],y=data['EstimatedSalary'],
            medianprops={'color':'green'},flierprops={'markerfacecolor':'blue','markeredgecolor':'red'},
            #  指定中值线的颜色,为绿色           指定离群点的填充颜色和离群点的边框颜色(边框颜色不经常用)
            boxprops={'facecolor':'yellow'})
            # 指定箱型图内的颜色
plt.xlabel('客户是否流失')
plt.xticks([0,1],labels=['已流失','未流失'])
plt.ylabel('客户的预估工资')
plt.tight_layout()
# 由于设置箱型图颜色较为复杂,因此我只在一个箱型图中进行设置,
# plt.show()

 

data_numproduct = data['NumOfProducts'].value_counts().reset_index()
plt.figure(figsize=(10,8))
plt.pie(data_numproduct['count'],labels=data_numproduct['NumOfProducts'],autopct='%1.1f%%')
plt.title('购买产品数量与客户流失之间的关系')


data_hascard = data['HasCrCard'].value_counts().reset_index()
plt.figure(figsize=(10,8))
plt.pie(data_hascard['count'],labels=data_hascard['HasCrCard'].map({0:'未拥有',1:'拥有'}),autopct='%1.1f%%')
plt.title('是否有信用卡与客户流失之间的关系')


data_activemenber = data['IsActiveMember'].value_counts().reset_index()
plt.figure(figsize=(10,8))
plt.pie(data_activemenber['count'],labels=data_activemenber['IsActiveMember'].map({0:'不是活跃会员',1:'是活跃会员'}),autopct='%1.1f%%')
plt.title('客户是否活跃与客户流失之间的关系')

plt.show()

 

 

 最后我们对数据进行建模

le = LabelEncoder()
for col in data.columns[:-1]:
    data[col] = le.fit_transform(data[col])

# 将分类数据转换为数值型数据后,我们可以发现部分数据跨度非常大,从0到几万,而部分数据只有0,1。因此我们必须对数据进行标准化,
# 即将数据缩放到相同的区间内
# scaler = StandardScaler()
# data_feature = data.iloc[:,0:10]
# data_feature = scaler.fit_transform(data_feature)

log = LogisticRegression(max_iter=10000)
Dtree = DecisionTreeClassifier()
Rtree = RandomForestClassifier()


models = [log,Dtree,Rtree]
# X = data_feature
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
# 由于数据存在不均衡现象,因此我们对数据进行重采样
# X_smote,y_smote = SMOTE().fit_resample(X_train,y_train)
# X_smote = scaler.fit_transform(X_smote)

for model in models:
    model.fit(X_train,y_train)
    y_pred = model.predict(X_test)
    class_report = classification_report(y_test,y_pred)
    print(model.__class__.__name__)
    print(class_report)

    # 模型的混淆矩阵
    corr = confusion_matrix(y_test,y_pred)
    plt.figure(figsize=(10,8))
    sns.heatmap(corr,cmap='viridis',annot=True,fmt='.2f')
    plt.title(model.__class__.__name__+'的混淆矩阵')

plt.show()

importance = Rtree.feature_importances_
sort_importance = importance.argsort()
feature = X.columns

plt.figure()
plt.barh(range(len(sort_importance)),importance[sort_importance])
plt.yticks(range(len(sort_importance)), [feature[i] for i in sort_importance])
plt.title('特征重要性分析')
plt.xlabel("特征重要性")
plt.show()

LogisticRegression
              precision    recall  f1-score   support

           0       0.83      0.97      0.89      2416
           1       0.59      0.16      0.26       584

    accuracy                           0.82      3000
   macro avg       0.71      0.57      0.57      3000
weighted avg       0.78      0.82      0.77      3000

DecisionTreeClassifier
              precision    recall  f1-score   support

           0       0.88      0.87      0.87      2416
           1       0.47      0.50      0.48       584

    accuracy                           0.79      3000
   macro avg       0.67      0.68      0.68      3000
weighted avg       0.80      0.79      0.80      3000

RandomForestClassifier
              precision    recall  f1-score   support

           0       0.88      0.96      0.92      2416
           1       0.76      0.46      0.57       584

    accuracy                           0.87      3000
   macro avg       0.82      0.71      0.74      3000
weighted avg       0.86      0.87      0.85      3000

SVC
              precision    recall  f1-score   support

           0       0.86      0.98      0.92      2416
           1       0.83      0.36      0.50       584

    accuracy                           0.86      3000
   macro avg       0.85      0.67      0.71      3000
weighted avg       0.86      0.86      0.84      3000

 

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

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

相关文章

文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)

1. 文件分块 将大文件切分成较小的片段(通常称为分片或块),然后逐个上传这些分片。这种方法可以提高上传的稳定性,因为如果某个分片上传失败,只需要重新上传该分片而不需要重新上传整个文件。同时,分片上传…

React的路由

1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-ro…

AI图书推荐:将 ChatGPT和Excel融合倍增工作效率

《将 ChatGPT和Excel融合倍增工作效率》( Hands-on ChatGPT in Excel. Enhance Your Excel Workbooks)由Mitja Martini撰写,旨在教授读者如何将ChatGPT与Excel结合使用,以提升工作效率和创造AI增强的Excel工具。它还提供了Excel中…

「中标喜报」合众致达中标深圳安居乐寓智能水电表供货及安装项目

2024年4月25日,深圳合众致达科技有限公司(以下简称“我司”)成功中标安居乐寓2023盐田区保障性租赁住房改造提升项目的水电表供货与安装工程(二次)项目,此次中标标志着我司在城中村公寓出租房能源计费领域的专业实力及市场竞争力得到了进一步的认可。 我…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题,mark下。 中途遇到了很多问题,如果有相同的伙伴遇到了类似的,欢迎交流 官方的video播放器在app上不友好,有以下功能不支持。 loadedmetadata、controlstoggle不支持导致只能手写控制层。 不…

Pycharm远程连接实验室服务器Conda环境配置

如何配置Pycharm和远程服务器 这类博客较多,参考内容 https://blog.csdn.net/fengbao24/article/details/125515542 Python解释器选择(conda3) 1. Settings -> Add Interpreter -> On SSH 注意,这里的SSH需要在你把远程…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP:可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP:可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认(像GBN)单个重传定时器(像…

深入浅出TCP 与 UDP

🔥 引言 在互联网的广阔天地里,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)作为传输层的两大支柱,各自承担着不同的使命。下面这篇文章将带你从基础到进阶,全…

Unity射击游戏开发教程:(8)构建 UI 元素:添加分数显示

用户界面决定用户如何与屏幕交互。UI 适用于所有类型的游戏和应用程序,在此示例中,我们将为我的太空射击游戏设置一个简单的记分板。 第一步是在层次结构中创建一个 UI 元素。只需在层次结构中右键单击,滚动 UI 并选择要添加的 UI 元素类型。在本例中,我们将使用文本元素。…

xLua背包实践

准备工作 环境,代码 在C#代码方面我们需要准备单例模式基类,AB包管理器,lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包,具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码: JsonUtil…

必应bing广告可以在国内推广投放了吗?

搜索引擎营销(SEM)是企业不可或缺的市场拓展手段之一,微软的必应Bing搜索引擎,作为全球第二大搜索引擎,其在中国市场的布局正逐渐显露其独特的价值与潜力。随着必应Bing广告正式对中国市场开放,它不仅为国内…

活动回顾 | 春起潮涌——硬件驱动的量化交易与AI

4月20日,华锐技术ACLUB联合AMD在上海举办了“春起潮涌——硬件驱动的量化交易与AI”沙龙活动,会议围绕FPGA硬件加速、CPU&网卡调优、AI技术应用等展开,近50位量化IT与分享嘉宾一起探讨硬件技术在量化交易和AI领域的应用和创新。 FPGA在交…

SmartEDA助力教学创新:探索未来教育的无限可能

在数字化、智能化的浪潮中,教育领域正经历着前所未有的变革。SmartEDA,作为一款强大的数据分析工具,不仅能够助力科研工作者探索数据的奥秘,还能为教育工作者提供全新的教学手段和思路。本文将探讨如何使用SmartEDA进行教学&#…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

【OC和红移的双面材质】

OC和红移的双面材质 2021-12-23 18:36 rs oc 评论(0)

【酱浦菌-模拟仿真】python模拟仿真PN结伏安特性

PN结的伏安特性 PN结的伏安特性描述了PN结在外部电压作用下的电流-电压行为。这种特性通常包括正向偏置和反向偏置两种情况。 正向偏置 当外部电压的正极接到PN结的P型材料,负极接到N型材料时,称为正向偏置。在这种情况下,外加的正向电压会…

nmap扫描工控设备的脚本支持

参考资料 转自(http://www.360doc.com/content/15/1201/11/26186435_517125254.shtml) 介绍 NMAP是一款强大的网络扫描工具,除了普通的TCP/IP网络扫描之外,NMAP的扩展脚本功能为我们提供了更为广阔的应用范围。 针对脚本学习可…

构建下一代去中心化应用:基于BASE链的DApp开发

在区块链技术的快速发展中,去中心化应用(Decentralized Applications,DApps)已经成为了一个热门话题。这些应用通过区块链技术,实现了去中心化、透明、安全和不可篡改的特性,为用户提供了全新的体验和解决方…

js使用echarts图表的柱状图的使用

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><title>Bar Chart with Custom Label</title><script src"https://cdn.jsdelivr.net/npm/echarts5.2.2/dist/echarts.min.js"></script> </head&…

Linux编辑器调试器 gcc/g++ gdb 编译过程及使用讲解

这恋爱呀 我有两不谈 第一异性不谈 因为我们性别不一样 我知道的她不知道相处起来太累 第二同性不谈 因为我们性别一样 我知道的他也知道相处起来太无聊了 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–…