机器学习笔记之模型评估方法

目录

1. 前言

2. 机器学习模型评估指标

2.1混淆矩阵:

2.2混淆矩阵评价指标:

3. ROC 曲线和 PR 曲线

3.1ROC曲线(Receiver Operating Characteristic Curve)

3.2AUC(曲线下面积)

3.3PR曲线(Precision-Recall Curve)

4.KNN算法糖尿病预测之不同K值下的模型评估实验

4.1环境准备

4.2实验步骤

4.3运行效果

4.4实验注意事项

4.5实验小结

5.总结

6.参考文献


1. 前言

机器学习模型评估是实际应用中至关重要的一环,它有助于我们确定模型的性能以及它在未见过的数据上的泛化能力。评估模型的质量和性能不仅有助于选择最佳模型,还有助于优化参数和特征选择,从而实现更好的预测结果。因此,了解如何评估机器学习模型是每个机器学习从业者的重要任务。在本文中,我们将探讨如何评估机器学习模型,以及如何使用K-最近邻(KNN)算法进行糖尿病预测时不同K值下的模型评估

2. 机器学习模型评估指标

 2.1混淆矩阵:

混淆矩阵(Confusion Matrix)是用于评估分类模型性能的重要工具,通常用于二分类问题。混淆矩阵以四种不同类型的分类结果为基础:

 2.1.1真正例(True Positive,TP):模型正确地预测为正类别的样本的数量。也就是实际为正类别的样本被正确地预测为正类别。

 2.1.2假正例(False Positive,FP):模型错误地预测为正类别的样本的数量。也就是实际为负类别的样本被错误地预测为正类别。

 2.1.3真负例(True Negative,TN):模型正确地预测为负类别的样本的数量。也就是实际为负类别的样本被正确地预测为负类别。

 2.1.4假负例(False Negative,FN):模型错误地预测为负类别的样本的数量。也就是实际为正类别的样本被错误地预测为负类别。

举个栗子就通俗易懂啦,如下:

2.1.5混淆矩阵计算代码演示:

from sklearn.metrics import confusion_matrix

# 实际标签
y_true = [1, 0, 1, 1, 0, 1, 0, 0]

# 模型的预测标签
y_pred = [1, 0, 1, 1, 1, 0, 1, 0]

# 计算混淆矩阵
confusion = confusion_matrix(y_true, y_pred)

# 提取混淆矩阵中的四个值
TN, FP, FN, TP = confusion.ravel()

# 输出结果
print("True Negatives (TN):", TN)
print("False Positives (FP):", FP)
print("False Negatives (FN):", FN)
print("True Positives (TP):", TP)

2.2混淆矩阵评价指标:

准确率、精确率、召回率和F1分数是用于评估分类模型性能的关键指标。它们通常用于二分类问题,基于混淆矩阵中的真正例、假正例、真负例和假负例来计算。

 2.2.1准确率(Accuracy):准确率是模型正确分类的样本数与总样本数之比。它衡量了模型正确预测的能力,但不考虑正负类别之间的平衡。

准确率 = (TP + TN) / (TP + TN + FP + FN)

 2.2.2精确率(Precision):精确率是指模型在所有预测为正类别的样本中,有多少是真正的正类别。它衡量了模型避免假正例的能力。

精确率 = TP / (TP + FP)

 2.2.3召回率(Recall):召回率是指模型在所有实际正类别的样本中,有多少被成功预测为正类别。它衡量了模型成功捕捉正类别的能力。

召回率 = TP / (TP + FN)

 2.2.4F1分数(F1 Score):F1分数是精确率和召回率的调和平均,它综合考虑了模型的精确度和召回率。它是一个综合性的性能指标。

F1分数 = 2 * (精确率 * 召回率) / (精确率 + 召回率)

 2.2.5代码演示:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 第一种模型的预测结果
y_true = [1, 0, 1, 1, 0, 1, 0, 0]
y_pred_model1 = [1, 1, 0, 1, 1, 0, 1, 0]

# 第二种模型的预测结果
y_pred_model2 = [1, 1, 1, 1, 0, 1, 0, 1]

# 计算准确率
accuracy_model1 = accuracy_score(y_true, y_pred_model1)
accuracy_model2 = accuracy_score(y_true, y_pred_model2)
print("模型1的准确率:", accuracy_model1)
print("模型2的准确率:", accuracy_model2)

# 计算精确率
precision_model1 = precision_score(y_true, y_pred_model1)
precision_model2 = precision_score(y_true, y_pred_model2)
print("模型1的精确率:", precision_model1)
print("模型2的精确率:", precision_model2)

# 计算召回率
recall_model1 = recall_score(y_true, y_pred_model1)
recall_model2 = recall_score(y_true, y_pred_model2)
print("模型1的召回率:", recall_model1)
print("模型2的召回率:", recall_model2)

# 计算F1分数
f1_model1 = f1_score(y_true, y_pred_model1)
f1_model2 = f1_score(y_true, y_pred_model2)
print("模型1的F1分数:", f1_model1)
print("模型2的F1分数:", f1_model2)

