如何在python中为tensorflow中实现的模型创建混淆矩阵?

问题描述 投票:0回答:1

我正在使用 TensorFlow 在 Python 中训练模型,但我想打印模型预测数据(预测与实际)的混淆矩阵。我怎样才能做到这一点?到目前为止我的代码(不包括数据加载和预处理)如下:

from sklearn.preprocessing import LabelEncoder
Y = data.label
le = LabelEncoder()

Y = le.fit_transform(Y)


Y = Y.reshape(-1,1)

len(X)

sequences = list()
for line in X:
    # integer encode line
    encoded_seq = [char_index[char] for char in line]
    # store
    sequences.append(encoded_seq)



padded_inputs = tf.keras.preprocessing.sequence.pad_sequences(
    sequences, padding="pre")
print(padded_inputs)


ex = tf.keras.preprocessing.sequence.pad_sequences(sequences, padding="pre")
print(ex)


#And here is the train_test_split
X_train, X_test, y_train, y_test = train_test_split(padded_inputs, Y, test_size= 0.1, 
random_state = 0)

X_train

y_train = y_train.astype("int32")

y_train

X_train.shape

X_test

print(X_train.shape)
max_len = 19
max_words = 57

from tensorflow.keras.optimizers import RMSprop

def RNN():
    inputs = tf.keras.Input(name='inputs',shape=[max_len])
    layer = Embedding(max_words,19,input_length=max_len)(inputs)
    layer = LSTM(64)(layer)
    layer = Dense(256,name='FC1')(layer)
    layer = Activation('relu')(layer)
    layer = Dropout(0.5)(layer)
    layer = Dense(1,name='out_layer')(layer)
    layer = Activation('sigmoid')(layer)
    model = tf.keras.Model(inputs=inputs,outputs=layer)
    return model

model = RNN()
model.summary()
model.compile(loss='binary_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])

num_epochs = 40
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
history=model.fit(X_train, y_train,batch_size=128, epochs= num_epochs, validation_split=0.2, 
callbacks=[tensorboard_callback], verbose=2)



accr = model.evaluate(X_test,y_test)


print('Test set\nLoss: {:0.3f}\nAccuracy: {:0.3f}'.format(accr[0],accr[1]))

yhat = model.predict(X_test)

我尝试过使用: tf.math.confusion_matrix(labels,predictions,num_classes=None,weights=None,dtype=tf.dtypes.int32,name=None,但我不知道如何正确使用它这段代码。

python tensorflow confusion-matrix
1个回答
0
投票

由于您的模型正在输出概率(如最终的 sigmoid 激活函数所示),因此您首先需要将这些概率转换为二进制标签(0 或 1)。您可以使用阈值 0.5 将高于此阈值的所有内容分类为 1,将低于该阈值的所有内容分类为 0。

获得二进制预测后,您可以使用 tf.math.confusion_matrix 将它们与实际标签进行比较。

这是一个简短的例子:

import tensorflow as tf

yhat = model.predict(X_test)
yhat_binary = (yhat > 0.5).astype("int32")
conf_matrix = tf.math.confusion_matrix(y_test.reshape(-1), 
yhat_binary.reshape(-1))

tf.math.confusion_matrix 函数然后将这些预测 (yhat_binary) 与真实标签 (y_test) 进行比较。请注意,您需要将 y_test 和 yhat_binary 重塑为一维数组,因为 tf.math.confusion_matrix 需要平面数组!

© www.soinside.com 2019 - 2024. All rights reserved.