PythonのNNでSHAP値を表示したい

Python

1#固定2import numpy as np 3import matplotlib.pyplot as plt 4import torch 5import torch.nn as nn 6import torch.optim as optim 7import pandas as pd 8from sklearn.model_selection import train_test_split 9import torchvision.datasets as datasets 10import torchvision.transforms as transforms 11from torch.utils.data import DataLoader 12import pandas as pd 13import numpy as np 14 15device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')16print(f'使用デバイス:{device}')17 18df = pd.read_excel("MyFile"')19df = df.drop('[kg/m³]',axis=1)20 21#変数22n_input = 1623n_hidden1 = 12824n_hidden2 = 12825n_output = 11026num_epoch = 2027lr = 0.0128batch_size = 1029 30 31df_test = df.sample(100, random_state= 1).copy()32df_train = df.drop(df_test.index).copy()33 34x = df_train.iloc[:,0:16].values 35t = df_train['Strength[N/mm²]'].values 36#torchのtensor型に変換37 38x = torch.tensor(x, dtype=torch.float32).cpu()39t = torch.tensor(t, dtype=torch.int64).cpu()40 41#以下test用データ分割42x_test = df_test.iloc[:, 0:16].values 43t_test = df_test['Strength[N/mm²]'].values 44class Net(nn.Module):45 def __init__(self, n_input, n_output, n_hidden1, n_hidden2):46 super().__init__()47 self.l1 = nn.Linear(n_input, n_hidden1)48 self.l2 = nn.Linear(n_hidden1, n_hidden2)49 self.l3 = nn.Linear(n_hidden2, n_output)50 self.relu = nn.ReLU()51 52 def forward(self, x):53 x1 = self.l1(x)54 x2 = self.relu(x1)55 x2 = x2.clone() # クローン操作を追加56 x3 = self.l2(x2)57 x4 = self.relu(x3)58 x4 = x4.clone() # 同様にクローン操作を追加59 x5 = self.l3(x4)60 return x5 61 62net = Net(n_input, n_output, n_hidden1, n_hidden2).to(device)63criterion = nn.CrossEntropyLoss()64optimizer = optim.SGD(net.parameters(), lr = lr)65history = np.zeros((0,5))66 67for epoch in range(num_epoch):68 dataset = torch.utils.data.TensorDataset(x,t)69 n_train = int(len(dataset)*0.7)70 n_val = len(dataset) - n_train 71 72 train, val = torch.utils.data.random_split(dataset,(n_train, n_val))73 74 train_loader = torch.utils.data.DataLoader(train, batch_size = 10, shuffle = True, drop_last=True)75 val_loader = torch.utils.data.DataLoader(val, batch_size)76 77 train_acc, train_loss = 0,0 #for文の外で値の初期化78 val_acc, val_loss = 0,079 n_train, n_val = 0,080 81 for inputs, labels in train_loader:82 n_train += len(labels)83 inputs = inputs.to(device)84 labels = labels.to(device)85 86 optimizer.zero_grad() #勾配を初期化 しないと蓄積されてしまう87 outputs = net(inputs) #ニューラルネットワークを使って順伝播を実行88 loss = criterion(outputs, labels) #損失関数で計算89 loss.backward() #逆伝播90 91 #パラーメータの更新・修正92 optimizer.step()93 predicted = torch.max(outputs, 1)[1] #ニューラルネットワークのなかで、最も回答の予測の可能性が高いものを選ぶ94 95 train_loss +=loss.item() #予測値をTensor型から計算可能な数値に変換96 train_acc +=(predicted == labels).sum().item() #予測値と正解を比較し、正解ならば足し合わせて整数に変換97 98 for inputs_val, labels_val in val_loader: #検証用データのソースコード99 n_val +=len(labels_val)100 101 inputs_val = inputs_val.to(device)102 labels_val = labels_val.to(device)103 104 outputs_val = net(inputs_val)105 106 loss_val = criterion(outputs_val,labels_val)107 108 predicted_val = torch.max(outputs_val, 1)[1] #ニューラルネットワークのなかで、最も回答の予測の可能性が高いものを選ぶ109 110 val_loss +=loss_val.item() #予測値をTensor型から計算可能な数値に変換111 val_acc +=(predicted_val == labels_val).sum().item() #予測値と正解を比較し、正解ならば足し合わせて整数に変換112 113 train_acc = train_acc / n_train 114 val_acc = val_acc / n_val 115 train_loss = train_loss * batch_size / n_train 116 val_loss = val_loss * batch_size / n_val 117 118 items = np.array([epoch+1, train_loss, train_acc, val_loss, val_acc])119 history = np.vstack((history,items))120

コメントを投稿

0 コメント