首页 > Python资料 博客日记
【python】基于决策树,SVM 和 神经网络 预测银行客户流失
2025-01-01 10:00:05Python资料围观12次
学习目标
会用决策树算法、SVM算法和神经网络对数据进行分类
会对模型进行校验评估
东西都在这里代码数据集啥的 :https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwd=pfcs 提取码:pfcs
数据预处理
之前对原始数据集的预处理情况:https://hw-mayin.blog.csdn.net/article/details/144697749
接下来是本篇文章所作的预处理:首先,我们从CSV文件中导入了训练集和测试集数据。数据预处理步骤包括特征和标签的分离。我们从数据集中删除了’Exited’列,该列表示客户是否流失,作为我们的标签(y_train和y_test),其余特征(X_train和X_test)用于模型训练和测试。
X_train = train_df.drop('Exited', axis=1)
y_train = train_df['Exited']
X_test = test_df.drop('Exited', axis=1)
y_test = test_df['Exited']
模型训练
a) 决策树模型
决策树模型因其直观易懂而广受欢迎。我们使用DecisionTreeClassifier
从scikit-learn
库中创建模型,并设置最大深度为30以防止过拟合。
dt_clf = DecisionTreeClassifier(random_state=42, max_depth=30)
dt_clf.fit(X_train, y_train)
b) SVM模型
支持向量机是一种强大的分类器,适用于复杂数据集。我们使用SVC
类创建SVM模型,并启用概率估计。
svm_clf = SVC(random_state=42, probability=True)
svm_clf.fit(X_train, y_train)
c) 神经网络模型
神经网络,特别是多层感知器,因其在处理非线性数据中的能力而被选用。我们使用MLPClassifier
创建神经网络模型,并设置最大迭代次数为1000。
nn_clf = MLPClassifier(random_state=42, max_iter=1000)
nn_clf.fit(X_train, y_train)
模型评估
为了评估模型性能,我们定义了两个函数:plot_confusion_matrix
和plot_roc_auc
。这些函数分别用于绘制混淆矩阵和ROC曲线,计算AUC值。
- 混淆矩阵提供了模型预测的详细视图,包括真正例、假正例、真反例和假反例。
- ROC曲线和AUC值衡量了模型在区分两个类别方面的效能,AUC值越接近1,表示模型的性能越好。。
def plot_confusion_matrix(y_true, y_pred, class_names, title='Confusion Matrix'):
cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt='d', xticklabels=class_names, yticklabels=class_names)
plt.title(title)
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
def plot_roc_auc(y_true, y_score, title='ROC Curve'):
fpr, tpr, _ = roc_curve(y_true, y_score)
roc_auc = roc_auc_score(y_true, y_score)
plt.plot(fpr, tpr, label=f'AUC = {roc_auc:.2f}')
plt.plot([0, 1], [0, 1], 'k--')
plt.title(title)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend(loc='lower right')
plt.show()
决策树模型评估
# 评估决策树模型
y_pred_dt = dt_clf.predict(X_test)
y_pred_proba_dt = dt_clf.predict_proba(X_test)[:, 1]
plot_confusion_matrix(y_test, y_pred_dt, class_names=['Not Exited', 'Exited'], title='Decision Tree Confusion Matrix')
plot_roc_auc(y_test, y_pred_proba_dt, title='Decision Tree ROC Curve')
我们的决策树模型在测试集上的表现如下:
SVM模型评估
# 评估SVM模型
y_pred_svm = svm_clf.predict(X_test)
y_pred_proba_svm = svm_clf.predict_proba(X_test)[:, 1]
plot_confusion_matrix(y_test, y_pred_svm, class_names=['Not Exited', 'Exited'], title='SVM Confusion Matrix')
plot_roc_auc(y_test, y_pred_proba_svm, title='SVM ROC Curve')
SVM模型的评估结果如下:
神经网络模型评估
# 评估神经网络模型
y_pred_nn = nn_clf.predict(X_test)
y_pred_proba_nn = nn_clf.predict_proba(X_test)[:, 1]
plot_confusion_matrix(y_test, y_pred_nn, class_names=['Not Exited', 'Exited'], title='Neural Network Confusion Matrix')
plot_roc_auc(y_test, y_pred_proba_nn, title='Neural Network ROC Curve')
神经网络模型的评估结果如下:
K折交叉验证
为了确保模型的稳健性,我们对每个模型进行了5折交叉验证,并计算了平均准确率和标准差。结果如下:
- 决策树:平均准确率为0.81,标准差为0.01。
- SVM:平均准确率为0.59,标准差为0.05。
- 神经网络:平均准确率为0.77,标准差为0.01。
结论
根据我们的评估,决策树模型在客户流失预测方面表现最佳,具有最高的平均准确率和最小的标准差。SVM模型的表现不尽人意,可能需要进一步调整参数或特征工程。神经网络模型的表现介于两者之间,表明有进一步优化的空间。
小注
查找决策树的最佳深度的search-bestdepth.py文件
import pandas as pd
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
# 1. 导入数据
train_df = pd.read_csv('Churn-Modelling-train.csv')
test_df = pd.read_csv('Churn-Modelling-test.csv')
# 2. 数据预处理
# 特征和标签分离
X_train = train_df.drop('Exited', axis=1)
y_train = train_df['Exited']
X_test = test_df.drop('Exited', axis=1)
y_test = test_df['Exited']
# 参数网格
param_grid = {
'max_depth': range(1, 101) # 决策树深度范围从1到100
}
# 4. 模型训练
# a) 决策树模型
# 创建决策树分类器实例
dt_clf = DecisionTreeClassifier(random_state=42)
# 网格搜索
grid_search = GridSearchCV(estimator=dt_clf, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 最佳参数
best_depth = grid_search.best_params_['max_depth']
print(f"Best max_depth for Decision Tree: {best_depth}")
关于[:, 1]的作用
y_pred_nn = nn_clf.predict(X_test)
y_pred_proba_nn = nn_clf.predict_proba(X_test)[:, 1]
# [:, 1] 表示我们只取预测为正类的概率。在二分类问题中,predict_proba 返回一个形状为 (n_samples, 2) 的数组,其中 n_samples 是样本数量,2 表示两个类别。第一个列代表负类的概率,第二列代表正类的概率。
plot_confusion_matrix(y_test, y_pred_nn, class_names=['Not Exited', 'Exited'], title='Neural Network Confusion Matrix')
plot_roc_auc(y_test, y_pred_proba_nn, title='Neural Network ROC Curve')
标签:
相关文章
最新发布
- 数据库应用课程设计:航班管理及售票系统(SQL Server+Python)
- 华为OD机试E卷 --工号不够用了怎么办--24年OD统一考试(Java & JS & Python & C & C++)
- Python-PCL安装与应用指南
- Python绘制简易动态圣诞树
- Python的列表基础知识点(超详细流程)
- 华为OD机试E卷 --简易压缩算法--24年OD统一考试(Java & JS & Python & C & C++)
- Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别
- 基于OpenCV和Python的人脸识别系统_django
- 猫头虎分享:最新 TensorFlow 各版本下载地址、对应 Python 版本、编译和运行环境版本号大全
- 华为OD机试E卷 --补种未成活胡杨 --24年OD统一考试(Java & JS & Python & C & C++)
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程