机器学习 实验二:模型评估

目录

一、为什么要进行模型评估?

二、不同的分类模型评估指标

1. 混淆矩阵

2. 准确率(Accuracy)

3. 精确率(Precision)

4. 召回率(Recall)

5. F1分数(F1 Score)

6. ROC曲线

7.PR曲线

三、 简单的案例应用

 (一)过程分析

1.导入模块

2.加载数据集

3.划分数据集

4.创建并训练模型

5.不同的模型评估指标计算

6.输出不同k值下的评估指标结果

7. 绘制ROC曲线、PR曲线(以k=8为例)

(二)总代码

总结

(一)ROC曲线和PR曲线的差异

(二)不同k值对ROC曲线的影响


一、为什么要进行模型评估?

  模型评估是对训练好的模型性能进行评估, 模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。

二、不同的分类模型评估指标

1. 混淆矩阵

  混淆矩阵(Confusion Matrix)是机器学习中用于评估分类模型性能的一种工具,它将模型预测的结果与真实标签进行比较,从而生成一个矩阵来展示模型的预测性能。这个矩阵通常用于二分类问题,但也可以扩展到多分类问题。
  在二分类问题中,混淆矩阵是一个2x2的矩阵,其中行表示真实结果的标签,列表示模型的预测结果标签,如下图所示:

预测结果
+1-1
真实结果+1真正例(TP)伪反例(FN)
-1伪正例(FP)真反例(TN)

  矩阵的四个格子分别表示以下情况:
        1. 真正例(True Positive, TP,也称真阳):模型正确预测为正例的样本数量。
        2. 假正例(False Positive, FP,也称假阳):模型错误地将反例预测为正例的样本数量。
        3. 真反例(True Negative, TN,也称真阴):模型正确预测为反例的样本数量。
        4. 假反例(False Negative, FN,也称假阴):模型错误地将正例预测为负例的样本数量。

2. 准确率(Accuracy)

        准确率(Accuracy)是最常见的分类模型的评估指标

        准确率是指:模型正确预测的样例(真正例 + 真反例)占样本总数的比例。对于二类问题,准确率的计算公式如下:

        Accuracy = ( TP+TN ) / ( TP+TN+FP+FN )

3. 精确率(Precision)

        精确率(Precision,也称正确率)是指预测为正例的样本中的真正正例的比例。对于二类问题,精确率的计算公式如下:

        Precision = TP / ( TP+FP )

4. 召回率(Recall)

        召回率(Recall)是指预测为正例的真实正例占所有真实正例的比例。对于二类问题,召回率的计算公式如下:

        Recall = TP / ( TP+FN )

5. F1分数(F1 Score)

        F1分数(F1 Score)是一个评估分类模型性能的指标,它同时考虑了模型的精确率和召回率。F1分数的计算公式如下:

        F1 = 2 * \frac{ Precison * Recall } { Precision + Recall }

        F1分数的值范围在0到1之间,1表示模型在这两个指标上都达到了完美水平。F1分数综合考虑了精确率和召回率,使得模型在两个指标上达到平衡。因此它可以作为很好的性能评估指标,尤其是在类别不平衡的数据集上。

6. ROC曲线

        另一个用于度量分类中的非均衡型的工具是ROC曲线(Receiver Operating Characteristic Curve)。

        ROC曲线通过不同阈值下的假正例率(FPR)与真正例率(TPR)来绘制,它显示了模型在不同阈值下的性能。

        6.1 真正例率(True Positive Rate, TPR)是指所有正例样本中预测为真正正例的样本的比例。TPR的计算公式如下:

        TPR = TP/ ( TP+FN )

        6.2 假正例率(False Positive Rate, FPR)是指所有反例样本中被错误预测为正例样本的所占比例。FPR的计算公式如下:

        FPR = FP / ( FP + TN )

        此外,对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC)。AUC给出的是分类器的平均性能值,它提供了一个单一的数值,来总结模型的性能,其中1表示完美模型0.5表示随机猜测

7.PR曲线

        PR曲线(Precision-Recall Curve)显示了在不同阈值下的精确率(Precision)与召回率(Recall)之间的关系。PR曲线下的面积(AP)用于评估模型在类别不平衡数据集上的性能,特别是在正类样本非常少时,PR曲线比ROC曲线更能反映模型的性能。

三、 简单的案例应用

 (一)过程分析

1.导入模块

from sklearn.datasets import load_diabetes
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, roc_curve, auc, precision_recall_curve
import matplotlib.pyplot as plt

2.加载数据集

# 加载数据集
data = load_diabetes()
X = data.data
y = data.target > 120  # 将目标转换为二分类问题

3.划分数据集

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

4.创建并训练模型

