7.1 分类任务评估指标
Scikit-learn分类任务评估指标全面教程:从基础指标到高级可视化
本教程深入讲解Scikit-learn中分类任务的评估指标,包括基础指标如准确率和精确率,进阶指标如ROC曲线和AUC,以及多分类任务的微平均和宏平均F1-Score,提供代码示例和Matplotlib可视化指南,适合机器学习新手入门。
分类任务评估指标教程:使用Scikit-learn与Matplotlib
引言
分类任务是机器学习中的核心应用,无论是二分类还是多分类问题,评估模型性能都至关重要。通过选择合适的评估指标,您可以更好地理解模型的优缺点,从而优化和改进模型。本教程将引导您从基础指标到进阶技巧,使用Scikit-learn计算和可视化这些指标。
基础评估指标
基础指标是评估分类模型性能的入门工具,适用于二分类和简单多分类任务。
1. 准确率 (Accuracy)
准确率是最直观的指标,表示正确预测的样本占总样本的比例。在二分类中,公式为:
$$\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}$$
其中,TP是真阳性,TN是真阴性,FP是假阳性,FN是假阴性。在Scikit-learn中,使用accuracy_score函数计算:
from sklearn.metrics import accuracy_score
y_true = [0, 1, 0, 1]
y_pred = [0, 1, 1, 1]
accuracy = accuracy_score(y_true, y_pred)
print(f'准确率: {accuracy:.2f}')
然而,准确率在不平衡数据中可能误导,例如,如果99%的样本为负类,一个总是预测负类的模型也会有99%的准确率。
2. 精确率 (Precision)
精确率关注模型预测为正类的样本中,真正为正类的比例,适合在意假阳性(FP)的场景。公式为:
$$\text{Precision} = \frac{TP}{TP + FP}$$
在Scikit-learn中,使用precision_score计算。
3. 召回率 (Recall)
召回率关注所有正类样本中,被正确预测为正类的比例,适合在意假阴性(FN)的场景。公式为:
$$\text{Recall} = \frac{TP}{TP + FN}$$
使用recall_score计算。
4. F1-Score
F1-Score是精确率和召回率的调和平均,旨在平衡两者,适合不平衡数据。公式为:
$$\text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
使用f1_score计算。
5. 混淆矩阵 (Confusion Matrix)
混淆矩阵是一个表格,展示模型预测结果与实际类别的对比,帮助理解错误类型(FP、FN等)。使用confusion_matrix计算,并可用Matplotlib可视化:
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt='d')
plt.title('混淆矩阵')
plt.show()
进阶评估指标:ROC曲线与PR曲线
这些指标在数据不平衡时尤其有用。
1. ROC曲线 (Receiver Operating Characteristic Curve)
ROC曲线以假阳性率(FPR)为横轴,真阳性率(TPR,即召回率)为纵轴,展示不同阈值下的模型性能。使用roc_curve计算,并用Matplotlib绘图:
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba)
plt.plot(fpr, tpr, label='ROC曲线')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('ROC曲线')
plt.legend()
plt.show()
2. AUC值 (Area Under Curve)
AUC是ROC曲线下的面积,范围从0到1,数值越高表示模型性能越好。1表示完美分类,0.5表示随机猜测。使用roc_auc_score计算:
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_pred_proba)
print(f'AUC值: {auc:.2f}')
3. PR曲线 (Precision-Recall Curve)
PR曲线以召回率为横轴,精确率为纵轴,更适合不平衡数据(正类样本少)。使用precision_recall_curve计算和绘图。
多分类任务评估指标
在多于两个类别的分类任务中,需要扩展基础指标。Scikit-learn支持微平均、宏平均和加权平均。
1. 微平均 (Micro-average)
微平均将所有类别的TP、FP、FN、TN合并后计算指标,适合类别分布不平衡。在precision_score、recall_score、f1_score中设置average='micro'。
2. 宏平均 (Macro-average)
宏平均独立计算每个类别的指标,然后取平均,平等对待每个类别。设置average='macro'。
3. 加权平均 (Weighted-average)
加权平均根据每个类别的样本数量加权计算指标,处理不平衡数据。设置average='weighted'。
指标计算与可视化实战
结合Scikit-learn和Matplotlib,我们可以计算和可视化所有指标。假设我们有一个简单的二分类数据集:
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 生成不平衡数据集
X, y = make_classification(n_samples=1000, weights=[0.9, 0.1], random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
# 计算基础指标
from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix, classification_report
print('精确率:', precision_score(y_test, y_pred))
print('召回率:', recall_score(y_test, y_pred))
print('F1-Score:', f1_score(y_test, y_pred))
print('混淆矩阵:\n', confusion_matrix(y_test, y_pred))
print('分类报告:\n', classification_report(y_test, y_pred))
# 可视化混淆矩阵
plt.figure(figsize=(8,6))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d')
plt.title('混淆矩阵')
plt.show()
# 计算和绘制ROC曲线和AUC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.plot(fpr, tpr, label='ROC曲线 (AUC = {:.2f})'.format(roc_auc_score(y_test, y_pred_proba)))
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('ROC曲线')
plt.legend()
plt.show()
对于多分类,可以使用类似方法,但指定average参数。
总结
评估分类任务时,应根据数据特性(如是否平衡)和业务需求选择指标。Scikit-learn提供了丰富的sklearn.metrics模块,结合Matplotlib的可视化功能,可以帮助您全面分析和优化模型。多练习这些工具,将提升您的机器学习实践能力。