【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:是否已流失,作为标签数据

代码部分

python 复制代码
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_属性。这个属性是一个数组,包含了原始类别值的排序列表,其索引位置对应于转换后的整数值。

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

python 复制代码
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函数手动设置映射:

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

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

相关推荐
愚润求学29 分钟前
【C++】list模拟实现
开发语言·数据结构·c++·list
专注VB编程开发20年3 小时前
写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码?
开发语言·vb.net
仙人掌_lz4 小时前
利用python从零实现Byte Pair Encoding(BPE):NLP 中的“变形金刚”
开发语言·python·gpt·自然语言处理·llm·token·deepseek
羊小猪~~4 小时前
深度学习项目--分组卷积与ResNext网络实验探究(pytorch复现)
网络·人工智能·pytorch·python·深度学习·神经网络·机器学习
q567315234 小时前
使用Alamofire下载网站首页内容
开发语言·爬虫·python·scrapy·golang
Aerkui5 小时前
Python标准库-copy
开发语言·python
刚入门的大一新生5 小时前
C++初阶-C++的讲解1
开发语言·c++
Try,多训练5 小时前
Pytorch查看神经网络结构和参数量
人工智能·pytorch·python
Swift社区6 小时前
从表格到序列:Swift 如何优雅地解 LeetCode 251 展开二维向量
开发语言·leetcode·swift
hweiyu006 小时前
Python从入门到精通全套视频教程免费
开发语言·python