機械学習の勉強をしているものです.
python, keras(tensorflow)を使った多クラス分類のプログラムを作成しております.
概ねプログラムが完成し,各種精度を算出したいと考えた際,
https://qiita.com/shiita0903/items/838d50598cc28766f84e
こちらのサイトを見つけ,ソースコードを参考にしました.
これを使い単一のファイルについて各種精度を出せたので,次はディレクトリ内の各々のファイルについて先頭のものから順に読み込み,それぞれのファイルごとの精度を算出しようとしました.
しかし,先頭のファイルの精度を算出し,次のファイルの学習が開始される前に以下のメッセージが表示されプログラムがストップしてしまいます.
ValueError: ('Could not interpret metric function identifier:', 0.XXXX(数値))
なぜ単一のファイルの精度算出ではできfor文ループさせようとするとエラーが出てしまうのか,分かる方がいればご教示頂ければ幸いです.
※ソースコードは一部は省略,修正して載せております.
該当のソースコード
Python3
1# -*- coding: utf-8 -*- 2 3import keras.backend as K 4import os 5import pandas as pd 6from sklearn.model_selection import train_test_split 7from keras.models import Sequential 8from keras.layers.core import Dense, Activation 9from keras.utils import np_utils 10from sklearn import preprocessing 11 12 13# precision, recall, f-measureを定義する 14def normalize_y_pred(y_pred): 15 return K.one_hot(K.argmax(y_pred), y_pred.shape[-1]) 16 17 18def class_true_positive(class_label, y_true, y_pred): 19 y_pred = normalize_y_pred(y_pred) 20 return K.cast( 21 K.equal(y_true[:, class_label] + y_pred[:, class_label], 2), 22 K.floatx()) 23 24 25def true_positive(y_true, y_pred): 26 y_pred = normalize_y_pred(y_pred) 27 return K.cast(K.equal(y_true + y_pred, 2), K.floatx()) 28 29 30def class_precision(class_label, y_true, y_pred): 31 y_pred = normalize_y_pred(y_pred) 32 return K.sum(class_true_positive(class_label, y_true, y_pred)) / ( 33 K.sum(y_pred[:, class_label]) + K.epsilon()) 34 35 36def micro_precision(y_true, y_pred): 37 y_pred = normalize_y_pred(y_pred) 38 return K.sum(true_positive(y_true, y_pred)) / (K.sum(y_pred) + K.epsilon()) 39 40 41def macro_precision(y_true, y_pred): 42 class_count = y_pred.shape[-1] 43 return K.sum([class_precision(i, y_true, y_pred) for i in range(class_count)]) \ 44 / K.cast(class_count, K.floatx()) 45 46 47def class_recall(class_label, y_true, y_pred): 48 return K.sum(class_true_positive(class_label, y_true, y_pred)) / ( 49 K.sum(y_true[:, class_label]) + K.epsilon()) 50 51 52def micro_recall(y_true, y_pred): 53 return K.sum(true_positive(y_true, y_pred)) / (K.sum(y_true) + K.epsilon()) 54 55 56def macro_recall(y_true, y_pred): 57 class_count = y_pred.shape[-1] 58 return K.sum([class_recall(i, y_true, y_pred) for i in range(class_count)]) \ 59 / K.cast(class_count, K.floatx()) 60 61 62def class_f_measure(class_label, y_true, y_pred): 63 precision = class_precision(class_label, y_true, y_pred) 64 recall = class_recall(class_label, y_true, y_pred) 65 return (2 * precision * recall) / (precision + recall + K.epsilon()) 66 67 68def micro_f_measure(y_true, y_pred): 69 precision = micro_precision(y_true, y_pred) 70 recall = micro_recall(y_true, y_pred) 71 return (2 * precision * recall) / (precision + recall + K.epsilon()) 72 73 74def macro_f_measure(y_true, y_pred): 75 precision = macro_precision(y_true, y_pred) 76 recall = macro_recall(y_true, y_pred) 77 return (2 * precision * recall) / (precision + recall + K.epsilon()) 78 79 80def build_multilayer_perceptron(): 81 """多層パーセプトロンモデルを構築""" 82 model = Sequential() 83 model.add(Dense(16, input_shape=(12, ))) 84 model.add(Activation('relu')) 85 model.add(Dense(2)) 86 model.add(Activation('softmax')) 87 return model 88 89 90if __name__ == "__main__": 91 with open("result.csv", "w") as f: 92 print("date,accuracy,precision,recall,f_measure", file=f) 93 94 for i in range(1, 32): 95 # ファイルが存在すれば読み込み,以下を実行する 96 if (os.path.exists( 97 os.path.join("data", "hoge", "20XX", "01", 98 "20XX010" + str(i) + ".txt")) 99 or os.path.exists( 100 os.path.join("data", "hoge", "20XX", "01", 101 "20XX01" + str(i) + ".txt"))): 102 if i < 10: 103 dataset = pd.read_csv( 104 os.path.join("data", "hoge", "20XX", "01", 105 "20XX010" + str(i) + ".txt"), 106 delim_whitespace=True) 107 else: 108 dataset = pd.read_csv( 109 os.path.join("data", "hoge", "20XX", "01", 110 "20XX01" + str(i) + ".txt"), 111 delim_whitespace=True) 112 113 # 説明変数,ターゲット変数を定義 114 X = dataset.iloc[:, [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]] 115 Y = dataset.iloc[:, 17] 116 117 # データの標準化 118 X = preprocessing.scale(X) 119 120 # ラベルをone-hot-encoding形式に変換 121 # 0 => [1, 0, 0] 122 # 1 => [0, 1, 0] 123 # 2 => [0, 0, 1] 124 Y = np_utils.to_categorical(Y) 125 126 # 訓練データとテストデータに分割 127 train_X, test_X, train_Y, test_Y = train_test_split( 128 X, Y, train_size=0.8, test_size=0.2) 129 130 # print(macro_precision) 131 # print(macro_recall) 132 # print(macro_f_measure) 133 134 # モデル構築 135 model = build_multilayer_perceptron() 136 model.compile( 137 optimizer='adam', 138 loss='categorical_crossentropy', 139 metrics=[ 140 'accuracy', macro_precision, macro_recall, macro_f_measure 141 ]) 142 143 # モデル訓練 144 model.fit(train_X, train_Y, epochs=1, batch_size=100, verbose=1) 145 146 # モデル評価 147 loss, accuracy, macro_precision, macro_recall, macro_f_measure = model.evaluate( 148 test_X, test_Y, verbose=0) 149 150 # print(macro_precision) 151 # print(macro_recall) 152 # print(macro_f_measure) 153 154 # 学習,評価結果を保存 155 with open("result.csv", "a") as f: 156 print( 157 "{0},{1},{2},{3},{4}".format( 158 str(i), accuracy, macro_precision, macro_recall, 159 macro_f_measure), 160 file=f)
エラー文が出て止まった際の箇所
metrics=[ 'accuracy', macro_precision, macro_recall, macro_f_measure ])
補足情報(FW/ツールのバージョンなど)
・Python 3.6.5
・Keras 2.2.4
・Tensorflow 1.11.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/14 07:11
2018/11/14 23:24
2018/11/15 01:26
2018/11/16 10:30
2018/11/16 10:37
2018/11/17 00:42