在模型训练完成后,需要使用模型来预测新数据,并评估模型的性能。在这种情况下,需要使用模型评估来检查模型的性能。
模型评估包括使用模型对新数据进行预测,并使用与训练过程相同的指标来检查模型的性能。例如,如果在训练过程中使用了精度作为指标,则在评估模型时也可以使用精度来检查模型的预测准确率。
在 PyTorch 中,有许多内置的指标可以用于评估模型性能,这些指标可以帮助我们了解模型的表现。
1.准确率(Accuracy)
准确率(Accuracy)是一种评估模型性能的指标,它表示模型的预测结果与真实结果的匹配程度。通常,准确率越高,模型的性能就越好。
使用 torch.nn.functional.accuracy()
函数来计算模型的准确率。
# 使用模型对数据进行预测
outputs = model(inputs)
# 计算准确率
accuracy = torch.nn.functional.accuracy(outputs, labels)
#打印准确率,准确率的值可以通过调用 accuracy.item() 来获取。
print(accuracy.item())
2.ROC(Receiver Operating Characteristic)
ROC(Receiver Operating Characteristic)曲线是一种用来衡量二分类器性能的曲线。ROC曲线绘制的是分类器的真正率(true positive rate)和假正率(false positive rate)。真正率是分类器将正样本正确分类的概率,假正率是将负样本错误分类成正样本的概率。
可以使用torch.nn.functional.roc_auc_score
函数来计算ROC曲线下的面积(AUC)
。这个函数接收两个参数:
y_true:一个包含真实标签的Tensor。标签取值可以是0或1。
y_score:一个包含分类器预测得分的Tensor。这个得分可以是分类器对样本的预测概率,也可以是分类器对样本的预测类别。
如果要绘制ROC曲线,可以使用scikit-learn中的roc_curve
函数。它需要接收三个参数:
y_true:一个包含真实标签的数组。标签取值可以是0或1。
y_score:一个包含分类器预测得分的数组。这个得分可以是分类器对样本的预测概率,也可以是分类器对样本的预测类别。
pos_label:正样本的标签值。
roc_curve
函数会返回三个值:
fpr:一个数组,包含每个ROC曲线绘制的真正率(true positive rate)和假正率(false positive rate)。绘制ROC曲线时,我们需要将真正率作为横坐标,假正率作为纵坐标,并将它们作为一个散点图绘制出来。
tpr:一个数组,包含真正率的值。
thresholds:一个数组,包含每个阈值对应的真正率和假正率。
绘制完ROC曲线之后,我们还可以通过计算曲线下的面积(AUC)来评估分类器的性能。AUC越大,分类器的性能就越好。通常,AUC的取值范围是0~1。当AUC=1时,说明分类器性能最优;当AUC=0.5时,说明分类器的性能比随机猜测差不多。
# 定义真实标签
y_true = torch.Tensor([0, 0, 1, 1])
# 定义预测得分
y_score = torch.Tensor([0.1, 0.4, 0.35, 0.8])
# 计算AUC值
auc = torch.nn.functional.roc_auc_score(y_true, y_score)
# 绘制ROC曲线
fpr, tpr, thresholds = sklearn.metrics.roc_curve(y_true, y_score, pos_label=1)
plt.plot(fpr, tpr)
plt.show()
3.混淆矩阵(confusion_matrix)
混淆矩阵是一种用来评估分类器性能的矩阵。它统计了分类器的真正率和假正率,并将它们作为矩阵的四个值:真正类(true positive)、真负类(true negative)、假正类(false positive)和假负类(false negative)。
在pytorch中,可以使用torch.nn.functional.confusion_matrix函数来计算混淆矩阵。这个函数接收两个参数:
y_true:一个包含真实标签的Tensor。标签取值可以是0或1。
y_pred:一个包含预测标签的Tensor。标签取值可以是0或1。
confusion_matrix函数会返回一个二维的Tensor,包含4个值。
# 定义真实标签
y_true = torch.Tensor([0, 0, 1, 1])
# 定义预测标签
y_pred = torch.Tensor([0, 1, 0, 1])
#计算混淆矩阵
confusion_matrix = torch.nn.functional.confusion_matrix(y_true, y_pred)
#打印结果
print(confusion_matrix)
输出结果为:
#这个矩阵的值依次是:真正类(1)、假负类(1)、假正类(1)和真负类(1)。
tensor([[1, 1],
[1, 1]])
精度(Precision)是一种评估模型性能的指标,它表示模型预测为正的样本中,真实为正的样本的比例。通常,精度越高,模型的性能就越好。
可以使用sklearn.metrics.precision_score()
函数来计算模型的精度。
召回率(Recall)是一种评估模型性能的指标,它表示真实为正的样本中,被模型预测为正的样本的比例。通常,召回率越高,模型的性能就越好。
可以使用 sklearn.metrics.recall_score()
函数来计算模型的召回率。
F1 值(F1 Score)是一种评估模型性能的指标,它表示模型的精度和召回率的调和平均值。通常,F1 值越高,模型的性能就越好。
可以使用sklearn.metrics.f1_score()
函数来计算模型的精度。
使用以下代码来评估 PyTorch 模型:
# 禁用自动求导
with torch.no_grad():
# 将模型设置为评估模式
model.eval()
# 使用模型对数据进行预测
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 计算准确率
accuracy = torch.nn.functional.accuracy(outputs, labels)
# 计算精度、召回率和 F1 值
precision = sklearn.metrics.precision_score(labels, outputs)
recall = sklearn.metrics.recall_score(labels, outputs)
f1 = sklearn.metrics.f1_score(labels, outputs)
# 输出指标值
print("Loss:", loss.item())
print("Accuracy:", accuracy.item())
print("Precision:", precision)
print("Recall:", recall)
print("F1:", f1)
我们首先禁用了自动求导,然后将模型设置为评估模式。然后,我们使用模型对数据进行预测,并使用 torch.nn.CrossEntropyLoss 类计算损失。接着,我们计算了模型的准确率、精度和召回率,并输出这些指标的值。
PyTorch提供了一系列用来评估模型性能的函数。这些函数可以帮助我们了解模型在训练和测试数据上的表现情况,从而决定模型是否需要进一步改进。常用的评估指标包括准确率、混淆矩阵和ROC曲线。在PyTorch中,可以使用accuracy_score、confusion_matrix和roc_auc_score等函数来计算这些指标。此外,PyTorch还提供了一些其他的评估函数,如F1-score、precision和recall等,可以根据实际需要选择使用。