【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。

相关推荐
API快乐传递者3 分钟前
Python爬虫获取淘宝详情接口详细解析
开发语言·爬虫·python
公众号Codewar原创作者5 分钟前
R数据分析:工具变量回归的做法和解释,实例解析
开发语言·人工智能·python
赵钰老师8 分钟前
基于R语言APSIM模型应用及批量模拟(精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等)
开发语言·数据分析·r语言
FL162386312910 分钟前
python版本的Selenium的下载及chrome环境搭建和简单使用
chrome·python·selenium
巫师不要去魔法部乱说14 分钟前
PyCharm专项训练5 最短路径算法
python·算法·pycharm
Chloe.Zz21 分钟前
Python基础知识回顾
python
lly20240625 分钟前
Highcharts 饼图:数据可视化利器
开发语言
骑个小蜗牛25 分钟前
Python 标准库:random——随机数
python
lw向北.31 分钟前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
Trouvaille ~34 分钟前
【机器学习】从流动到恒常,无穷中归一:积分的数学诗意
人工智能·python·机器学习·ai·数据分析·matplotlib·微积分