【sklearn教程】使用metrics模块评估二分类模型效果

【sklearn教程】使用metrics模块评估二分类模型效果 张显显 2023-09-05 18:20:58 394

在机器学习中,评估模型的性能非常重要,因为它可以帮助我们了解模型在不同场景下的表现如何。Scikit-learn中metrics模块是专门设计用来评估模型性能的一个模块。本文将介绍metrics模块中常用的用于评估二分类模型的函数及其使用方法。

混淆矩阵

混淆矩阵是一种常见的分类模型性能评估工具,它可以帮助我们了解模型对不同类别的分类情况。混淆矩阵通常是一个二维矩阵,其中行表示实际类别,列表示预测类别,每个单元格中记录的是实际类别与预测类别相同的样本数量。

在sklearn中,可以使用confusion_matrix函数来生成混淆矩阵。该函数的输入参数为实际标签和预测标签,输出结果为一个二维数组,其中行表示实际类别,列表示预测类别,每个单元格中记录的是实际类别与预测类别相同的样本数量。

下面是一个示例:

from sklearn.metrics import confusion_matrix

y_true = [0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 0]

confusion_matrix(y_true, y_pred)

输出结果为:

array([[3, 1],
       [1, 4]])

这个混淆矩阵表示真实类别为0的样本有3个被正确预测为0,真实类别为1的样本有4个被正确预测为1,还有1个实际为0的样本被错误预测为1,1个实际为1的样本被错误预测为0。

准确率(Accuracy)

准确率是分类模型中最常用的度量标准之一。它是指模型在预测时正确分类的样本数占总样本数的比例。准确率的计算公式如下:

易百纳社区

其中,TP表示真正例(True Positive),即模型正确预测为正例的样本数;TN表示真负例(True Negative),即模型正确预测为负例的样本数;FP表示假正例(False Positive),即模型错误地将负例预测为正例的样本数;FN表示假负例(False Negative),即模型错误地将正例预测为负例的样本数。

Scikit-learn的metrics模块中,可以使用accuracy_score函数来计算准确率。示例代码如下:

from sklearn.metrics import accuracy_score

y_true = [0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 0]
accuracy = accuracy_score(y_true, y_pred)
print("Accuracy: ", accuracy)

输出为:

Accuracy:  0.7777777777777778

精确率(Precision)和召回率(Recall)

精确率和召回率是二分类问题中常用的指标,它们分别衡量了模型在预测正例时的准确性和预测正例时的覆盖率。具体来说,精确率是指在预测为正例的样本中,真正例的比例。精确率的计算公式如下:

易百纳社区

Scikit-learn的metrics模块中,可以使用precision_score函数来计算精确率。使用方法如下:

from sklearn.metrics import precision_score

y_true = [0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 0]
precision = precision_score(y_true, y_pred)
print("Precision: ", precision)

输出结果为:

Precision:  0.8

召回率是指在所有真实的正例中,被预测为正例的样本数占比。召回率的计算公式如下:

易百纳社区

Scikit-learn的metrics模块中,可以使用recall_score函数来计算召回率。使用方法如下:

from sklearn.metrics import recall_score

y_true = [0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 0]
recall = recall_score(y_true, y_pred, average='macro')
print("Recall: ", recall)

输出为:

Recall:  0.775

在实际应用中,我们通常需要根据具体的场景来选择精确率和召回率的权重,比如在医学诊断中,我们可能更关注召回率,因为不想漏掉任何一个患者;而在垃圾邮件分类中,我们可能更关注精确率,因为不想让正常邮件被误判为垃圾邮件。

F1值

F1值是精确率和召回率的调和平均数,它综合了精确率和召回率的优缺点,是一个综合性的评估指标。F1值的计算公式如下:

易百纳社区

Scikit-learn的metrics模块中,可以使用f1_score函数来计算F1值。使用方法如下:

from sklearn.metrics import f1_score

y_true = [0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 0]
f1 = f1_score(y_true, y_pred, average='macro')
print("F1 Score: ", f1)

输出为:

F1 Score:  0.7750000000000001

ROC曲线和AUC值

ROC曲线是一种用于评估二分类模型性能的可视化工具。ROC曲线通过计算真正例率(True Positive Rate)和假正例率(False Positive Rate)来绘制,其中真正例率是指真实正例中被正确预测为正例的比例,假正例率是指真实负例中被错误预测为正例的比例。用公式来表达,假正例率定义为:

易百纳社区

真正例率定义为:

易百纳社区

AUC值是ROC曲线下的面积,它是一个综合性的评估指标,AUC值越接近1,说明模型的性能越好。

Scikit-learn的metrics模块中,可以使用roc_curve函数来计算ROC曲线,使用roc_auc_score函数来计算AUC值。示例代码如下:

from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt

y_true = [0, 1, 1, 0, 1, 0, 1, 0, 1, 1]
y_score = [0.1, 0.2, 0.7, 0.4, 0.6, 0.3, 0.8, 0.5, 0.9, 0.6]
fpr, tpr, thresholds = roc_curve(y_true, y_score)
auc = roc_auc_score(y_true, y_score)
print("AUC Score: ", auc)

plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

打印结果为:

AUC Score:  0.875

ROC曲线为:

易百纳社区

Scikit-learn的metrics模块使用案例

下面是一个使用Scikit-learn的metrics模块演示一个评估二分类模型性能的例子,我们的例子使用了威斯康星州乳腺癌数据集,这个数据集我们前面已经介绍过,主要使用一些细胞核特征来区分乳腺癌是良性还是恶性。我们的例子中选择了逻辑回归作为分类器:


from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix

# 加载数据
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
clf = LogisticRegression(random_state=42,solver='liblinear')
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
confusion = confusion_matrix(y_test, y_pred)

这上面的例子中,我们使用LogisticRegression模型训练了一个分类模型,并使用Scikit-learn的metrics模块中的函数来评估测试集上模型性能。我们计算了准确率、精确率、召回率、F1值和混淆矩阵等指标,现在我们打印看一下结果:

print("Accuracy: ", accuracy)
print("Precision: ", precision)
print("Recall: ", recall)
print("F1 Score: ", f1)
print("Confusion Matrix: ")
print(confusion)

结果为:

Accuracy:  0.956140350877193
Precision:  0.960472972972973
Recall:  0.9464461185718964
F1 Score:  0.9526381387619443
Confusion Matrix:
[[39  4]
 [ 1 70]]

结果还是非常不错的,我们再看一下roc曲线和auc值:

y_pred2 = clf.predict_proba(X_test)[:,1]
fpr, tpr, thresholds = roc_curve(y_test, y_pred2)
auc = roc_auc_score(y_test, y_pred2)
print("AUC Score: ", auc)

plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

auc为0.998,这是一个相当好的模型。

易百纳社区

文章转载自公众号:用Python学机器学习

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
张显显
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区