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

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

    作者:码银

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【python】基于决策树,SVM 和 神经网络 预测银行客户流失

    发表回复