准确率、精确率、召回率、P-R曲线

算法预测结果的四种情况

正确肯定(真正例,True Positive,TP):预测为真,实际为真;
正确否定(真反例,True Negative,TN):预测为假,实际为假;
错误肯定(假正例,False Positive,FP):预测为真,实际为假 ;
错误否定(假反例,False Negative,FN):预测为假,实际为真。

样例总数为:TP+FP+TN+FN。

准确率(Accuracy)/精确率(Precision)/召回率(Recall)/F1 score与Fβ

准确率:
所有的预测正确(正类负类)的占总样本比重。
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN
准确率指标存在明显的缺陷。当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。
精确率:
即正确预测为真的占全部预测为真的比例,即"找得对"。
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
召回率:
正确预测为真的占全部实际为真的比例,即"找得全"。
R e c a l l = T P T P + F N Recall=\frac{T P}{T P+F N} Recall=TP+FNTP
F1-Score:
精准率和召回率的调和平均值。
F l = 2 × precision × recall precision + recall = 2 T P 2 T P + F P + F N \mathrm{Fl}=\frac{2\times \text {precision} \times \text {recall}}{\text {precision}+\text {recall}}=\frac{2 T P}{2 T P+F P+F N} Fl=precision+recall2×precision×recall=2TP+FP+FN2TP
更一般地,我们可以定义Fβ(precision和recall权重可调的F1 score):
F β = ( 1 + β 2 ) ⋅  precision  ⋅ recall ( β 2 ⋅  precision  ) + recall F_{\beta}=\left(1+\beta^{2}\right) \cdot \frac{\text { precision } \cdot \text {recall}}{\left(\beta^{2} \cdot \text { precision }\right)+\text {recall}} Fβ=(1+β2)(β2 precision )+recall precision recall
常用的如F2和F0.5。

TPR、FPR

TPR:
表示当前分到正样本中真实的正样本所占所有正样本的比例。
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
FPR:
表示当前被错误分到正样本类别中真实的负样本所占所有负样本总数的比例.
F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP

ROC曲线与AUC值

ROC曲线:
对于ROC来说,横坐标就是FPR,而纵坐标就是TPR,因此可以想见,当 TPR越大,而FPR越小时,说明分类结果是较好的。
ROC曲线有个很好的特性,当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。ROC曲线可以反映二分类器的总体分类性能,但是无法直接从图中识别出分类最好的阈值,事实上最好的阈值也是视具体的场景所定。ROC曲线对应的AUC越大,对正样本分类性能越好;ROC曲线一定在y=x之上,否则就是一个不好的分类器。
AUC:
AUC 即ROC曲线下的面积,介于0和1之间。计算方式即为ROC曲线的微积分值,其物理意义可以表示为:随机给定一正一负两个样本,将正样本排在负样本之前的概率,因此AUC越大,说明正样本越有可能被排在负样本之前,即正样本分类结果越好。

P-R曲线、精确率与召回率的关系

P-R曲线就是以召回率(recall)为横坐标,精确率(precision)为纵坐标的曲线图。
若一个学习器P-R曲线被另一个学习器的P-R曲线完全"包住",则可断言后者的性能优于前者。如果两个学习器的P-R曲线发生了交叉,如图中的A与B,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较。然而,在很多情形下,人们往往仍希望把学习器A与B比出个高低。这时一个比较合理的判据是比较P-R曲线截面积的大小(面积大者性能更优),但更常用的是平衡点或者是F1值。平衡点(BEP)是查准率=查全率时的取值,如果这个值较大,则说明学习器的性能较好。或者使用F1值为度量,F1值越大,我们可以认为该学习器的性能较好。
P-R曲线有一个缺点就是会受到正负样本比例的影响。比如当负样本增加10倍后,在racall不变的情况下,必然召回了更多的负样本,所以精确度就会大幅下降,所以PR曲线对正负样本分布比较敏感。
对于不同正负样本比例的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。
举例:
Hulu提供视频的模糊搜索功能,搜索排序模型返回的Top5的精确率非常高,但在实际使用过程中,用户还是经常找不到想要的视频,特别是一些比较冷门的剧集,这可能是哪个环节出了问题呢?
在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N个返回结果的Precision值和Recall值来衡量排序模型的性能,即认为模型返回的Top N的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision TOP N和前N个位置上的召回率Recall TOP N。
为了提高Precision值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多“没有把握”的正样本,导致Recall值降低。
在上面这个例子中,模型返回的Precision TOP5的结果非常好,也就是说排序模型Top5的返回值的质量是很高的。也就是说前5个结果精确率很高。
但是在实际应用过程中,用户为了找一些冷门的视频,往往会寻找排在较靠后位置的结果,甚至翻页去查找目标视频。但根据题目描述,用户经常找不到想要的视频,这说明模型没有把相关的视频都找出来呈现给用户。显然,问题出在召回率上。如果相关结果有100个,即使Precision TOP5达到了100%,Recall也仅仅是5%。
这个时候我们就要用Precision-Recall曲线图。对于上面举例的排序模型来说,其P-R曲线上的一个点代表着在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。我们必须根据我们排序系统的主要任务(保证用户前5个结果为真?或保证用户找冷门视频的精确率?)从Precision-Recall曲线图找出一个平衡精确率和准确率的点,使得两者都能有较好的性能。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对您的问题,以下是一份逻辑回归预测模型的代码示例: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve import matplotlib.pyplot as plt # 1. 数据读取与处理 data = pd.read_csv('data.csv') X = data.drop('target', axis=1) y = data['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 2. 模型训练 model = LogisticRegression() model.fit(X_train, y_train) # 3. 模型预测 y_pred = model.predict(X_test) y_prob = model.predict_proba(X_test)[:, 1] # 4. 模型评价 accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) auc = roc_auc_score(y_test, y_prob) # 5. ROC曲线绘制 fpr, tpr, thresholds = roc_curve(y_test, y_prob) plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc) plt.plot([0, 1], [0, 1], 'k--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend(loc="lower right") plt.show() # 6. 输出结果 print('Accuracy:', accuracy) print('Precision:', precision) print('Recall:', recall) print('F1-score:', f1) print('AUC:', auc) ``` 这份代码使用了Pandas库读取了名为"data.csv"的数据集,并将其分成训练集和测试集,使用Scikit-learn库中的LogisticRegression类进行模型训练和预测,最后通过Scikit-learn库中的指标函数计算了预测结果的准确率精确率召回率、F1-score和AUC指标,同时绘制了ROC曲线。 需要注意的是,上述代码仅作为示例,具体实现需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值