Skip to content

第七章:推理与评估

在完成了模型的训练和微调之后,接下来的重要步骤就是进行推理(inference)以及评估模型的表现。本章将详细介绍如何使用Hugging Face的Transformers库来进行模型推理,并介绍几种常用的性能评估指标及其实现方法。

7.1 模型推理过程

7.1.1 加载训练好的模型

为了进行推理,首先需要加载你之前保存的或从Hugging Face模型中心下载的预训练模型。这里我们继续以BERT为例:

python
from transformers import AutoModelForSequenceClassification, AutoTokenizer

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

print("模型加载成功!")

如果你已经进行了微调并保存了模型,记得用相应的路径替换model_name

7.1.2 准备输入数据

推理时使用的输入数据应当与训练时保持一致的格式。对于文本分类任务,这通常意味着要对输入文本进行编码。

python
text = "This is a positive review."
inputs = tokenizer(text, return_tensors="pt")  # 使用PyTorch张量

7.1.3 执行推理

一旦输入数据准备好了,就可以将其传递给模型进行前向传播,获取预测结果。

python
with torch.no_grad():  # 关闭梯度计算以节省内存
    outputs = model(**inputs)
logits = outputs.logits

logits 是未经归一化的预测分数,可以通过softmax函数转换为概率分布。

python
import torch.nn.functional as F

probs = F.softmax(logits, dim=-1)
predicted_class = torch.argmax(probs, dim=-1).item()
print(f"Predicted class: {predicted_class}")

7.2 性能评估指标

7.2.1 分类任务评估指标

对于分类任务,常见的评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1 Score)。这些指标可以帮助你更全面地了解模型的表现。

  • 准确率(Accuracy):所有预测正确的样本占总样本的比例。
  • 精确率(Precision):预测为正类中实际为正类的比例。
  • 召回率(Recall):实际为正类中被正确预测的比例。
  • F1分数(F1 Score):精确率和召回率的调和平均数。

可以使用sklearn.metrics模块轻松计算这些指标:

python
from sklearn.metrics import accuracy_score, precision_recall_fscore_support

# 假设y_true是真实标签,y_pred是预测标签
accuracy = accuracy_score(y_true, y_pred)
precision, recall, f1, _ = precision_recall_fscore_support(y_true, y_pred, average='weighted')

print(f"Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1 Score: {f1:.4f}")

7.2.2 回归任务评估指标

对于回归任务,常用的评估指标包括均方误差(Mean Squared Error, MSE)、均方根误差(Root Mean Squared Error, RMSE)和平均绝对误差(Mean Absolute Error, MAE)等。

python
from sklearn.metrics import mean_squared_error, mean_absolute_error

mse = mean_squared_error(y_true, y_pred)
rmse = mse ** 0.5
mae = mean_absolute_error(y_true, y_pred)

print(f"MSE: {mse:.4f}, RMSE: {rmse:.4f}, MAE: {mae:.4f}")

7.2.3 自定义评估指标

如果标准评估指标不能满足需求,还可以根据具体任务自定义评估函数。例如,在某些情况下,可能更关心特定类别或阈值下的表现。

python
def custom_metric(y_true, y_pred):
    # 定义你的评估逻辑
    pass

custom_score = custom_metric(y_true, y_pred)
print(f"Custom Metric Score: {custom_score}")

7.3 结果可视化

7.3.1 绘制混淆矩阵

混淆矩阵是一个非常直观的方式来看待分类模型的表现,特别是多分类问题。可以使用matplotlibseaborn库来绘制混淆矩阵。

python
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.show()

7.3.2 ROC曲线和AUC

对于二分类问题,接收者操作特征曲线(ROC Curve)及其下的面积(AUC)是衡量模型区分能力的重要工具。

python
from sklearn.metrics import roc_curve, auc

fpr, tpr, _ = roc_curve(y_true, probs[:, 1])
roc_auc = auc(fpr, tpr)

plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

通过以上内容,你应该掌握了如何使用Hugging Face的Transformers库进行模型推理,并能够应用多种评估指标来衡量模型的表现。此外,还学会了如何通过可视化手段更好地理解和解释模型的结果。如果你有任何疑问或者需要更多帮助,请随时告诉我!