#用逻辑回归的方法创建模型
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

5.不同的模型评估指标计算

#计算准确率、精确率、召回率和F1分数
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')

# 计算ROC曲线和AUC值
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)
roc_auc_values.append(roc_auc)

# 计算PR曲线和AUC值
precision_curve, recall_curve, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])
pr_auc = auc(recall_curve, precision_curve)
pr_auc_values.append(pr_auc)

6.输出不同k值下的评估指标结果

# 打印评估指标
print(f"k={k}: Accuracy={accuracy:.4f}, Precision={precision:.4f}, 
    Recall={recall:.4f}, F1={f1:.4f}")

        不同k值的评估指标结果如下所示:

7. 绘制ROC曲线、PR曲线(以k=8为例)

# 绘制ROC曲线
plt.figure(figsize=(10, 6))
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title(f'ROC Curve for k = {k}')
plt.plot(fpr, tpr, label=f'k={k}, AUC = {roc_auc:.2f}')

# 绘制PR曲线
plt.figure(figsize=(10, 6))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f"PR Curve for k = {k}" )
plt.plot(recall_curve, precision_curve, label=f'k={k}, AP = {pr_auc:.2f}')

     k=8条件下,ROC曲线和PR曲线如下图所示:

(二)总代码

from sklearn.datasets import load_diabetes
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, roc_curve, auc, precision_recall_curve
import matplotlib.pyplot as plt

# 加载数据集
data = load_diabetes()
X = data.data
y = data.target > 120  # 将目标转换为二分类问题

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

# 使用逻辑回归模型进行训练,并计算评估指标
tree_models = []
roc_auc_values = []
pr_auc_values = []
k_set= { 2, 4, 6, 7, 8, 9}

for k in k_set:
    #用逻辑回归的方法创建模型
    model = LogisticRegression()
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    #计算准确率、精确率、召回率和F1分数
    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')

    # 计算ROC曲线和AUC值
    fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
    roc_auc = auc(fpr, tpr)
    roc_auc_values.append(roc_auc)

    # 计算PR曲线和AUC值
    precision_curve, recall_curve, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])
    pr_auc = auc(recall_curve, precision_curve)
    pr_auc_values.append(pr_auc)

    # 打印评估指标
    print(f"k={k}: Accuracy={accuracy:.4f}, Precision={precision:.4f}, Recall={recall:.4f}, F1={f1:.4f}")

    # 绘制ROC曲线
    plt.figure(figsize=(10, 6))
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title(f'ROC Curve for k = {k}')
    plt.plot(fpr, tpr, label=f'k={k}, AUC = {roc_auc:.2f}')

    # 绘制PR曲线
    plt.figure(figsize=(10, 6))
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.title(f"PR Curve for k = {k}" )
    plt.plot(recall_curve, precision_curve, label=f'k={k}, AP = {pr_auc:.2f}')

# 完成ROC曲线的绘制
plt.figure(figsize=(10, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve for Different Tree Depths')
plt.legend(loc='lower right')
plt.show()

# 完成PR曲线的绘制
plt.figure(figsize=(10, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve for Different Tree Depths')
plt.legend(loc='lower right')
plt.show()

# 打印最终的AUC值
print("ROC AUC values for different tree depths:", roc_auc_values)
print("PR AUC values for different tree depths:", pr_auc_values)

总结

(一)ROC曲线和PR曲线的差异

        PR曲线(Precision-Recall Curve)和ROC曲线(Receiver Operating Characteristic Curve)都是用于评估分类模型性能的工具,它们侧重点不同,因而应用的场景也不同。
        PR曲线主要关注模型在召回率(Recall)方面的表现,即模型能够正确识别正类的比例。特别适用于类别不平衡的数据集,其中正类样本数量远少于负类样本。在这种情况下,模型可能更关注召回率,因为它可以帮助识别更多的正类样本。
        PR曲线下的面积(Average Precision, AP)是评价模型性能的指标。AP值越高,模型性能越好。


        ROC曲线主要关注模型在真正例率(True Positive Rate, TPR)方面的表现,即模型能够正确识别正类的比例。它适用于类别相对平衡的数据集,其中正类和负类样本数量相近。在这种情况下,模型可能更关注TPR,因为它可以帮助区分正类和负类。
        ROC曲线下的面积(Area Under the Curve, AUC)是评价模型性能的指标。AUC值越高,模型性能越好。

(二)不同k值对ROC曲线的影响

    当k值较小时,模型会更加关注最近的邻居,这可能导致模型对噪声更加敏感,从而在ROC曲线上表现出较低的性能。
    当k值较大时,模型会更加关注较远的邻居,这可能导致模型更加泛化,从而在ROC曲线上表现出较高的性能。

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值