tensorflow計算混同マトリクスと各種評価指標を実現
2140 ワード
1 tf.confusion_matrix(y,pred_y,num_classes)
二分類を例にとると、混同行列が2*2の行列であり、実際のラベルがreal=[0,1,1,0,1]であれば、予測ラベルがpredit=[0,1,0,1]である
num_classesは分類数で、必ずこれを設定します!!!そうでない場合はデフォルトでNoneテストimport numpy as np
import tensorflow as tf
y=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
y=tf.convert_to_tensor(y)
predict=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
predict=tf.convert_to_tensor(predict)
confusion_matrix=tf.confusion_matrix(tf.argmax(y,1),tf.argmax(predict,1),num_classes=2)
with tf.Session() as sess: #
matrix=sess.run(confusion_matrix)
print(matrix)
# [[5 0] [0 0]]
# num_classes=2 [[5]]
二評価指標
混同行列が得られると,TP,TN,FP,FNが得られる.各種の指標の公式によって求めることができますdef evaluate(confusion_metrics):
TP=confusion_metrics[0][0]
FP=confusion_metrics[0][1]
FN=confusion_metrics[1][0]
TN=confusion_metrics[1][1]
ACC=(TP+TN)/(TP+TN+FP+FN)
SEN=TP/(TP+FN)
SPE=TN/(TN+FP)
return ACC,SEN,SPE
三実際の訓練
実際の訓練では,我々のデータはすべてバッチでネットワークに入れて訓練するので,2*2の0行列を初期化し,混同行列を一度に計算して加算することができる. real=tf.argmax(y,1) #one-hot
pred=tf.argmax(predict,1)
confusion_matrix=tf.confusion_matrix(real,pred,num_classes=2)
with tf.Session() as sess: #
sess.run(tf.global_variables_initializer())
avg_cost=0.
all_matrix=np.zeros([2,2])
for i in range(300):
_x,_y=sess.run([train_x,train_y])
matrix=sess.run([confusion_matrix],feed_dict={x:_x,y:_y})
all_matrix+=matrix
avg_cost+=cost/display_step
if (i+1)%display_step==0: # display_step cost 0
train_acc,train_sen,train_spe=evaluate(all_matrix)
print("step:%d,train_acc:%s,train_spe:%s,train_sen:%s"%(i+1,str(train_acc),str(train_spe),str(train_sen)))
avg_cost=0
all_matrix=np.zeros([2,2])
注意:matrixはnumpyタイプなので、加減にはnpが必要です.zeros([2,2])を初期化する
import numpy as np
import tensorflow as tf
y=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
y=tf.convert_to_tensor(y)
predict=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
predict=tf.convert_to_tensor(predict)
confusion_matrix=tf.confusion_matrix(tf.argmax(y,1),tf.argmax(predict,1),num_classes=2)
with tf.Session() as sess: #
matrix=sess.run(confusion_matrix)
print(matrix)
# [[5 0] [0 0]]
# num_classes=2 [[5]]
混同行列が得られると,TP,TN,FP,FNが得られる.各種の指標の公式によって求めることができます
def evaluate(confusion_metrics):
TP=confusion_metrics[0][0]
FP=confusion_metrics[0][1]
FN=confusion_metrics[1][0]
TN=confusion_metrics[1][1]
ACC=(TP+TN)/(TP+TN+FP+FN)
SEN=TP/(TP+FN)
SPE=TN/(TN+FP)
return ACC,SEN,SPE
三実際の訓練
実際の訓練では,我々のデータはすべてバッチでネットワークに入れて訓練するので,2*2の0行列を初期化し,混同行列を一度に計算して加算することができる. real=tf.argmax(y,1) #one-hot
pred=tf.argmax(predict,1)
confusion_matrix=tf.confusion_matrix(real,pred,num_classes=2)
with tf.Session() as sess: #
sess.run(tf.global_variables_initializer())
avg_cost=0.
all_matrix=np.zeros([2,2])
for i in range(300):
_x,_y=sess.run([train_x,train_y])
matrix=sess.run([confusion_matrix],feed_dict={x:_x,y:_y})
all_matrix+=matrix
avg_cost+=cost/display_step
if (i+1)%display_step==0: # display_step cost 0
train_acc,train_sen,train_spe=evaluate(all_matrix)
print("step:%d,train_acc:%s,train_spe:%s,train_sen:%s"%(i+1,str(train_acc),str(train_spe),str(train_sen)))
avg_cost=0
all_matrix=np.zeros([2,2])
注意:matrixはnumpyタイプなので、加減にはnpが必要です.zeros([2,2])を初期化する
real=tf.argmax(y,1) #one-hot
pred=tf.argmax(predict,1)
confusion_matrix=tf.confusion_matrix(real,pred,num_classes=2)
with tf.Session() as sess: #
sess.run(tf.global_variables_initializer())
avg_cost=0.
all_matrix=np.zeros([2,2])
for i in range(300):
_x,_y=sess.run([train_x,train_y])
matrix=sess.run([confusion_matrix],feed_dict={x:_x,y:_y})
all_matrix+=matrix
avg_cost+=cost/display_step
if (i+1)%display_step==0: # display_step cost 0
train_acc,train_sen,train_spe=evaluate(all_matrix)
print("step:%d,train_acc:%s,train_spe:%s,train_sen:%s"%(i+1,str(train_acc),str(train_spe),str(train_sen)))
avg_cost=0
all_matrix=np.zeros([2,2])