快速求解 best F1-score 以及对应的阈值

Posted smile-yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速求解 best F1-score 以及对应的阈值相关的知识,希望对你有一定的参考价值。

问题描述

在二分类问题中,评测某种算法有很多指标,很多论文是通过比较 F1-score 来证明自己的算法是可行的。best F1-score 是指在不确定阈值的情况下,如何找到最合适的阈值,使得 F1-score 值最大。

F1-score 计算方法

TP/FP/TN/FN

全称真实值(标签,label)预测值(predict)
TPTrue Positive11
FPFalse Positive01
TNTrue Negative00
FNFalse Negative10

Positive 与 Negative 是指预测,True 与 False 是指预测与结果是否一致。

精准度(precision)

p r e c i s i o n = T P T P + F P precision = \\frac{TP}{TP+FP} precision=TP+FPTP

召回率(recall)

r e c a l l = T P T P + F N recall = \\frac{TP}{TP+FN} recall=TP+FNTP

F1-score

F 1 − s c o r e = 2 ∗ r e c a l l ∗ p r e c i s i o n r e c a l l + p r e c i s i o n F1-score = \\frac{2*recall*precision}{recall+precision} F1score=recall+precision2recallprecision

当然,如果感兴趣的话可以代入求解

F 1 − s c o r e = 2 ∗ T P T P + F P ∗ T P T P + F N T P T P + F P + T P T P + F N = 2 ∗ T P 2 ∗ T P + F P + F N F1-score = \\frac{2*\\frac{TP}{TP+FP}*\\frac{TP}{TP+FN}}{\\frac{TP}{TP+FP}+\\frac{TP}{TP+FN}} \\\\ =\\frac{2*TP}{2*TP+FP+FN} F1score=TP+FPTP+TP+FNTP2TP+FPTPTP+FNTP=2TP+FP+FN2TP

根据阈值打标

很多算法进行二分类时,返回的是二分类的概率值,然后根据阈值来确定具体分类。

一般情况下,都是通过比较大小关系而进行标记。换句话说,对于概率值序列 S = { a 0 , a 1 , . . . , a n − 1 } S=\\{a_0,a_1,...,a_{n-1}\\} S={a0,a1,...,an1},需要找到最好的阈值 α \\alpha α ,如果 a i ≥ α a_i \\ge \\alpha aiα 则, p r e d i = 1 pred_i = 1 predi=1。一般而言, α ∈ S \\alpha \\in S αS

找到最合适的阈值

直接使用 sklearn 提供的方法比较简单,但这里先简单介绍一下基本原理。

计算方法也非常简单粗暴,直接把可能阈值全部计算一遍,得到一个 F1-score 数组,然后找到最大值以及对一个的阈值即可。

from sklearn.metrics import precision_recall_curve
import numpy as np

predict = [0.1, 0.2, 0.3, 0.4, 0.5, 
           0.5, 0.6, 0.6, 0.7, 0.7,
           0.8, 0.8, 0.8, 0.8, 0.8,
           0.8, 0.9, 0.9, 0.9, 0.9]

label =   [0, 0, 0, 0, 0, 
           1, 1, 0, 1, 1,
           1, 1, 1, 1, 1,
           1, 1, 1, 1, 1]

precisions, recalls, thresholds = precision_recall_curve(label,predict)

# 拿到最优结果以及索引
f1_scores = (2 * precisions * recalls) / (precisions + recalls)
best_f1_score = np.max(f1_scores[np.isfinite(f1_scores)])
best_f1_score_index = np.argmax(f1_scores[np.isfinite(f1_scores)])

# 阈值
best_f1_score, thresholds[best_f1_score_index]

输出的内容为:

(0.9333333333333333, 0.5)

Smileyan
2021.7.9 18:28

以上是关于快速求解 best F1-score 以及对应的阈值的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3613 Best Reward(拓展KMP算法求解)

[PTA] PAT(A) 1012 The Best Rank (25 分)

HDU 5883 The Best Path

在MATLAB中用蚁群算法求解TSP问题,在经典的代码中有Tabu(1,:)=R_best(NC-1,:)。不明白代码的目的。

常用的评价指标:accuracy、precision、recall、f1-score、ROC-AUC、PR-AUC

PAT 甲级测试题目 -- 1012 The Best Rank