ケラスモデルの精度、F1、精度、再現率を取得する方法は?


20

バイナリKerasClassifierモデルの精度、再現率、F1スコアを計算したいのですが、解決策が見つかりません。

これが私の実際のコードです:

# Split dataset in train and test data 
X_train, X_test, Y_train, Y_test = train_test_split(normalized_X, Y, test_size=0.3, random_state=seed)

# Build the model
model = Sequential()
model.add(Dense(23, input_dim=45, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])


tensorboard = TensorBoard(log_dir="logs/{}".format(time.time()))

time_callback = TimeHistory()

# Fit the model
history = model.fit(X_train, Y_train, validation_split=0.3, epochs=200, batch_size=5, verbose=1, callbacks=[tensorboard, time_callback]) 

そして、新しいテストデータを予測して、次のような混同行列を取得します。

y_pred = model.predict(X_test)
y_pred =(y_pred>0.5)
list(y_pred)

cm = confusion_matrix(Y_test, y_pred)
print(cm)

しかし、精度スコア、F1スコア、精度、再現率を取得するための解決策はありますか?(複雑でない場合、交差検証スコアもこの回答には必要ありません)

助けてくれてありがとう!

回答:


19

メトリックはKerasコアから削除されました。手動で計算する必要があります。彼らは2.0バージョンでそれらを削除しました。これらのメトリックはすべてグローバルメトリックですが、Kerasはバッチで動作します。その結果、役立つよりも誤解を招く可能性があります。

ただし、本当に必要な場合は、次のようにすることができます

from keras import backend as K

def recall_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1_m(y_true, y_pred):
    precision = precision_m(y_true, y_pred)
    recall = recall_m(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc',f1_m,precision_m, recall_m])

# fit the model
history = model.fit(Xtrain, ytrain, validation_split=0.3, epochs=10, verbose=0)

# evaluate the model
loss, accuracy, f1_score, precision, recall = model.evaluate(Xtest, ytest, verbose=0)

それらが誤解を招く可能性がある場合、Kerasのモデルを評価する方法は?
ZelelB

1
Kerasは各バッチの最後にこれらのメトリックを計算するため、「実際の」メトリックから異なる結果を得る可能性があります。別の方法は、トレーニングとテストでデータセットを分割し、テストパーツを使用して結果を予測することです。次に、実際のラベルを知っているので、精度を計算して手動で呼び戻します。
Tasos

タソ、このSOの質問に回答を再投稿することをお勧めします乾杯、イラクリス
砂漠の飛行士

申し訳ありませんが、それが閉じられているのを見ました:(
desertnaut

なぜこれが私のための検証に取り組んでいないのですか?トレーニングには問題ありません。
ロドリゴルイス

12

scikit-learn分類レポートを使用できます。ラベルを数値またはバイナリ形式に変換するには、scikit-learnラベルエンコーダーをご覧ください。

from sklearn.metrics import classification_report

y_pred = model.predict(x_test, batch_size=64, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)

print(classification_report(y_test, y_pred_bool))

これはあなたに与えます(scikit-learnの例からコピーされた出力):

             precision  recall   f1-score    support

 class 0       0.50      1.00      0.67         1
 class 1       0.00      0.00      0.00         1
 class 2       1.00      0.67      0.80         3

2
これは私が使うもので、シンプルで効果的です。
マシュー

2

以下のように試すこともできます。

from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix
y_pred1 = model.predict(X_test)
y_pred = np.argmax(y_pred1, axis=1)

# Print f1, precision, and recall scores
print(precision_score(y_test, y_pred , average="macro"))
print(recall_score(y_test, y_pred , average="macro"))
print(f1_score(y_test, y_pred , average="macro"))

0

これを試してください:https : //scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html Y_test、y_predをパラメーターとして使用します。


私はこれを試しました:model.recision_recall_fscore_support(Y_test、y_pred、average = 'micro')と実行時にこのエラーが発生しました:AttributeError: 'Sequential' object has no attribute 'recision_recall_fscore_support'
ZelelB

model.recision_recall_fscore_support()を指定する必要はなく、単にrecision_recall_fscore_support(Y_test、y_pred、average = 'micro')( "model。"なし)で、正しいインポートがあることを確認します:sklearn.metrics import precision_recall_fscore_supportから
ヴィアチェスラフコミサレンコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.