这看起来很简单,但我正在寻找输出具有单一输出(二元分类模型)的模型预测结果的最佳方式。在这个例子中,我的标签是0和1。现在我可以简单地说,如果模型输出大于0.5,标签就是1。但我觉得这样做可能不够准确。因此,我想知道是否有更好的方法,比如
prediction = np.argmax(y_hat.detach().numpy, axis=0) for multiple classes.
目前我正在进行这样的测试:
test = [[0,0],[0,1],[1,1],[1,0]]for trial in test: Xtest = torch.Tensor(trial) y_hat = logreg_clf(Xtest) if y_hat > 0.5: prediction = 1 else: prediction = 0 # prediction = np.argmax(y_hat.detach().numpy, axis=0) print("{0} xor {1} = {2}".format(int(Xtest[0]), int(Xtest[1]), prediction))
我也想知道是否有函数可以自动获取测试集’test’的准确率或混淆矩阵。
供参考,我的模型如下:
import torch.nn as nnimport torch.nn.functional as Fclass LogisticRegression(nn.Module): # input_size: 输入特征向量的维度。 # num_classes: 分类问题中的类别数。 def __init__(self, input_size, num_classes): # 总是先调用超类(nn.Module)的构造函数! super(LogisticRegression, self).__init__() # 设置线性变换 self.linear = nn.Linear(input_size, num_classes) # 我暂时没有在线性层之后加入sigmoid激活函数,因为我们的损失函数将包含这一部分,如后所述 # forward的唯一参数是输入。 # 输入的形状为(batch_size, input_size) def forward(self, x): # 应用线性变换。 # 输出的形状为(batch_size, num_classes)。 out = self.linear(x) out = F.sigmoid(out) # 对out张量进行softmax处理,得到每个示例的类别对数概率分布 return out# 二元分类num_outputs = 1num_input_features = 2# 创建逻辑回归模型logreg_clf = LogisticRegression(num_input_features, num_outputs)print(logreg_clf)import torch lr_rate = 0.001 # alpha# 输入X和标签Y的训练集X = torch.Tensor([[0,0],[0,1], [1,0], [1,1]])Y = torch.Tensor([0,1,1,0]).view(-1,1) #view类似于numpy的reshape(),这里将其变成列# 运行逻辑回归模型的前向传递sample_output = logreg_clf(X) #目前完全随机print(X)loss_function = nn.BCELoss() # SGD:随机梯度下降用于训练/拟合模型optimizer = torch.optim.SGD(logreg_clf.parameters(), lr=lr_rate)import numpy as np # from torch.autograd import Variable#训练循环:epochs = 2001 #我们遍历训练集的次数steps = X.size(0) #steps = 4;我们有4个训练示例(我知道,训练集很小:)for i in range(epochs): for j in range(steps): # 从训练集中随机抽样: data_point = np.random.randint(X.size(0)) # 将检索到的数据点存储到两个正确形状的单独变量中 x_var = torch.Tensor(X[data_point]).unsqueeze(0) y_var = torch.Tensor(Y[data_point]) optimizer.zero_grad() # 清空(零)梯度缓冲区 y_hat = logreg_clf(x_var) #从模型获取输出 print(y_hat) print(y_var) loss = loss_function(y_hat, y_var) #计算损失 loss.backward() #反向传播 optimizer.step() #执行更新 if i % 500 == 0: print ("Epoch: {0}, Loss: {1}, ".format(i, loss.data.numpy()))
回答:
test_data = torch.Tensor(test)raw_preds = logreg_clf(test_data)preds = (raw_preds > 0.5).long()
为了一次性获取所有测试数据的预测,我们首先将测试数据转换为张量,然后我们可以使用该张量进行前向传递。原始预测看起来像tensor([[0.4795], [0.4749], [0.4960], [0.5006]]
。然后我们应用“风险中性策略”,即以0.5为阈值来获取结果(结果将是torch.bool
类型,因此我们将其转换为long
)。
等效地在一行中:
preds = (logreg_clf(torch.Tensor(test)) > 0.5).long()
所以预测结果是:
tensor([[0], [0], [0], [1]])
想知道是否有函数可以自动获取准确率或混淆矩阵
你可以使用来自sklearn.metrics
的相应函数:
from sklearn.metrics import accuracy_score, confusion_matrix# 给定测试数据的真实值truth = torch.Tensor([0, 1, 0, 1]).view(-1, 1) conf_mat = confusion_matrix(truth, preds)acc = accuracy_score(truth, preds)
这将给出混淆矩阵为
array([[2, 0], [1, 1]], dtype=int64)
以及准确率为
0.75
所以你有一个假阴性,即测试数据中的第二个样本。