前提・実現したいこと
機械学習初心者なのでいろいろとネットに上がっているソースコードをいろいろと試しています。今現在はpyTorchを用いて機械学習の勉強をしています。
ソースコード中の「評価指標の表示」の項目にてscikit-learnのclassification_reportを用いようとしましたが、y_predの配列がTrueとFalseの二値に変わっていたため、コード内の一番最後のprintメソッドに対して以下のようなエラーコードが発生していました。replaceやassignなどのメソッドを用いてTrueとFalseの値を変更しようとしましたがエラーがでて動きませんでした。
どうすればy_predの配列の中身をTrueとFalseから実数値に変えられるでしょうか。もしくはこのコードに書いてある方法以外にy_predを変換できる方法はありますでしょうか
発生している問題・エラーメッセージ
ValueError: Classification metrics can't handle a mix of continuous and binary targets
該当のソースコード
Python
1import torch 2import os 3import numpy as np 4import pandas as pd 5from tqdm import tqdm 6import seaborn as sns 7from pylab import rcParams 8import matplotlib.pyplot as plt 9from matplotlib import rc 10from sklearn.model_selection import train_test_split 11from sklearn.metrics import confusion_matrix, classification_report 12from torch import nn, optim 13import torch.nn.functional as F 14 15RANDOM_SEED = 42 16np.random.seed(RANDOM_SEED) 17torch.manual_seed(RANDOM_SEED) 18 19df = pd.read_csv("./Desktop/work_chem/descriptors_with_pIC50.csv") 20df = df.dropna(how='any') 21#X = df.drop("pIC50", axis=1) 22#X=X.drop(X.columns[np.isnan(X).any()], axis=1) 23#X=df.loc[:,['fr_pyridine','VSA_EState7','VSA_EState4','EState_VSA4','EState_VSA5','fr_unbrch_alkane','PEOE_VSA7','Chi1n','fr_aryl_methyl','fr_bicyclic']] 24X=df.loc[:,['MaxEStateIndex','MinEStateIndex','MaxAbsEStateIndex','MinAbsEStateIndex','qed','MolWt','HeavyAtomMolWt','ExactMolWt','NumValenceElectrons','FpDensityMorgan1']] 25Y = df["pIC50"] 26X = X.drop(X.columns[X.std() == 0], axis=1) # 標準偏差が 0 の特徴量 (記述子) を削除 27autoscaled_X = (X - X.mean()) / X.std() # オートスケーリング 28 29#Tensor変換 30X_train, X_test, Y_train, Y_test = train_test_split(autoscaled_X,Y,test_size=0.25,random_state=RANDOM_SEED) 31X_train = torch.from_numpy(X_train.to_numpy()).float() 32Y_train = torch.squeeze(torch.from_numpy(Y_train.to_numpy()).float()) 33X_test = torch.from_numpy(X_test.to_numpy()).float() 34Y_test = torch.squeeze(torch.from_numpy(Y_test.to_numpy()).float()) 35print(X_train.shape, Y_train.shape) 36print(X_test.shape, Y_test.shape) 37 38#モデル構築 39class Net(nn.Module): 40 def __init__(self,n_features): 41 super(Net, self).__init__() 42 self.fc1 = nn.Linear(n_features, 11) 43 self.fc2 = nn.Linear(11, 5) 44 self.fc3 = nn.Linear(5, 1) 45 46 def forward(self,x): 47 x = F.relu(self.fc1(x)) 48 x = F.relu(self.fc2(x)) 49 return torch.sigmoid(self.fc3(x)) 50 51net=Net(X_train.shape[1]) 52 53# 損失関数 54criterion = nn.BCELoss() 55# 最適化関数 56optimizer = optim.Adam(net.parameters(), lr=0.001) 57# 正解率の計算 58def calculate_accuracy(y_true, y_pred): 59 predicted = y_pred.ge(.5).view(-1) 60 return (y_true == predicted).sum().float() / len(y_true) 61 62def round_tensor(t, decimal_places=3): 63 return round(t.item(), decimal_places) 64 65# 学習 66for epoch in range(1000): 67 y_pred = net(X_train) 68 y_pred = torch.squeeze(y_pred) 69 train_loss = criterion(y_pred, Y_train) 70 if epoch % 100 == 0: 71 # 訓練データの正解率の計算 72 train_acc = calculate_accuracy(Y_train, y_pred) 73 74 # モデル 75 y_test_pred = net(X_test) 76 y_test_pred = torch.squeeze(y_test_pred) 77 78 # 損失関数の計算 79 test_loss = criterion(y_test_pred, Y_test) 80 81 # テストデータの正解率の計算 82 test_acc = calculate_accuracy(Y_test, y_test_pred) 83 84 # 出力 85 print(f'''epoch {epoch} 86 Train set - loss: {round_tensor(train_loss)}, accuracy: {round_tensor(train_acc)} 87 Test set - loss: {round_tensor(test_loss)}, accuracy: {round_tensor(test_acc)} 88 ''') 89 90 # 最適化 91 optimizer.zero_grad() 92 train_loss.backward() 93 optimizer.step() 94 95# モデルの保存 96MODEL_PATH = 'model.pth' 97torch.save(net, MODEL_PATH) 98# モデルの読み込み 99net = torch.load(MODEL_PATH) 100# 評価指標の表示 101classes = ['pIC50'] 102y_pred = net(X_test) 103y_pred = y_pred.ge(5).view(-1).cpu() 104Y_test = Y_test.cpu() 105print(Y_test) 106print(y_pred) 107print(classification_report(Y_test, y_pred, target_names=classes))
補足情報(FW/ツールのバージョンなど)
使用環境:Anaconda3
Jupyter notebook
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/05 06:47
2021/02/05 08:46