一、模型评估的简单介绍
1.1模型评估的概念
模型评估指标是用于量化机器学习模型在处理数据时表现的指标。它们帮助我们理解模型的性能、准确度和泛化能力,并且可以用于比较不同模型之间的优劣,它们对于了解模型在解决特定问题时的表现至关重要。基本作用包括一下几点
衡量模型性能:评价指标提供了一种标准化的方式来量化模型的性能,使我们能够对模型的表现进行客观的比较和评估。
指导模型选择:通过比较不同模型的评价指标,可以帮助选择最适合特定任务的模型。例如,在分类问题中,准确率高的模型通常被认为是更好的选择,而在异常检测等不平衡数据集上,精确率和召回率可能更为重要。
识别模型问题:评价指标可以帮助识别模型存在的问题或局限性。例如,如果模型的召回率很低,可能意味着模型在识别某些类别时存在困难。
优化模型:通过监控评价指标的变化,可以指导模型的优化过程。例如,针对某些指标较差的问题,可以采取针对性的改进措施,如调整模型参数、增加数据样本等。
解释模型行为:评价指标可以帮助解释模型的行为和决策过程。例如,通过分析混淆矩阵可以了解模型在不同类别上的表现,从而识别模型在哪些类别上容易混淆。
1.2混淆矩阵和常见的分类模型评估指标
1.2.1混淆矩阵
混淆矩阵(Confusion Matrix)是一种用于衡量分类模型性能的矩阵,它将模型预测的结果与实际的真实标签进行对比,并将结果分类为四种不同的情况:真正例(True Positive,TP)、真负例(True Negative,TN)、假正例(False Positive,FP)和假负例(False Negative,FN)。
混淆矩阵的一般形式如下:
预测值 真实值 | 正类别 | 负类别 |
---|---|---|
正类别 | TP | FN |
负类别 | FP | TN |
-
真正例(True Positive,TP):模型正确地预测了正类别样本。
-
真负例(True Negative,TN):模型正确地预测了负类别样本。
-
假正例(False Positive,FP):模型错误地将负类别样本预测为正类别。
-
假负例(False Negative,FN):模型错误地将正类别样本预测为负类别。
1.2.2常见的分类模型评估指标
1. 准确率(Accuracy):是模型正确预测的样本数量与总样本数量的比率。它是最常见的评估指标之一,但在不平衡数据集中可能不够准确
Accuracy = (TP+TN)/(TP+FN+FP+TN)
2. 精确率(Precision):是被模型预测为正类别的样本中,实际为正类别的比率。它衡量了模型的预测中有多少是真正正确的。
Precision = (TP)/(TP+FP)
3. 召回率(Recall):是实际为正类别的样本中,被模型正确预测为正类别的比率。它衡量了模型识别出所有真正正例的能力。
Recall = TP/(TP+FN)
4. F1 分数(F1 Score):是精确率和召回率的调和平均数,综合了两者的性能。当需要同时考虑精确率和召回率时,F1 分数是一个很好的选择。
5. ROC 曲线和 AUC(Receiver Operating Characteristic curve and Area Under the Curve):ROC 曲线是以假阳性率(False Positive Rate)为横轴,真阳性率(True Positive Rate)为纵轴绘制的曲线,AUC 则是 ROC 曲线下的面积,用于度量分类器的性能。AUC 值越大,分类器性能越好.
ROC曲线和PR曲线的异同:ROC 曲线基于真阳性率(TPR,召回率的另一种称呼)和假阳性率(FPR)绘制,而 P-R 曲线基于精确率(Precision)和召回率(Recall)绘制。这两者都提供了一个随着阈值变化而变化的视角。在使用 P-R 曲线和 ROC 曲线时,我们通常会关注曲线下面积(AUC),AUC 值越接近于1,表示模型性能越好。 P-R 曲线和 ROC 曲线都是评估模型性能的重要工具,选择使用哪一个取决于具体的应用场景和对模型性能的关注点。
二、代码的实际演示
2.1代码展示
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.metrics import precision_recall_curve, roc_curve
# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 分割数据为训练集和测试集
split_ratio = 0.8
split_index = int(split_ratio * len(X))
train_data, test_data = X[:split_index], X[split_index:]
train_lable, test_lable = y[:split_index], y[split_index:]
#让plt。show显示的图中title能显示中文而不是乱码
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
# 用于每个数据计算欧式距离
def distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
def knn(train_data, train_lable, test_data, k):
# 计算所有的训练数据和测试数据的欧式距离
distances = [distance(test, train) for test in test_data for train in train_data]
# 将distance中的元素从小到大排列,返回其对应的索引
min_distance = np.argsort(distances)[:k]
k_nearest_labels = [train_lable[i] for i in min_distance]
prediction = np.mean(k_nearest_labels) # 取k个最近样本的平均值作为预测值
return prediction
# 计算预测结果
predictions = [knn(train_data, train_lable, np.array([test]), k=3) for test in test_data]
# 使用sklearn中的函数计算P-R曲线和ROC曲线
precision, recall, _ = precision_recall_curve(test_lable, predictions)
fpr, tpr, _ = roc_curve(test_lable, predictions)
# 绘制P-R曲线和ROC曲线
plt.figure(figsize=(10, 5))
# P-R曲线
plt.subplot(1, 2, 1)
plt.plot(recall, precision, marker='o')
plt.title('P-R曲线')
plt.xlabel('召回率')
plt.ylabel('精确率')
# ROC曲线
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, marker='o')
plt.title('ROC曲线')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.show()
首先依据上一次实验所写的KNN算法,加以修改,通过用make_classification来生产数据集,make_classification 函数用于生成一个具有指定特征数量、样本数量和类别数量的合成数据集。在这里,n_samples=1000 表示生成1000个样本,n_features=20 表示每个样本有20个特征,n_classes=2 表示数据集有2个类别。random_state=42 是一个随机种子,用于确保每次运行代码时生成的数据集都是一致的。
然后,数据集被按照指定的比例 split_ratio 分割为训练集和测试集。在这里,split_ratio = 0.8 表示80%的数据用于训练,20%的数据用于测试。split_index 计算了分割索引,将数据按照这个索引进行切分。
最后,将生成的数据集 X 和对应的标签 y 分割成训练集和测试集。train_data 和 train_label 是训练集的特征和标签,test_data 和 test_label 是测试集的特征和标签。
这样,我们就得到了用于训练和测试的数据集。在训练集上训练模型,在测试集上评估模型的性能。
2.2效果图展示
K = 3时的PR曲线和ROC曲线
K = 5时的PR曲线和ROC曲线
三、总结
通过绘制 P-R 曲线和 ROC 曲线,我们能够全面了解模型在不同阈值下的表现,包括精确率、召回率、真阳性率和假阳性率等指标。这使我们能够更好地理解模型的优势和不足,有针对性地进行调优和改进,我们可以选择最适合任务需求的模型和阈值。如果任务更注重精确率或召回率,我们可以根据曲线的形状选择合适的模型和阈值,从而提高模型的效果。通过实验,深刻认识到了模型评估的重要性,了解到了不同评估指标的含义和用途。同时,实验过程也让我们更加熟悉了机器学习模型的训练、评估和调优流程,提升了对机器学习的理解和应用能力。