【发布时间】:2020-05-05 14:01:28
【问题描述】:
我有一个类别严重不平衡的数据集(bank-additional-full)。除了将值分配给分类变量之外,我正在使用它而没有进行任何更改。它有大约 89% 的类别为否 (0) 和 11% 的类别为是 (1)。
我的模型总是预测是(减少一个),并且改变学习率也没有效果。它应该更频繁地预测具有更大计数的类,即没有
我正在学习 pytorch,所以请告诉我我的错误,因为我很难找到它。
class LogisticRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
super(LogisticRegressionModel, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
out = F.softmax(self.linear(x),dim=1)
return out
input_dim = 1*20
output_dim = 2
model = LogisticRegressionModel(input_dim, output_dim)
criterion = nn.CrossEntropyLoss()
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
iter = 0
num_epochs= 10
train_losses, val_losses = [], []
for epoch in range(num_epochs):
running_loss = 0
for i, (x, labels) in enumerate(train_loader):
x = Variable(x.view(-1, height*width))
labels = Variable(labels)
optimizer.zero_grad()
outputs = model(x.float())
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
iter += 1
else:
val_loss = 0
correct = 0
total = 0
with torch.no_grad():
for x, labels in val_loader:
x = Variable(x.view(-1,height*width))
outputs = model(x.float())
val_loss += criterion(outputs, labels)
values, predicted = torch.max(outputs.data, 1)
#print(values.data)
total += labels.size(0)
correct += (predicted == labels).sum()
accuracy = 100 * correct / total
train_losses.append(running_loss/len(train_loader))
val_losses.append(val_loss/len(val_loader))
print("Epoch: {}/{}.. ".format(epoch+1, num_epochs),
"Training Loss: {:.3f}.. ".format(running_loss/len(train_loader)),
"Validation Loss: {:.3f}.. ".format(val_loss/len(val_loader)),
"Validation Accuracy: {:.3f}".format(accuracy))
print("\n")
结果: Epoch:1/10.. 训练损失:1.201.. 验证损失:1.202.. 验证准确度:11.000
损失和准确性保持不变
【问题讨论】:
标签: python pytorch logistic-regression