最佳方式输出具有单一输出(二元分类)的模型测试集的预测结果

这看起来很简单,但我正在寻找输出具有单一输出(二元分类模型)的模型预测结果的最佳方式。在这个例子中,我的标签是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

所以你有一个假阴性,即测试数据中的第二个样本。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注