Метрики классификации не могут обрабатывать сочетание мультиклассовых и неизвестных целей.
Мне нравится пытаться прогнозировать журналы событий с помощью графовых нейронных сетей (GCN). Однако при расчете Acc я получаю следующее сообщение об ошибке: «Метрики классификации не могут обрабатывать сочетание мультиклассовых и неизвестных целей».
Длина обучающего и тестового набора данных соответствует:
print(len(actuals))
print(len(predictions))
7348
7348
Когда я печатаю результаты для события, я получаю следующий результат. Здесь актуальное и предсказание не в одном формате, может в этом ошибка?
print(actuals[101])
print(predictions[101])
tensor([9.])
tensor(9)
Как я могу сделать результаты сопоставимыми друг с другом?
Вот мой код:
lr_run = 0
for lr_run in range(3):
if lr_run==0:
lr_value = 1e-03
elif lr_run==1:
lr_value = 1e-04
elif lr_run==2:
lr_value = 1e-05
run = 0
for run in range(num_runs):
print("Run: {}, Learning Rate: {}".format(run+1,lr_value))
model = EventPredictor(num_nodes, num_features)
train_dl,valid_dl,test_dl = generate_input_and_labels(path)
adj = generate_process_graph(path)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(),lr=lr_value)
print("************* Event Predictor ***************")
print("Train size: {}, Validation size:{}, Test size: {}".format(len(train_dl.dataset),len(valid_dl.dataset),len(test_dl.dataset)))
print(model)
model = model.to(device)
adj = adj.to(device)
epochs_plt = []
acc_plt = []
loss_plt = []
valid_loss_plt = []
for epoch in range(num_epochs):
model.train()
num_train = 0
training_loss = 0
predictions, actuals = list(),list()
for i, (inputs,targets) in enumerate(train_dl):
inputs,targets = inputs.to(device), targets.to(device)
optimizer.zero_grad()
yhat = model(inputs[0],adj)
loss = criterion(yhat.reshape((1,-1)),targets[0].to(torch.long))
loss.backward()
optimizer.step()
training_loss+= loss.item()
yhat = yhat.to('cpu')
yhat = torch.argmax(yhat)
actual = targets.to('cpu')
actual = actual[0]
predictions.append(yhat)
actuals.append(actual)
num_train+=1
with torch.no_grad():
model.eval()
num_valid = 0
validation_loss = 0
for i,(inputs,targets) in enumerate(valid_dl):
inputs,targets = inputs.to(device),targets.to(device)
yhat_valid = model(inputs[0],adj)
loss_valid = criterion(yhat_valid.reshape((1,-1)),targets[0].to(torch.long))
validation_loss+= loss_valid.item()
num_valid+= 1
acc = accuracy_score(predictions, actuals)
avg_training_loss = training_loss/num_train
avg_validation_loss = validation_loss/num_valid
print("Epoch: {}, Loss: {}, Accuracy: {}, Validation loss : {}".format(epoch, avg_training_loss, acc, avg_validation_loss))
epochs_plt.append(epoch+1)
acc_plt.append(acc)
loss_plt.append(avg_training_loss)
valid_loss_plt.append(avg_validation_loss)