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

生成ROC,PR,混淆矩阵

  • 写在前面
    • ROC曲线生成代码
      • 有关汽车评估roc曲线没有梯度的原因
    • PR曲线生成代码
      • 同样地,对比在不同叶子纯度的情况的PR图
    • 混淆矩阵生成代码
  • 想看不同模型之间的Friedman检验吗?

写在前面

汽车评估
机器学习 第十四组 “人见人爱,花见花开!”
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,PR,混淆矩阵(给你打包成函数了0.T)_第1张图片
[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)_第2张图片
从图上可以看出,roc曲线没有roc曲线的梯度特征,而是达到一定高度后直接以斜线的姿势俯冲到了终点,很奇怪!!!

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

我们不妨通过预剪枝来降低叶子节点的纯度,再来看看其roc图
我们设置如果叶子节点的个数小于15个就剪枝,之后的roc曲线变成了如下
[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)_第3张图片
[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)_第4张图片
这样的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图

纯度很高
[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)_第5张图片
预剪枝降低纯度后
[机器学习的模型评估很难吗!?]生成ROC,PR,混淆矩阵(给你打包成函数了0.T)_第6张图片

混淆矩阵生成代码

获得测试机预测结果代码

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()

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

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

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

你可能感兴趣的:(机器学习,机器学习,roc,pr,混淆矩阵,模型评估)