加权准确率WA,未加权平均召回率UAR和未加权UF1
1.加权准确率WA,未加权平均召回率UAR和未加权UF1
from sklearn.metrics import classification_report
from sklearn.metrics import precision_recall_curve, average_precision_score,roc_curve, auc, precision_score, recall_score, f1_score, confusion_matrix, accuracy_score
import torch
from torchmetrics import MetricTracker, F1Score, Accuracy, Recall, Precision, Specificity, ConfusionMatrix
import warnings
warnings.filterwarnings("ignore")
pred_list = [2, 0, 4, 1, 4, 2, 4, 2, 2, 0, 4, 1, 4, 2, 2, 0, 4, 1, 4, 2, 4, 2]
target_list = [1, 1, 4, 1, 3, 1, 2, 1, 1, 1, 4, 1, 3, 1, 1, 1, 4, 1, 3, 1, 2, 1]
print(classification_report(target_list, pred_list))
test_acc_en = Accuracy(task="multiclass",num_classes=5, threshold=1. / 5, average="weighted")
test_rcl_en = Recall(task="multiclass",num_classes=5, threshold=1. / 5, average="macro")
test_f1_en = F1Score(task="multiclass", num_classes=5, threshold=1. / 5, average="macro")
preds = torch.tensor(pred_list)
target = torch.tensor(target_list)
print("sklearn vs torchmetrics: ")
print("Accuracy-W_ACC")
print(accuracy_score(y_true=target_list, y_pred=pred_list))
print(test_acc_en(preds, target))
print("recall-UAR")
print(recall_score(y_true=target_list,y_pred=pred_list,average='macro'))
print(test_rcl_en(preds, target))
print("F1-score-UF1")
print(f1_score(y_true=target_list, y_pred=pred_list, average='macro'))
print(test_f1_en(preds, target))

2.Pytorch模型中的评价指标实现
from torchmetrics import MetricCollection, Accuracy, F1Score, Recall
def eva_sd():
metric_collection = MetricCollection(
{
'WAC': Accuracy(task="multiclass", num_classes=10, threshold=1. / 5, average="weighted"),
'UAR': Recall(task="multiclass", num_classes=10, threshold=1. / 5, average="macro"),
'UF1': F1Score(task="multiclass", num_classes=10, threshold=1. / 5, average="macro")
}
)
return metric_collection
'''
1.加载必要的库
'''
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import transforms, datasets
import torchmetrics
from torchmetrics import MetricCollection, Accuracy, F1Score, Recall
from evaluationsd import eva_sd
metric_collection = eva_sd()
valid_accuracy = torchmetrics.Accuracy(task="multiclass", num_classes=10, average="weighted")
'''
2.定义超参数
'''
BATCH_SIZE = 64
DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
EPOCHS = 50
print(DEVICE)
'''
3.下载、加载数据集
'''
from torch.utils.data import DataLoader
pipeline = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
]
)
train_set = datasets.MNIST("data", train=True, download=True, transform=pipeline)
test_set = datasets.MNIST("data", train=False, download=True, transform=pipeline)
train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True)
test_loader = DataLoader(test_set, batch_size=BATCH_SIZE, shuffle=True)
'''
4.构建网络模型
'''
class Digit(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 10, 5)
self.conv2 = nn.Conv2d(10, 20, 3)
self.fc1 = nn.Linear(20 * 10 * 10, 500)
self.fc2 = nn.Linear(500, 10)
def forward(self, x):
input_size = x.size(0)
x = self.conv1(x)
x = F.relu(x)
x = F.max_pool2d(x, 2, 2)
x = self.conv2(x)
x = F.relu(x)
x = x.view(input_size, -1)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
output = F.log_softmax(x, dim=1)
return output
'''
5.定义优化器
'''
model = Digit().to(DEVICE)
optimizer = optim.Adam(model.parameters())
'''
6.定义训练方法
'''
def train_model(model, device, train_loader, optimizer, epoch):
model.train()
for batch_index, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.cross_entropy(output, target)
loss.backward()
optimizer.step()
if batch_index % 3000 == 0:
print("Train Epoch : {}\t Loss : {:.6f}".format(epoch, loss.item()))
'''
7.定义测试方法
'''
def valid_model(model, device, test_loader):
model.eval()
correct = 0.0
test_loss = 0.0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.cross_entropy(output, target).item()
pred = output.max(1, keepdim=True)[1]
correct += pred.eq(target.view_as(pred)).sum().item()
valid_accuracy(torch.squeeze(pred).detach().cpu(),target.detach().cpu())
metric_collection(torch.squeeze(pred).detach().cpu(),target.detach().cpu())
total_train_accuracy = valid_accuracy.compute()
val_metrics = metric_collection.compute()
test_loss /= len(test_loader.dataset)
print("Test--Average loss : {:.4f},Accuracy : {:.4f}\n".format(
test_loss, correct / len(test_loader.dataset)
))
print("My_Accuracy : {:.4f}\n".format(
total_train_accuracy))
print("Metrics on all data: {:.4f}".format(val_metrics['WAC']))
valid_accuracy.reset()
metric_collection.reset()
if __name__ == "__main__":
for epoch in range(1, EPOCHS + 1):
train_model(model, DEVICE, train_loader, optimizer, epoch)
valid_model(model, DEVICE, test_loader)

3.参考链接
- 一文看懂机器学习指标:准确率、精准率、召回率、F1、ROC曲线、AUC曲线
- 多分类中TP/TN/FP/FN的计算
- 多分类中混淆矩阵的TP,TN,FN,FP计算
- TP、TN、FP、FN超级详细解析
- 一分钟看懂深度学习中的准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP
- 深度学习评价指标简要综述
- 深度学习 数据多分类准确度 多分类的准确率计算
- Sklearn和TorchMetrics计算F1、准确率(Accuracy)、召回率(Recall)、精确率(Precision)、敏感性(Sensitivity)、特异性(Specificity)
- 【PyTorch】TorchMetrics:PyTorch的指标度量库
10.使用Torchmetrics快速进行验证指标的计算(附代码)