import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch from sklearn import metrics from sklearn.model_selection import train_test_split from torch import nn from torch.autograd import Variable from torch.utils.data import TensorDataset,DataLoader from sklearn.metrics import f1_score, accuracy_score,roc_auc_score,confusion_matrix df = pd.read_csv(r'C:\train.csv') X=df.drop(['label'][0], axis=1) X=X.values Y=df[['label'][0]] Y=Y.values x_train, x_test, y_train, y_test = train_test_split(X, Y,train_size=0.8, random_state=1) train_x = torch.from_numpy(x_train) train_y = torch.from_numpy(y_train) class lstm(nn.Module): def __init__(self, input_size=18, hidden_size=4, output_size=1, num_layer=2): super(lstm, self).__init__() self.layer1 = nn.LSTM(input_size, hidden_size, num_layer) self.layer2 = nn.Linear(hidden_size, output_size) def forward(self, x): x, _ = self.layer1(x) s, b, h = x.size() x = x.view(s * b, h) x = self.layer2(x) x = x.view(s, b, -1) return x #inputsize输入特征维度 model = lstm(18, 4, 1, 2) criterion = nn.MSELoss() # criterion=nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-2) # 开始训练 train_x = train_x.reshape(-1, 1, 18).to(torch.float32) train_y = train_y.reshape(-1, 1, 1).to(torch.float32) dataset = TensorDataset(train_x,train_y) train_loader = DataLoader(dataset = dataset, batch_size =512, shuffle =True,num_workers=0) for e in range(100): for i,data in enumerate(train_loader): #pytorch中tensor(张量)只能在CPU上运算,(variable)变量是可以用GPU加速计算 inputs,labels =data inputs,labels = Variable(inputs), Variable(labels) # var_x = Variable(train_x) # var_y = Variable(train_y) # 前向传播 out = model(inputs) loss = criterion(out, labels) # # loss=loss.clone().detach().requires_grad_() # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() if (e + 1) % 1 == 0: # 每 10次输出结果 print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.item())) model = model.eval() # 转换成测试模式 data_X = x_test.reshape(-1, 1, 180) data_X = torch.from_numpy(data_X).to(torch.float32) var_data = Variable(data_X) pred_test = model(var_data) # 测试集的预测结果 pred_test = pred_test.view(-1).data.numpy() pred=pred_test.round() print(pred) # 改变输出的格式 auc = roc_auc_score(y_test, pred_test) tn, fp, fn, tp = confusion_matrix(y_test, pred).ravel() f1, acc = f1_score(y_test, pred), accuracy_score(y_test, pred) print(auc) fpr, tpr, threshold = metrics.roc_curve(y_test, pred) roc_auc = metrics.auc(fpr, tpr) plt.figure(figsize=(6,6)) plt.title('Validation ROC') plt.plot(fpr, tpr, 'b', label='Val AUC = %0.3f' % roc_auc) plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('True Positive Rate') plt.xlabel('False Positive Rate') plt.show()
LSTM代码
最新推荐文章于 2023-08-02 23:24:49 发布