matplotlib.pyplot绘制决策树的准确率,召回率,ROC,特征重要性

因为训练模型需要返回模型评价指标,但是召回率和ROC 不能很好的展示返回,所以决定把相关评价指标绘制成图片

DecisionTree2Pmml.py
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,accuracy_score, auc, confusion_matrix, f1_score, precision_score, recall_score,roc_curve
import prettytable  # 导入表格库
import matplotlib.pyplot as plt  # 导入图形展示库
from time import sleep
# 导入指标库
import numpy as np
def main(modelName,trainingFilePath):
    print(modelName)
    print(trainingFilePath)
    import pandas
    iris_df = pandas.read_csv(trainingFilePath)
    # print(iris_df.head(2))
    x=iris_df[iris_df.columns.difference(["response"])]
    y=iris_df["response"]


    x_train,x_test, y_train, y_test= train_test_split(x,y, test_size=0.2, random_state=0);

    from sklearn.tree import DecisionTreeClassifier
    from sklearn2pmml.pipeline import PMMLPipeline
    # DecisionTreeClassifier( max_depth=10)

    cur_tree=DecisionTreeClassifier()
    pipeline = PMMLPipeline([
        ("classifier", cur_tree)
    ])
    pipeline.fit(x_train,y_train)
    anwser=cur_tree.predict(x_test)
    #准确率:某个类别在测试结果中被正确测试的比率
    mean=float('%.4f' % np.mean(anwser == y_test))
    # 召回率:某个类别在真实结果中被正确预测的比率
    recall_str=classification_report(y_test,anwser)


    # 核心评估指标
    y_score = cur_tree.predict_proba(x_test)  # 获得决策树的预测
    fpr, tpr, thresholds = roc_curve(y_test, y_score[:, 1])  # ROC

    # # 模型效果可视化
    names_list =(iris_df.columns.difference(["response"])).tolist() # 分类模型维度列表
    color_list = ['r', 'c', 'b', 'g']  # 颜色列表
    plt.figure(figsize=(10, 5))  # 创建画布
    # 子网格1:ROC曲线
    plt.subplot(2, 2, 1)  # 第一个子网格
    plt.plot(fpr, tpr, label='ROC')  # 画出ROC曲线
    plt.plot([0, 1], [0, 1], linestyle='--', color='k', label='random chance')  # 画出随机状态下的准确率线
    plt.title('ROC')  # 子网格标题
    plt.xlabel('false positive rate')  # X轴标题
    plt.ylabel('true positive rate')  # y轴标题
    plt.legend(loc=0)

    # 子网格2:指标重要性
    feature_importance = cur_tree.feature_importances_  # 获得指标重要性
    plt.subplot(2, 2, 2)  # 第二个子网格
    plt.bar(np.arange(feature_importance.shape[0]), feature_importance, tick_label=names_list,
            color=color_list)  # 画出条形图
    plt.title('feature importance')  # 子网格标题
    plt.xlabel('features')  # x轴标题
    plt.ylabel('importance')  # y轴标题
    plt.suptitle('classification result')  # 图形总标题
    plt.savefig("E:/data/out/examples.png")


    # 子网格3:
    plt.subplot(2, 2, 3)  # 第二个子网格
    plt.axis('off')
    plt.title('mean:'+str(mean),loc ='center')  # 子网格标题

    plt.subplot(2, 2, 4)  # 第二个子网格
    plt.axis('off')
    plt.title(recall_str,loc ='right')
    fig=plt.gcf()
    #自动调整绘图区的大小及间距,在cmd窗口调用脚本时绘制图位置会错乱 
    fig.tight_layout() 
    fig.savefig("E:/data/out/examples.png")
    plt.close()
    from sklearn2pmml import sklearn2pmml
    sklearn2pmml(pipeline, modelName, with_repr=True)

 

DecisionTree_main.py

 

# coding=utf-8
import sys
import model_pmml.DecisionTree2Pmml as m
#sys.argv[0] 为脚本自身
#m.main(sys.argv[1],sys.argv[2])
# m.main("E:/data/out/DecisionTreeIris.pmml","E:/data/yanshi/Iris.csv")
m.main("E:/data/out/DecisionTreeIris.pmml","E:/data/classification.csv")

 

效果图如下:

 

https://pan.baidu.com/s/1OTCPay8RusAX4Wnx_MiYqw

附带训练集的csv文件

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, confusion_matrix,classification_report import seaborn as sns import matplotlib.pyplot as plt # 读取数据 data = pd.read_excel('E:/桌面/预测脆弱性/20230523/预测样本/预测样本.xlsx') # 分割训练集和验证集 train_data = data.sample(frac=0.8, random_state=1) test_data = data.drop(train_data.index) # 定义特征变量和目标变量 features = ['高程', '起伏度', '桥梁长', '道路长', '平均坡度', '平均地温', 'T小于0', '相态'] target = '交通风险' # 训练随机森林模型 rf = RandomForestClassifier(n_estimators=100, random_state=1) rf.fit(train_data[features], train_data[target]) # 在验证集上进行预测并计算精度、召回率和F1值等指标 pred = rf.predict(test_data[features]) accuracy = accuracy_score(test_data[target], pred) confusion_mat = confusion_matrix(test_data[target], pred) classification_rep = classification_report(test_data[target], pred) print('Accuracy:', accuracy) print('Confusion matrix:') print(confusion_mat) print('Classification report:') print(classification_rep) # 输出混淆矩阵片 sns.heatmap(confusion_mat, annot=True, cmap="Blues") plt.show() # 读取新数据文件并预测结果 new_data = pd.read_excel('E:/桌面/预测脆弱性/20230523/预测样本/预测结果/交通风险预测096.xlsx') new_pred = rf.predict(new_data[features]) new_data['交通风险预测结果'] = new_pred new_data.to_excel('E:/桌面/预测脆弱性/20230523/预测样本/预测结果/交通风险预测096结果.xlsx', index=False)修改代码使得显示决策树模型以及多分类的roc曲线和auc值
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值