摘要:
合集:AI案例-ML-泛金融业
AI问题:分类问题
数据集:银行客户流失预测的示例数据集
数据集价值:预测客户是否流失
解决方案:决策树、随机森林、逻辑回归建模和预测。
一、问题描述
客户流失指的是客户(玩家、订阅者、用户等)停止与公司之间的关系。客户流失发生在客户或订阅者停止与公司或服务进行业务往来时,也称为客户流失。它也被称作客户或客户的损失。
客户流失预测模型是一个工具,定义了客户流失的步骤和阶段,或者客户离开您的服务或产品。但是通过不断演变的流失模型,您可以通过在指标发生时采取行动来争取保留客户。
二、数据集内容
在 Kirill Eremenko 和 Hadelin de Ponteves 的 Udemy 课程“Deep Learning AZ™:Hands-On Artificial Neural Networks”中,使用的 Churn_Modelling.csv 数据集是一个用于银行客户流失预测的示例数据集。是一个专门设计用于教学目的的模拟数据集。该数据集并非来自真实世界的银行客户数据,而是由课程作者团队或相关人员生成,用于教学演示。数据集最早随课程发布,课程的初次发布日期为 2017年。以下是该数据集的数据结构和一些关键信息:
- 文件名:Churn_Modelling.csv
- 数据类型:CSV(逗号分隔值)
- 数据内容:包含银行客户的特征和标签,用于预测客户是否会流失(即是否关闭账户)。
数据列
以下是 Churn_Modelling.csv 数据集的主要列及其含义:
1. RowNumber:行号,唯一标识每一行数据。
2. CustomerId:客户ID,唯一标识每个客户。
3. Surname:客户的姓氏。
4. CreditScore:客户的信用评分。
5. Geography:客户的地理位置(国家)。
- England
- Scotland
- Wales
- Northern Ireland
6. Gender:客户的性别。
- Male
- Female
7. Age:客户的年龄。
8. Tenure:客户在银行的年限。
9. Balance:客户的账户余额。
10. NumOfProducts:客户使用的银行产品数量。
11. HasCrCard:客户是否拥有信用卡(1 表示有,0 表示没有)。
12. IsActiveMember:客户是否是活跃会员(1 表示是,0 表示否)。
13. EstimatedSalary:客户的估计年薪。
14. Exited:客户是否流失(1 表示流失,0 表示未流失)。
三、预测模型
安装
导入开发库和数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('./Churn_Modelling.csv')
data.head(4)
# splitting the dataset into x(independent variables) and y(dependent variables)
x = data.iloc[:,0:10]
y = data.iloc[:,10]
数据预处理
在使用该数据集进行客户流失学习模型训练之前,通常需要进行一些预处理步骤:
处理分类变量:Geography 和 Gender 是分类变量,需要将其转换为数值形式,例如使用独热编码(One-Hot Encoding)。
特征缩放:数值特征(如 CreditScore、Age、Tenure、Balance、NumOfProducts、HasCrCard、IsActiveMember、EstimatedSalary)可能需要进行标准化或归一化处理,以确保不同特征的尺度一致。
# Feature Scaling
# Only on Independent Variable to convert them into values ranging from -1 to +1
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.fit_transform(x_test)
x_train = pd.DataFrame(x_train)
x_train.head()
处理缺失值:检查数据集中是否有缺失值,并采取适当的方法进行处理(如填充均值、中位数或删除缺失值的行)。
数据分割:将数据集分割为训练集、验证集和测试集,以便进行模型的训练、调优和评估。
# splitting the data into training and testing set
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25, random_state = 0)
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
决策树建模和预测
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix
model = DecisionTreeClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print("Training Accuracy :", model.score(x_train, y_train))
print("Testing Accuaracy :", model.score(x_test, y_test))
cm = confusion_matrix(y_test, y_pred)
print(cm)
输出:
Training Accuracy : 1.0
Testing Accuaracy : 0.8012
[[1710 281]
[ 216 293]]
随机森林建模和预测
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print("Training Accuracy :", model.score(x_train, y_train))
print("Testing Accuracy :", model.score(x_test, y_test))
cm = confusion_matrix(y_test, y_pred)
print(cm)
输出:
Training Accuracy : 1.0
Testing Accuracy : 0.868
[[1918 73]
[ 257 252]]
逻辑回归建模和预测
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print("Training Accuracy :", model.score(x_train, y_train))
print("Testing Accuracy :", model.score(x_test, y_test))
cm = confusion_matrix(y_test, y_pred)
print(cm)
输出:
Training Accuracy : 0.8096
Testing Accuracy : 0.8092
[[1916 75]
[ 402 107]]
多层感知建模和预测
MLPClassifier
是 scikit-learn 库中的一个类,用于实现多层感知器(Multi-layer Perceptron)的神经网络分类器。多层感知器是一种前馈人工神经网络,它包含至少一个隐藏层,并使用非线性激活函数。
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(hidden_layer_sizes = (100, 100), activation ='relu',
solver = 'adam', max_iter = 50)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print("Training Accuracy :", model.score(x_train, y_train))
print("Testing Accuracy :", model.score(x_test, y_test))
cm = confusion_matrix(y_test, y_pred)
print(cm)
输出:
Training Accuracy : 0.8937333333333334
Testing Accuracy : 0.8592
[[1874 117]
[ 235 274]]