| @ -0,0 +1,124 @@ | |||
| import torch | |||
| import torch.nn as nn | |||
| import torch.optim as optim | |||
| import numpy as np | |||
| import pandas as pd | |||
| class Net(nn.Module): | |||
| def __init__(self, input_shape): | |||
| super().__init__() | |||
| self.fc1 = nn.Linear(input_shape, 8) | |||
| self.fc2 = nn.Linear(8, 4) | |||
| def forward(self, x): | |||
| x = torch.sigmoid(self.fc1(x)) | |||
| return self.fc2(x) | |||
| def get_argmax(array): | |||
| max = 0 | |||
| index = 0 | |||
| for i in range(len(array)): | |||
| if array[i] > max: | |||
| max = array[i] | |||
| index = i | |||
| one_hot = [0,0,0,0] | |||
| one_hot[index] = 1 | |||
| return one_hot | |||
| def get_trainset(dataset, k, n0, x_columns, y_columns): | |||
| inp = dataset[x_columns] | |||
| out = dataset[y_columns] | |||
| col = "day" | |||
| x = [] | |||
| y = [] | |||
| input_shape = 0 | |||
| output_shape = 0 | |||
| for player in out["playerID"].unique(): | |||
| XPlayer = inp[inp["playerID"] == player] | |||
| YPlayer = out[out["playerID"] == player] | |||
| for day in YPlayer[col][n0 - 1:]: | |||
| prev = day - k | |||
| xprev = XPlayer[XPlayer[col] == prev].drop(columns=[col, "playerID"]).to_numpy() | |||
| if xprev.shape[0] != 1: | |||
| continue | |||
| else: | |||
| xprev = xprev[0, :] | |||
| yt = YPlayer[YPlayer[col] == day].drop(columns=[col, "playerID"]).to_numpy()[0, :] | |||
| if input_shape == 0: | |||
| input_shape = xprev.shape[0] | |||
| else: | |||
| if input_shape != xprev.shape[0]: | |||
| print("INCONSISTENT INPUT DIMENSION") | |||
| exit(2) | |||
| if output_shape == 0: | |||
| output_shape = yt.shape[0] | |||
| else: | |||
| if output_shape != yt.shape[0]: | |||
| print("INCONSISTENT OUTPUT DIMENSION") | |||
| exit(2) | |||
| x.append(xprev) | |||
| y.append(yt) | |||
| x = torch.FloatTensor(x) | |||
| y = torch.LongTensor(y) | |||
| return x, y | |||
| def time_series_sigmoid_classification(steps, dataset, k, n0, x_columns, y_columns): | |||
| net = Net(1) | |||
| optimizer = optim.Adam(net.parameters(), lr=.001) | |||
| loss = nn.CrossEntropyLoss() | |||
| x, y = get_trainset(dataset, k, n0, x_columns, y_columns) | |||
| accuracy(net, x, y) | |||
| for step in range(steps): | |||
| optimizer.zero_grad() | |||
| x, y = get_trainset(dataset, k, n0, x_columns, y_columns) | |||
| pred = net(x) | |||
| net_loss = loss(pred, torch.max(y, 1)[1]) | |||
| net_loss.backward() | |||
| optimizer.step() | |||
| print("Loss at Step {}: {}".format(step, net_loss)) | |||
| x, y = get_trainset(dataset, k, n0, x_columns, y_columns) | |||
| accuracy(net, x, y) | |||
| def accuracy(net, x, y): | |||
| pred = net(x) | |||
| pred = pred.detach().numpy() | |||
| for row in range(len(pred)): | |||
| pred[row] = get_argmax(pred[row]) | |||
| total = len(pred) | |||
| correct = 0 | |||
| for i in range(len(pred)): | |||
| equal = True | |||
| for j in range(len(pred[i])): | |||
| if pred[i][j] != y[i][j]: | |||
| equal = False | |||
| if equal: | |||
| correct += 1 | |||
| accuracy = (correct / total) * 100 | |||
| print("Accuracy for set: {}%".format(accuracy)) | |||
| torch.save(net, "model.ckpt") | |||
| def main(): | |||
| filename = "personal.csv" | |||
| df = pd.read_csv(filename) | |||
| x = ["day", "playerID", "fatigueSliding"] | |||
| y = ["day", "playerID", "BestOutOfMyselfAbsolutely", "BestOutOfMyselfSomewhat", "BestOutOfMyselfNotAtAll", "BestOutOfMyselfUnknown"] | |||
| time_series_sigmoid_classification(2, df, 0, 30, x, y) | |||
| if __name__ == '__main__': | |||
| main() | |||