首页 > Python资料 博客日记

【python】基于决策树,SVM 和 神经网络 预测银行客户流失

2025-01-01 10:00:05Python资料围观12

文章【python】基于决策树,SVM 和 神经网络 预测银行客户流失分享给大家,欢迎收藏Python资料网,专注分享技术知识

学习目标
会用决策树算法、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) 决策树模型

决策树模型因其直观易懂而广受欢迎。我们使用DecisionTreeClassifierscikit-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_matrixplot_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')

版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