当前位置: 首页 > news >正文

【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割

数据预处理

通过网盘分享的文件:银行流失预测数据和代码
链接: https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwd=pfcs 提取码: pfcs

非数值特征处理
  • 目的:将非数值特征转换为数值型,以便模型能够处理。
  • 方法
    • 地理位置:可以使用独热编码(One-Hot Encoding)或标签编码(Label Encoding)将不同国家/地区转换为数值。
    • 性别:可以使用标签编码,将“男”和“女”分别编码为0和1。
  • 结果文件:保存为Churn-Modelling-newT.csv
数据离散化处理
  • 目的:将连续变量转换为离散变量,简化模型复杂度,提高模型的可解释性。
  • 方法
    • 统计分析:对连续数据进行描述性统计分析,了解数据的分布情况。
    • 离散化方法
      • 等宽离散化:将数据分为等宽的区间。
      • 等频离散化:将数据分为等频的区间。
      • 基于聚类的离散化:使用聚类算法确定离散化的区间。
  • 结果文件:保存为Churn-Modelling-new-tree.csv
数据筛选
  • 目的:去除与模型训练无关的特征列,保留有意义的数据,解决数据不均衡问题。
  • 方法
    • 特征筛选:舍去如行号、用户编号、用户姓名等无关特征。
    • 数据平衡
      • 过采样:增加少数类别的样本数量。
      • 欠采样:减少多数类别的样本数量。
  • 结果文件:保存为final.csv
数据分割
  • 目的:将数据集分为训练集和测试集,用于模型训练和评估。
  • 方法:按照4:1的比例分割数据集。
  • 结果文件
    • 训练集:Churn-Modelling-train.csv
    • 测试集:Churn-Modelling-test.csv
数据集预览

数据总览

数据特征列描述

RowNumber:行号
CustomerID:用户编号
Surname:用户姓名
CreditScore:信用分数
Geography:用户所在国家/地区
Gender:用户性别
Age:年龄
Tenure:当了本银行多少年用户
Balance:存贷款情况
NumOfProducts:使用产品数量
HasCrCard:是否有本银行信用卡
IsActiveMember:是否活跃用户
EstimatedSalary:估计收入
Exited:是否已流失,作为标签数据

代码部分

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, KBinsDiscretizer
# 过采样与欠采样解决数据不均衡问题
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler# 读取数据
df = pd.read_csv('Churn-Modelling.csv')# a) 非数值特征处理
# 地理位置 - 独热编码
geography_dummies = pd.get_dummies(df['Geography'], prefix='Geography')
df = pd.concat([df, geography_dummies], axis=1)
df.drop('Geography', axis=1, inplace=True)# 性别 - 标签编码
label_encoder = LabelEncoder()
df['Gender'] = label_encoder.fit_transform(df['Gender'])# 保存处理后的文件
df.to_csv('Churn-Modelling-newT.csv', index=False)# b) 数据离散化处理
# 信用分数、年龄、存贷款情况、估计收入 - 等宽离散化
discretizer = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='uniform')
columns_to_discretize = ['CreditScore', 'Age', 'Balance', 'EstimatedSalary']
df[columns_to_discretize] = discretizer.fit_transform(df[columns_to_discretize])# 保存处理后的文件
df.to_csv('Churn-Modelling-new-tree.csv', index=False)# c) 数据筛选
# 去除无关特征列
df.drop(['RowNumber', 'Customerid', 'Surname'], axis=1, inplace=True)X = df.drop('Exited', axis=1)
y = df['Exited']# 过采样
over_sampler = RandomOverSampler(sampling_strategy=0.5)
X_over, y_over = over_sampler.fit_resample(X, y)# 欠采样
under_sampler = RandomUnderSampler(sampling_strategy=0.8)
X_resampled, y_resampled = under_sampler.fit_resample(X_over, y_over)# 保存筛选后的文件
final_df = pd.concat([X_resampled, y_resampled], axis=1)
final_df.to_csv('final.csv', index=False)# d) 数据分割
X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)train_df = pd.concat([X_train, y_train], axis=1)
test_df = pd.concat([X_test, y_test], axis=1)train_df.to_csv('Churn-Modelling-train.csv', index=False)
test_df.to_csv('Churn-Modelling-test.csv', index=False)

预处理结果图

小注

要查看LabelEncoder是如何将类别值映射到整数的,你可以使用LabelEncoder对象的classes_属性。这个属性是一个数组,包含了原始类别值的排序列表,其索引位置对应于转换后的整数值。

以下是如何查看性别类别值映射的方法:

label_encoder = LabelEncoder()
df['Gender'] = label_encoder.fit_transform(df['Gender'])# 查看类别值的映射
print(label_encoder.classes_)

假设df['Gender']列包含两个唯一值'Male''Female'LabelEncoder会根据它们在数据中出现的顺序进行排序(通常是字典序),然后进行编码。例如,如果输出是:

['Female' 'Male']

这意味着'Female'被编码为0,'Male'被编码为1。如果顺序相反,那么'Male'将被编码为0,'Female'被编码为1。

如果你想要明确地指定编码方式,可以使用map函数手动设置映射:

# 假设我们想要将'Male'编码为0,'Female'编码为1
gender_mapping = {'Male': 0, 'Female': 1}
df['Gender'] = df['Gender'].map(gender_mapping)

这样就可以确保'Male'总是被编码为0,'Female'总是被编码为1。


http://www.mrgr.cn/news/81381.html

相关文章:

  • 《Vue进阶教程》(11)watch的实现详细教程
  • 探索多模态大语言模型(MLLMs)的推理能力
  • C语言(一)——初识C语言
  • MDS-NPV/NPIV
  • LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)
  • VIVO Android面试题及参考答案
  • postman http请求正常,使用前端代理服务器报403
  • 使用Qwen2-VL模型批量标注图像内容(图像理解)
  • YOLOv11模型改进-模块-引入多尺度大核注意力Multi-scale Large Kernel Attention
  • 【阅读记录-章节6】Build a Large Language Model (From Scratch)
  • 机器学习2-NumPy
  • 使用RabbitMQ
  • ABAP开发-权限控制
  • I.MX6U 启动方式详解
  • 解读1:TwinLiteNet论文中基础模块及其他相关模块总结
  • Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
  • 基于ceres优化的3d激光雷达开源算法
  • EMS从0到1之数据采集
  • Issac ROS navigation测试
  • Vivado 编译(单核性能对比+高性能迷你主机+Ubuntu20.04/22.04安装与区别+20.04使用远程命令)
  • 【MySQL基础篇】多表查询(隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询)
  • 如何更好的进行时间管理
  • Python 自动化 打开网站 填表登陆 例子
  • OpenEuler 22.03 安装 flink-1.17.2 集群
  • 重温设计模式--1、组合模式
  • Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人