Machine Learning 简明教程

Machine Learning - Precision and Recall

精确度和召回率是两个重要的指标,用于评估机器学习中分类模型的性能。它们对不平衡数据集特别有用,其中某一类的实例明显少于另一类。

精确度衡量分类器做出的正面预测有多少是正确的。它定义为真阳性 (TP) 与总正面预测数 (TP + FP) 的比率。换句话说,精确度衡量了所有正面预测中真阳性的比例。

精确度 = TP/ (TP + FP)

另一方面,召回率衡量的是分类器正确识别多少实际阳性实例。它定义为真阳性 (TP) 与总实际阳性实例数 (TP + FN) 的比率。换句话说,召回率衡量了所有实际阳性实例中真阳性的比例。

召回率 = TP/ (TP + FN)

要了解精确度和召回率,请考虑检测垃圾邮件的问题。分类器可以将电子邮件标记为垃圾邮件 (正面预测) 或非垃圾邮件 (负面预测)。电子邮件的实际标签可以是垃圾邮件或非垃圾邮件。如果电子邮件实际上是垃圾邮件,并且分类器正确地将其标记为垃圾邮件,那么它就是真阳性。如果电子邮件不是垃圾邮件,但分类器错误地将其标记为垃圾邮件,那么它就是假阳性。如果电子邮件实际上是垃圾邮件,但分类器错误地将其标记为非垃圾邮件,那么它就是假阴性。最后,如果电子邮件不是垃圾邮件,并且分类器正确地将其标记为非垃圾邮件,那么它就是真阴性。

在这种情况下,精确度衡量了分类器正确识别为垃圾邮件的垃圾邮件比例。高精确度表明分类器正确识别了大部分垃圾邮件,并且没有将许多合法电子邮件标记为垃圾邮件。另一方面,召回率衡量了分类器正确识别出的所有垃圾邮件的比例。高召回率表明分类器正确识别了大部分垃圾邮件,即使它将一些合法电子邮件标记为垃圾邮件。

Implementation in Python

在 scikit-learn 中,可以使用 precision_score() 和 recall_score() 函数分别计算精确度和召回率。这些函数以一组实例的真实标签和预测标签作为输入,并返回相应的精确度和召回率得分。

例如,考虑以下代码段,它使用 scikit-learn 中的乳腺癌数据集来训练逻辑回归分类器并评估其精确度和召回率得分 −

Example

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

# Load the breast cancer dataset
data = load_breast_cancer()

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# Train a logistic regression classifier
clf = LogisticRegression(random_state=42)
clf.fit(X_train, y_train)

# Make predictions on the testing set
y_pred = clf.predict(X_test)

# Calculate precision and recall scores
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
print("Precision:", precision)
print("Recall:", recall)

在上面的示例中,我们首先加载乳腺癌数据集并将其分成训练集和测试集。然后,我们在训练集上训练逻辑回归分类器,并使用 predict() 方法对测试集进行预测。最后,我们使用 precision_score() 和 recall_score() 函数计算精确度和召回率得分。

执行此代码时,将生成以下输出 −

Precision: 0.9459459459459459
Recall: 0.9859154929577465