Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

7.1 分类任务评估指标

Scikit-learn分类任务评估指标全面教程:从基础指标到高级可视化

Scikit-learn 中文教程

本教程深入讲解Scikit-learn中分类任务的评估指标,包括基础指标如准确率和精确率,进阶指标如ROC曲线和AUC,以及多分类任务的微平均和宏平均F1-Score,提供代码示例和Matplotlib可视化指南,适合机器学习新手入门。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

分类任务评估指标教程:使用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_scorerecall_scoref1_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的可视化功能,可以帮助您全面分析和优化模型。多练习这些工具,将提升您的机器学习实践能力。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包