运行结果:这个示例中,我们比较了两种不同模型的性能。模型1和模型2的预测结果不同,因此它们的准确率、精确率、召回率和F1分数也不同。这个示例演示了不同的模型可以产生不同的性能指标值,这些指标对于评估模型的性能非常重要。

3. ROC 曲线和 PR 曲线

当评估二分类模型的性能时,通常会使用ROC曲线、AUC(曲线下面积)和PR曲线这些工具。

3.1ROC曲线(Receiver Operating Characteristic Curve)

 3.1.1概念:ROC曲线是一种用于评估二分类模型性能的图形工具。它以不同的分类阈值为横坐标,真正例率(True Positive Rate,也称为召回率)为纵坐标,绘制了模型在不同阈值下的性能。ROC曲线展示了在不同阈值设置下,模型在正类别和负类别之间的权衡。

3.1.2绘制过程:要绘制ROC曲线,需要首先计算不同阈值下的真正例率(TPR)和假正例率(FPR):

TPR(True Positive Rate):模型正确预测为正类别的样本数占所有正类别样本的比例,计算公式为 TPR = TP / (TP + FN)。

FPR(False Positive Rate):模型错误预测为正类别的样本数占所有负类别样本的比例,计算公式为 FPR = FP / (FP + TN)。

最后,将不同阈值下的TPR和FPR连接起来,就形成了ROC曲线。ROC曲线越靠近左上角,模型性能越好

3.2AUC(曲线下面积)

 3.2.1概念:AUC是ROC曲线下的面积,用于度量模型在不同阈值下的性能。AUC的取值范围在0到1之间,越接近1表示模型性能越好。

 3.2.2评估模型:AUC用于比较不同模型的性能,或者比较同一模型在不同阈值下的性能。一个AUC值接近1的模型具有更好的区分能力,可以更好地将正类别和负类别分开。

 3.3PR曲线(Precision-Recall Curve)

3.3.1概念:PR曲线是另一种用于评估二分类模型性能的图形工具。它以不同的分类阈值为横坐标,精确率为纵坐标,绘制了模型在不同阈值下的性能。PR曲线强调了在正类别的样本中正确预测的比例(精确率)和成功捕捉正类别的比例(召回率)之间的权衡。

3.3.2绘制过程:要绘制PR曲线,需要首先计算不同阈值下的精确率(Precision)和召回率(Recall):

精确率(Precision):模型正确预测为正类别的样本数占所有预测为正类别的样本数的比例,计算公式为 Precision = TP / (TP + FP)。

召回率(Recall):模型正确预测为正类别的样本数占所有实际正类别的样本数的比例,计算公式为 Recall = TP / (TP + FN)。

然后,将不同阈值下的精确率和召回率连接起来,就形成了PR曲线。PR曲线越靠近右上角,模型性能越好。

ROC曲线和PR曲线是重要的工具,用于评估模型的性能,并根据任务需求选择合适的阈值。 AUC和F1分数是用于定量衡量模型性能的指标,它们可用于比较不同模型或同一模型在不同阈值下的性能。

4.KNN算法糖尿病预测之不同K值下的模型评估实验

4.1环境准备

pytorch 1.10.0+cpu

python3.7.5

win10+vscode

安装matplotlib、numpy、pandas、seaborn、sklearn,tensorflow等库,提示缺哪个库就装哪个库,只需输入pip install xxx(库名)即可(换源:pip +库名+ -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)
 

4.2实验步骤

 4.2.1加载糖尿病数据集:使用Scikit-Learn的datasets.load_diabetes()函数加载糖尿病数据集,其中包括特征矩阵(X)和目标向量(y)。

 4.2.2将目标变量转换为二分类问题:将糖尿病数据集中的目标变量(糖尿病患者的定量测量)转换为二分类问题。通过设置一个阈值(这里是140),将样本分为两类:糖尿病患者(1)和非糖尿病患者(0)。

 4.2.3划分数据集:使用train_test_split函数将数据集分成训练集(用于训练模型)和测试集(用于评估模型性能),本次实验划分中,测试集占总数据的30%。

 4.2.4对不同K值下的ROC和PR曲线:循环不同的K值(3、5、7)来创建KNN分类器。对于每个K值,进行以下操作:

 4.2.4.1初始化KNN分类器。
 4.2.4.2使用训练集训练模型。
 4.2.4.3针对测试集预测概率。
 4.2.4.4计算ROC曲线:计算真正例率(TPR)和假正例率(FPR),然后计算AUC(曲线下面积)。
 4.2.4.5计算PR曲线:计算精确率和召回率,并计算平均精确率。
 4.2.4.6绘制ROC曲线和PR曲线。
 4.2.4.7绘制ROC和PR曲线:使用Matplotlib库绘制不同K值下的ROC曲线和PR曲线。ROC曲线展示了不同K值下的模型性能,PR曲线则强调了精确率和召回率之间的权衡。

 4.2.4.8显示图形:最后,使用plt.show()来显示绘制的图形,可以直观地了解KNN模型在不同K值下的性能。

4.3实验源码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score

# 加载糖尿病数据集(使用Scikit-Learn自带的糖尿病数据集)
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

