[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)

写在前面

汽车评估
机器学习 第十四组 “人见人爱,花见花开!”
HNU-机器学习笔记:模型准确度无论是用留出法还是交叉验证亦或是自助法都是无法准确的反应模型能力的!
因为这个准确度会随着数据集划分的不同而改变

所以我们需要使用一些更有说服力的指标去评价一个模型,比如这里的ROC曲线,PR曲线,混淆矩阵!

ROC曲线生成代码

转化为one-hot的代码

from sklearn.preprocessing import label_binarize
y_test = label_binarize(Ytest, classes=[ 1, 2, 3, 4]) #作为函数第一个接口
n_classes = y_test.shape[1]			# 几分类作为函数第三个接口

预测结果的获得代码

y_score = clf.predict_proba(Xtest) # Xtest为划分的测试数据 clf为训练出来的决策树模型
# 模型的搭建不是本文的重点,就不再纠缠了!

注意y_test要转化为one-hot编码

# y_test为one-hot编码的测试数据的真实结果
# y_score为预测结果的概率
# n_classes为one-hot编码的类别数
def get_roc(y_test,y_score,n_classes):
    from sklearn.metrics import roc_curve, auc # sklearn版本为0.20.2 
    import matplotlib.pyplot as plt
    colors = ['blue', 'red', 'green', 'black', 'yellow']
    # titles需要自己看情况更改,课程作业是汽车评估,所以是4个类别+一个平均值,titles长度为n_classes+1
    titles = ['unacc ','acc     ','good   ','v-good','average']
    fpr = dict() 
    tpr = dict() 
    roc_auc = dict() 
    for i in range(n_classes): 
        fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) 
        roc_auc[i] = auc(fpr[i], tpr[i]) 
#         print(roc_auc[i])
        plt.plot(fpr[i], tpr[i],color=colors[i],label=titles[i]+'AUC = %0.6f'% roc_auc[i])
        plt.title(titles[i])
        plt.xlabel('False Positive Rate') #横坐标是fpr
        plt.ylabel('True Positive Rate')  #纵坐标是tpr
        plt.title('ROC')
        plt.legend()
    plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
    plt.show()
    # Compute micro-average ROC curve and ROC area 
    fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel()) 
    roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) 
    plt.plot(fpr["micro"], tpr["micro"],color=colors[0],label=titles[4]+'AUC = %0.6f'% roc_auc["micro"])
    plt.legend(loc='lower right')
    plt.xlabel('False Positive Rate') #横坐标是fpr
    plt.ylabel('True Positive Rate')  #纵坐标是tpr
    plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
    plt.show()

有关汽车评估roc曲线没有梯度的原因

在这里插入图片描述
在这里插入图片描述
从图上可以看出,roc曲线没有roc曲线的梯度特征,而是达到一定高度后直接以斜线的姿势俯冲到了终点,很奇怪!!!

原因就在于求fpr和tpr之前,我们要计算每个类别的概率!如果决策树的叶子节点的纯度太高就会导致概率为[0,0,1,0]这种,出现三个0,一个1的情况。就会出现如图的现象,其实是一个比较好的现象吧!!!

我们不妨通过预剪枝来降低叶子节点的纯度,再来看看其roc图
我们设置如果叶子节点的个数小于15个就剪枝,之后的roc曲线变成了如下
在这里插入图片描述
在这里插入图片描述
这样的roc曲线就可以我们书本上的曲线是类似的,出现了梯度了!!!

PR曲线生成代码

三个参数的获得方法在上面有写过了,就不再重复了

# y_test为one-hot编码的预测结果 
# y_score为预测值的概率
# n_classes为ont-hot编码的类别数
def get_PR(y_test,y_score,n_classes):
	from sklearn.metrics import precision_recall_curve
    from sklearn.metrics import average_precision_score # sklearn版本为0.20.2 
    import matplotlib.pyplot as plt
    precision = dict()
    recall = dict()
    average_precision = dict()
    for i in range(n_classes):
        precision[i], recall[i], _ = precision_recall_curve(y_test[:, i],  y_score[:, i])
        average_precision[i] = average_precision_score(y_test[:, i], y_score[:, i])

    precision["micro"], recall["micro"], _ = precision_recall_curve(y_test.ravel(),  y_score.ravel())
    average_precision["micro"] = average_precision_score(y_test, y_score, average="micro")

    # Plot Precision-Recall curve for each class
    plt.style.use('seaborn') #选择'seaborn'画布分格,使绘图美观一点
    plt.clf()#clf 函数用于清除当前图像窗口

    plt.plot(recall["micro"], precision["micro"],
             label='micro-average Precision-recall curve (area = {0:0.6f})'.format(average_precision["micro"]))

    for i in range(n_classes):
        plt.plot(recall[i], precision[i],
                 label='Precision-recall curve of class {0} (area = {1:0.6f})'.format(i, average_precision[i]))

    #xlim、ylim:分别设置X、Y轴的显示范围。
    # plt.xlim([0.0, 1.0])
    # plt.ylim([0.0, 1.05])

    #设置横纵坐标标题
    plt.xlabel('Recall', fontsize=16)
    plt.ylabel('Precision',fontsize=16)

    #设置P-R图的标题
    plt.title('Extension of Precision-Recall curve to multi-class',fontsize=16)
    plt.legend(loc="lower right")#legend 是用于设置图例的函数
    plt.show()

同样地,对比在不同叶子纯度的情况的PR图

纯度很高
在这里插入图片描述
预剪枝降低纯度后
在这里插入图片描述

混淆矩阵生成代码

获得测试机预测结果代码

y_predict=clf.predict(Xtest)   # clf为训练好的模型,Xtest的测试集数据
# y_test为测试集的结果
# y_predict为测试集的预测结果
def get_Confusion_Matrix(y_test,y_predict):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt  
    import seaborn as sns 
    confusion_matrix = confusion_matrix(y_test,y_predict)
    f, ax = plt.subplots(figsize=(10, 7))
    plt.xticks(rotation='90')
    sns.heatmap(confusion_matrix, square=True, linewidths=.5, annot=True)
    plt.show()

在这里插入图片描述

想看不同模型之间的Friedman检验吗?

收藏文章,留下评论,过几天就给你飞一样地感觉!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值