混淆矩阵 - ValueError:发现样本数量不一致的输入变量

Posted

技术标签:

【中文标题】混淆矩阵 - ValueError:发现样本数量不一致的输入变量【英文标题】:Confusion Matrix - ValueError: Found input variables with inconsistent numbers of samples 【发布时间】:2021-02-16 01:40:59 【问题描述】:

为了重现性,我使用的训练和验证数据集是shared here

validation_dataset.csvtraining_dataset.csv 的基本事实。

我在下面所做的是将数据集输入一个简单的 CNN 层,该层提取图像的有用特征并将其作为一维输入 LSTM 网络进行分类。


from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation
from keras.layers.convolutional import Conv1D
from keras.layers import LSTM
from keras.layers.convolutional import MaxPooling1D
from keras.layers import TimeDistributed
from keras.layers import Dropout
from keras import optimizers
from keras.callbacks import EarlyStopping
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
from confusion_matrix import plot_confusion_matrix
import scikitplot as skplt
from numpy import genfromtxt

train_set = genfromtxt('data/train/training_dataset.csv', delimiter=',') 
validation_set = genfromtxt('data/validation/validation_dataset.csv', delimiter=',') 


train_set = train_set[..., None] 
validation_set = validation_set[..., None]


X_train, X_test, y_train, y_test = train_test_split(train_set, validation_set, test_size=0.30, random_state=0)





    
batch_size=16
epochs=5

# Create the model
    
model = Sequential()

model.add(Conv1D(filters=5, kernel_size=3, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.5))
model.add(LSTM(10))

model.add(Dense(1,kernel_initializer='random_normal'))
model.add(Activation('relu'))

adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0)
sgd = optimizers.SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(optimizer=adam, loss='mean_squared_error', metrics=['mae', 'mape', 'mean_squared_error', 'acc'])



model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs)



print(model.summary())


# Evaluate the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

skplt.metrics.plot_confusion_matrix(y_test, scores, x_tick_rotation=50, title=' ', normalize=True)

最后,我想绘制模型的混淆矩阵

skplt.metrics.plot_confusion_matrix(y_test, scores, x_tick_rotation=50, title=' ', normalize=True)

但是,它会引发错误ValueError: Found input variables with inconsistent numbers of samples: [5394, 5]

我们如何解决这个错误?

【问题讨论】:

【参考方案1】:

skplt.metrics.plot_confusion_matrix 的第二个参数必须是预测标签(请参阅https://scikit-plot.readthedocs.io/en/stable/metrics.html)。但是,您传递了scores,它不包含预测的标签。

解决办法是:

y_pred = model.predict(X_test)
skplt.metrics.plot_confusion_matrix(y_test,
                                    y_pred,
                                    x_tick_rotation=50,
                                    title=' ',
                                    normalize=True)

【讨论】:

谢谢你,简森。但这会引发此错误ValueError: Classification metrics can't handle a mix of unknown and continuous targets 然后您应该检查y_predy_test 的形状。 y_pred 在你的情况下必须是 (batch_size, )(batch_size, 1) 的形状,因为你有一个 Dense 层,最后有 1 单元。但是,y_test 可能是 one-hot 编码目标。在这种情况下,您可以在之前执行y_test = numpy.argmax(y_test, axis=1) 谢谢。制作y_test = numpy.argmax(y_test, axis=1) 后,y_predy_test 的形状相同。但是,我仍然遇到同样的错误:ValueError: Classification metrics can't handle a mix of multiclass and continuous targets 嗯。据我所知,这不应该发生。 skplt.metrics.plot_confusion_matrix(y_test, y_test, normalize=True) 有效吗?您也可以使用skplt.metrics.plot_confusion_matrix(y_pred, y_pred, normalize=True) 进行测试。两者都应该产生一个主对角线上的混淆矩阵。 skplt.metrics.plot_confusion_matrix(y_test, y_test, normalize=True)正在绘制混淆矩阵,但不是我想要的那种情节。 skplt.metrics.plot_confusion_matrix(y_pred, y_pred, normalize=True)给出这个错误:ValueError: continuous is not supported【参考方案2】:

几天前我正在研究 SVM,当我尝试绘制混淆矩阵时,以下代码行对我有用。

predicted=model.predict(X_test) #predicted output
cm=metrics.confusion_matrix(y_test, predicted) 
df_cm = pd.DataFrame(cm, range(2), range(2))
sns.set(font_scale=1.4) 
sns.heatmap(df_cm, annot=True, annot_kws="size": 16) 
plt.title('CONFUSION MATRIX ',fontdict='fontsize': 14, 'fontweight': 'bold')
plt.show()

【讨论】:

@Marcus 希望能帮到你。 谢谢 Hamza,但它给出了一个错误:ValueError: Classification metrics can't handle a mix of unknown and continuous targets

以上是关于混淆矩阵 - ValueError:发现样本数量不一致的输入变量的主要内容,如果未能解决你的问题,请参考以下文章

混淆矩阵 - 样本数量不一致的变量[重复]

Sci-kit Learn Confusion Matrix:发现样本数量不一致的输入变量

混淆矩阵值错误:找到样本数量不一致的输入变量:[3, 360]

ValueError:发现样本数量不一致的输入变量:[143, 426]

ValueError:发现样本数量不一致的数组 [6 1786]

ValueError:发现样本数量不一致的输入变量:[100, 300]