• 机器学习之性能度量


    性能度量是衡量模型泛化能力的评价标准,模型的好坏是相对的,模型的好坏不仅取决于算法和数据,还决定于任务的需求。

    回归任务中常用的性能度量是:均方误差(越小越好),解释方差分(越接近1越好)。

    分类任务中常用的性能度量:

    1)错误率:分类错误的样本数占样本总数的比例。

    2)精度:分类正确的样本数占样本总数的比例。

    3)查准率也叫准确率(Precision):在所有的预测为正例的结果中,真正例所占的比率

    查准率=真正例/(真正例+假正例)

    “检索出的信息中有多少比例是用户感兴趣的”,在推荐系统中为了尽少的打扰用户,更希望推荐的内容是用户感兴趣的,此时查准率更重要。

    对于多分类问题,计算宏观查准率(macro_precision)

    每一类别查准率的计算是,该类别预测对的数目/预测为该类别的所有数目

    def macro_precision(true_list,predict_list):
        set_label = set(true_list)
        num_set_of_label = len(set_label)
        # 记录预测为各个类别的总数目
        sum_count=Counter(predict_list)
        num_true_dict = defaultdict(int)
        for i,label in enumerate(true_list):
            if predict_list[i]==label:
                num_true_dict[label]+=1
        temp_macro_precision = 0.0
        for key in num_true_dict:
            temp_macro_precision += (num_true_dict[key]/sum_count[key])
        macro_precision = temp_macro_precision / num_set_of_label
        print("my_macro_precision",macro_precision)

    多分类微观查准率(micro_precision)

    所有类别预测对的数目/测试集的总数

    def micro_precision(true_list,predict_list):
        true_num=0
        for i,label in enumerate(true_list):
            if predict_list[i]==label:
                true_num+=1
        micro_precision=true_num/len(true_list)
        print("my_micro_precision",micro_precision)

    4)查全率也叫召回率(Recall):在所有的正例中有多少被成功预测出来了

    查全率=真正例/(真正例+假反例)

    “用户感兴趣的信息中有多少被检索出来了。”

    对于多分类问题,计算宏观查全率(macro_recall)

    每一类别查全率的计算是,该类别预测对的数目/该类别所有的数目

    各个类别查全率的加和/类别的个数

    def macro_recall(true_list,predict_list):
        set_label=set(true_list)
        #记录测试集种各个类别的总数目
        sum_count=Counter(true_list)
        num_set_of_label=len(set_label)
        #统计每一类别预测正确的数目
        num_true_dict=defaultdict(int)
        for i,label in enumerate(true_list):
            if predict_list[i]==label:
                num_true_dict[label]+=1
        temp_macro_recall=0.0
        for key in num_true_dict:
            temp_macro_recall+=(num_true_dict[key]/sum_count[key])
        macro_recall=temp_macro_recall/num_set_of_label
        print("my_macro_recall",macro_recall)

    多分类微观查全率(micro_recall)

    所有类别预测对的数目/测试集的总数

    def micro_recall(true_list,predict_list):
        true_num=0
        for i,label in enumerate(true_list):
            if predict_list[i]==label:
                true_num+=1
        micro_recall=true_num/len(true_list)
        print("my_micro_recall",micro_recall)

    微观查准率和查全率的值相等

    查准率与查全率是一对矛盾的度量。一般度量学习器的好坏用F1得分

    F1 = 2*(Precision*Recall)/(Precision+Recall)

    5)ROC曲线与AUC

    详细介绍参考:

    https://zhuanlan.zhihu.com/p/26293316

    http://alexkong.net/2013/06/introduction-to-auc-and-roc/

    AUC是ROC曲线下的面积

    ROC曲线的纵轴是真正例率,横轴是假正例率。

    真正例率(TPR):真实的正例中,被预测正确的比例

    计算公式:真正例/(真正例+假反例)

    假正例率(FPR):真实的反例中,被预测错误的比例

    计算公式:假正例/(真反例+假正例)

    首先明确:ROC曲线的横坐标和纵坐标其实是没有相关性的,所以不能把ROC曲线当做一个函数曲线来分析,应该把ROC曲线看成无数个点,这些点代表着一个分类器在不同阈值下的分类效果。

    ROC如何画?

    假设我们获得了每个测试样本属于正例的概率输出,把这些概率从大到小进行排序,我们从高到低,依次将Score值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。ROC曲线越接近于左上角说明分类器的性能越好(因为横轴是假正利率纵轴是真正利率,越接近于左上角说明纵轴值越大真实的正例中,被预测正确的比例越大;横轴越小,真实的反例中,被预测错误的比例越小,说明模型性能越好,具体衡量就是AUC的值越大)。

    AUC值的计算

    AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好

    为什么要使用ROC

    因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。ROC能够在训练数据不均衡时很好的度量分类器的性能。

    6)宏平均(macro-averaging)和微平均(micro-averaging)

    数据不均衡时相对而言应该关注宏平均

     

    sklearn.metric的classification_report中的宏平均是用(7)式计算的

     

  • 相关阅读:
    把Chrome浏览器变成文本编辑器
    pigcms 标签读不出
    全排列函数
    线性基(二
    线性基(一
    fabs() abs()
    字面量声明的函数,后边最好加一个分号,否则的话,在控制台执行有问题的
    mongo集群
    linux的查找命令
    mysql 解决Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’错误
  • 原文地址:https://www.cnblogs.com/dyl222/p/11144055.html
Copyright © 2020-2023  润新知