机器学习 - 精确率和召回率
精确率(Precision)和召回率(Recall)是机器学习中用于评估分类模型性能的两个重要指标。它们特别适用于不平衡数据集,其中一个类别的实例数量远少于另一个类别。
精确率衡量分类器做出的正类预测中有多少是正确的。它定义为真正例(TP)与所有正类预测总数(TP + FP)的比率。换句话说,精确率表示所有正类预测中真正例的比例。
$$Precision=TP/\left ( TP+FP \right )$$
另一方面,召回率衡量分类器正确识别了多少实际正类实例。它定义为真正例(TP)与所有实际正类实例总数(TP + FN)的比率。换句话说,召回率表示所有实际正类实例中真正例的比例。
$$Recall=TP/\left ( TP+FN \right )$$
为了理解精确率和召回率,请考虑检测垃圾邮件的问题。分类器可以将邮件标记为垃圾邮件(正类预测)或非垃圾邮件(负类预测)。邮件的实际标签可以是垃圾邮件或非垃圾邮件。如果邮件实际是垃圾邮件且分类器正确标记为垃圾邮件,则为真正例。如果邮件不是垃圾邮件但分类器错误标记为垃圾邮件,则为假正例。如果邮件实际是垃圾邮件但分类器错误标记为非垃圾邮件,则为假负例。最后,如果邮件不是垃圾邮件且分类器正确标记为非垃圾邮件,则为真负例。
在这种场景中,精确率衡量分类器正确识别为垃圾邮件的垃圾邮件比例。高精确率表示分类器正确识别了大部分垃圾邮件,且不会将许多合法邮件标记为垃圾邮件。另一方面,召回率衡量分类器正确识别的所有垃圾邮件比例。高召回率表示分类器正确识别了大部分垃圾邮件,即使它将一些合法邮件标记为垃圾邮件。
Python 中的实现
在 scikit-learn 中,可以分别使用 precision_score() 和 recall_score() 函数来计算 precision 和 recall。这些函数以一组实例的真实标签和预测标签作为输入,并返回相应的 precision 和 recall 分数。
例如,考虑以下代码片段,它使用 scikit-learn 中的乳腺癌数据集来训练一个 logistic regression 分类器,并评估其 precision 和 recall 分数 −
示例 - Precision 和 Recall
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score
# 加载乳腺癌数据集
data = load_breast_cancer()
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
# 训练 logistic regression 分类器
clf = LogisticRegression(random_state=42)
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 计算 precision 和 recall 分数
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
print("Precision:", precision)
print("Recall:", recall)
在上述示例中,我们首先加载乳腺癌数据集并将其分割为训练集和测试集。然后,我们在训练集上训练一个 logistic regression 分类器,并使用 predict() 方法在测试集上进行预测。最后,我们使用 precision_score() 和 recall_score() 函数计算 precision 和 recall 分数。
输出
执行此代码时,将产生以下输出 −
Precision: 0.9459459459459459 Recall: 0.9859154929577465