### 不同评估曲线的含义、区别及应用场景
#### F1 曲线 (F1_curve)
F1 曲线展示了模型在不同置信度下的 F1-score 变化情况。F1-score 是精确率(Precision)和召回率(Recall)的调和平均数,能够综合反映二者的平衡状态。该曲线有助于理解模型在整个训练过程中的表现稳定性及其最佳工作点的位置[^1]。
```python
import matplotlib.pyplot as plt
def plot_f1_curve(f1_scores, confidences):
"""
绘制F1分数随置信度变化的曲线
参数:
f1_scores -- list of float, 对应各个置信阈值下计算得到的F1得分列表
confidences -- list of float, 测试样本被预测为正类别的概率阈值序列
"""
plt.plot(confidences, f1_scores)
plt.title('F1 Curve')
plt.xlabel('Confidence Threshold')
plt.ylabel('F1 Score')
plt.show()
```
#### 精确率曲线 (P_curve 或 Precision Curve)
精确率曲线反映了随着决策边界移动时,真正阳性的比例如何改变。这条曲线上每一点代表了一个特定条件下的测试结果——即给定某个分类标准后所获得的真实阳性案例占所有被判为阳性的总数量的比例。此图主要用于分析当调整分类器敏感程度时对最终判断准确性的影响[^2]。
```python
def plot_precision_curve(precisions, thresholds):
"""
绘制精确率随阈值变化的曲线
参数:
precisions -- list of float, 对应各阈值处的精确率数值
thresholds -- list of float, 预测标签转换成实际标签所需的最小置信水平集合
"""
plt.plot(thresholds, precisions[:-1])
plt.title('Precision Curve')
plt.xlabel('Threshold')
plt.ylabel('Precision')
plt.show()
```
#### PR 曲线 (PR_Curve 或 Precision-Recall Curve)
PR 曲线下面积衡量的是一个二元分类算法在其整个操作范围内识别出尽可能多的相关实例的能力,而不考虑误报的数量。它特别适用于数据不平衡的情况,在这种情况下,传统的准确性和错误率可能无法提供足够的信息来描述系统的性能。通过查看这个图形,可以直观地看到系统在保持较高查全率的同时能否维持良好的查准率。
```python
from sklearn.metrics import precision_recall_curve
def plot_pr_curve(y_true, y_scores):
"""
使用真实标签与预测分数组合绘制精度-召回率曲线
参数:
y_true -- array-like, shape = [n_samples], 实际的目标变量取值向量
y_scores -- array-like, shape = [n_samples], 每个观测对应的连续型预测得分
"""
p, r, _ = precision_recall_curve(y_true, y_scores)
plt.step(r, p, color='b', alpha=0.2, where='post')
plt.fill_between(r, p, step='post', alpha=0.2, color='b')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('Precision-Recall curve')
plt.show()
```
#### 召回率曲线 (R_curve 或 Recall Curve)
召回率曲线显示了不同条件下找回全部相关项目的成功率。具体而言,就是指所有实际属于某一类的对象中有多少比例被成功检索出来。这对于那些希望最大化发现潜在重要事件的应用非常重要,比如医疗诊断或欺诈检测等领域。
```python
def plot_recall_curve(recalls, thresholds):
"""
绘制召回率随阈值变化的曲线
参数:
recalls -- list of float, 各种阈值设定下所能达到的最大召回率
thresholds -- list of float, 设定用于区分正负两类的不同界限值
"""
plt.plot(thresholds, recalls[:-1])
plt.title('Recall Curve')
plt.xlabel('Threshold')
plt.ylabel('Recall')
plt.show()
```