# 将目标变量y转换为二分类问题(例如,通过设置一个阈值来将糖尿病患者和非糖尿病患者分开)
threshold = 140  # 用于二分类的阈值
y_binary = (y >= threshold).astype(int)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.3, random_state=42)

# 不同K值下的ROC曲线和PR曲线
k_values = [3, 5, 7]  # 可以根据需要选择不同的K值
colors = ['b', 'g', 'r']
plt.figure(figsize=(12, 6))

for k, color in zip(k_values, colors):
    # 初始化KNN分类器
    knn = KNeighborsClassifier(n_neighbors=k)
    
    # 训练模型
    knn.fit(X_train, y_train)
    
    # 预测概率
    y_score = knn.predict_proba(X_test)[:, 1]
    
    # 计算ROC曲线
    fpr, tpr, _ = roc_curve(y_test, y_score)
    roc_auc = auc(fpr, tpr)
    
    # 计算PR曲线
    precision, recall, _ = precision_recall_curve(y_test, y_score)
    average_precision = average_precision_score(y_test, y_score)
    
    # 绘制ROC曲线
    plt.subplot(1, 2, 1)
    plt.plot(fpr, tpr, color=color, lw=2, label=f'K = {k}, AUC = {roc_auc:.2f}')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC Curve')
    plt.legend(loc="lower right")
    
    # 绘制PR曲线
    plt.subplot(1, 2, 2)
    plt.plot(recall, precision, color=color, lw=2, label=f'K = {k}, Avg. Precision = {average_precision:.2f}')
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.title('PR Curve')
    plt.legend(loc="lower left")

plt.tight_layout()
plt.show()
4.4运行效果

可以清晰地看到不同k值下PR曲线和ROC曲线的变化

4.5实验注意事项

在糖尿病数据集中,目标变量y是一个连续的数值,表示糖尿病患者的疾病进展情况。通常,模型的任务是根据特征预测这个连续数值,但是我们此实验需要转换成二分类问题,如下:

如果没有进行阈值二分类,将导致以下情况:

1.连续目标变量:目标变量 y 仍将保持为连续的、代表疾病进展情况的数值。这会使问题变成一个回归问题,而不是二分类问题。模型将试图预测连续数值,而不是分类糖尿病患者和非糖尿病患者。

2.无法评估二分类性能:如果不进行二分类处理,将无法计算准确率、精确率、召回率、F1分数、ROC曲线或PR曲线等二分类性能指标。这些指标通常用于评估模型在分类任务中的性能。

因此,通过将阈值应用于目标变量 y,我们将问题明确定义为一个二分类任务,这对于模型的训练和性能评估至关重要。这一步是将连续目标变量转化为分类问题的关键步骤,以便正确评估模型的性能和实际应用。

4.6实验小结

此次实验演示了如何使用K-最近邻(KNN)算法进行糖尿病预测的二分类任务,并绘制了不同K值下的ROC曲线和PR曲线,结果显示不同K值对模型性能有显著影响。通过ROC曲线,我们可以比较不同K值下的模型性能,而PR曲线更关注模型对正例的识别。这个实验展示了模型评估在选择最佳K值和理解模型性能方面的重要性,有助于实际应用中更好地应对类似的分类任务。

5.总结

评估模型的性能至关重要,因为它在机器学习和实际应用中具有关键作用,主要体现在以下几个方面:

5.1决策支持:模型评估提供了决策支持的基础。在实际应用中,我们依赖模型来做出决策,例如预测疾病风险、客户购买行为或信用评分。如果模型性能不佳,决策可能会导致不良结果。

5.2性能比较:模型评估允许我们比较不同模型之间的性能。通过评估多个模型,我们可以选择最适合特定任务的模型,从而提高预测准确性。

5.3参数调整:模型评估有助于确定最佳参数配置。通过调整模型的参数,我们可以提高其性能。模型评估帮助确定哪些参数配置最适合解决特定问题。

5.4过拟合和泛化:评估模型有助于检测过拟合。模型可能在训练数据上表现良好,但在未见过的数据上表现不佳。评估可以帮助我们了解模型是否过度拟合,并在必要时采取措施以提高泛化性能。

5.5不确定性估计:模型评估还允许我们估计模型预测的不确定性。对于一些任务,如医学诊断或金融风险评估,了解模型预测的不确定性至关重要。

5.6质量控制:在生产环境中部署机器学习模型之前,模型评估是质量控制的一部分。它确保模型在不同数据分布和条件下都能保持高性能。

在实际应用中,模型评估是数据科学家和机器学习从业者的核心任务之一。它有助于确保模型能够有效地解决问题,减少错误决策的风险,并提高预测的准确性。因此,模型评估在机器学习应用中至关重要,它帮助我们将数据科学转化为有用的洞察和决策。

6.参考文献

机器学习 - 模型评估_机器学习模型评估_JOEL-T99的博客-优快云博客机器学习 - 模型评估_机器学习模型评估_JOEL-T99的博客-优快云博客机器学习 - 模型评估_机器学习模型评估_JOEL-T99的博客-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值