Python 不同模型的训练精度不同,但测试精度相同

Python 不同模型的训练精度不同,但测试精度相同,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在开发一个深度学习分类器-2类。我正在使用的数据集是不平衡的。我做了下采样来解决同样的问题。然后,我创建了两个班级的小样本数据,并创建了一个深度学习模型,如下所示: dl_model = Sequential() n_cols = X_train.shape[1] dl_model.add(Dense(1024, activation='relu', input_shape=(n_cols,))) dl_model.add(Dense(512, activation='relu')) d

我正在开发一个深度学习分类器-2类。我正在使用的数据集是不平衡的。我做了下采样来解决同样的问题。然后,我创建了两个班级的小样本数据,并创建了一个深度学习模型,如下所示:

dl_model = Sequential()

n_cols = X_train.shape[1]

dl_model.add(Dense(1024, activation='relu', input_shape=(n_cols,)))
dl_model.add(Dense(512, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(128, activation='relu'))
dl_model.add(Dense(64, activation='relu'))
dl_model.add(Dense(2, activation='softmax'))

adam= optimizers.Adam(lr=0.001)

dl_model.compile(optimizer=adam, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

early_stopping_monitor = EarlyStopping(patience=3)

dl_model.fit(X_train, y_train, epochs=10, validation_split=0.2, batch_size=1000,callbacks=[early_stopping_monitor], shuffle=True)

model_json = dl_model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)

dl_model.save_weights("model.h5")
sc = MinMaxScaler()
X = sc.fit_transform(X)

json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("model.h5")

loaded_model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
score = loaded_model.evaluate(X, y, verbose=0)
print("Deep learning accuracy %s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
对于不同的超参数调整,我得到如下结果:

型号1-
列车损失:7.7971-列车附件:0.5160-车辆附件:9.6992-车辆附件:0.3982

型号2-
列车损失:2.8257-列车附件:0.8201-车辆附件:2.9312-车辆附件:0.8160

型号3-
列车损失:3.1887-列车附件:0.8002-车辆附件:3.5195-车辆附件:0.7808

我保存每个模型,然后将其加载到不同的文件中,在该文件中,我将模型应用于整个数据集,并按如下方式计算度量:

dl_model = Sequential()

n_cols = X_train.shape[1]

dl_model.add(Dense(1024, activation='relu', input_shape=(n_cols,)))
dl_model.add(Dense(512, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(128, activation='relu'))
dl_model.add(Dense(64, activation='relu'))
dl_model.add(Dense(2, activation='softmax'))

adam= optimizers.Adam(lr=0.001)

dl_model.compile(optimizer=adam, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

early_stopping_monitor = EarlyStopping(patience=3)

dl_model.fit(X_train, y_train, epochs=10, validation_split=0.2, batch_size=1000,callbacks=[early_stopping_monitor], shuffle=True)

model_json = dl_model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)

dl_model.save_weights("model.h5")
sc = MinMaxScaler()
X = sc.fit_transform(X)

json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("model.h5")

loaded_model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
score = loaded_model.evaluate(X, y, verbose=0)
print("Deep learning accuracy %s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
上述三种模型的精确度都相同。即使是相同的混淆矩阵。原因可能是什么?这三个模型是否应该给出不同的结果,因为它们具有不同的训练精度/指标

更新:

加载任何模型时,我得到了与以下相同的精确度
97.82%
和混淆矩阵:

[[143369      0]

 [  2958      0]]


这里的问题是,你训练的所有神经网络都不能正确地学习第二类,即代表性较差的一类

由于模型_1、模型_2或模型_3均无法区分类别1和类别2,因此,三者都知道识别类别1,但无法识别类别2,因此测试集的精确度是相同的。换句话说,当您在测试集上进行测试时,结果是相同的,而不管您在培训期间看到的差异如何

从您在此处显示的混淆矩阵可以很容易地推断出此观察结果

假设您不知道上述观察结果。让我们做一些简单的数学:

  • 143369+2958=146327
  • (143369/146327)*100=97.97%(这比您报告的准确度略高,但在相同的范围内——微小的差异源于
    keras中的
    evaluate\u分数
您还可以从这一点(不仅在视觉上看到您没有第2类的TP(真正的积极因素))推断出您有问题

让我们现在着手解决这个问题

由于我们提到了这一观察结果,您必须采取以下措施来解决此问题(或将其中一些措施结合起来):

首先,从较低的学习率开始(0.0001是一个更好的开始选择)

其次,为了获得良好的模型,请参考以下程序:

  • 卸下
    提前停止(耐心=3)
  • 根据与准确性不同的度量标准保存最佳模型(例如F1分数)
  • 在训练时降低学习率(减少高原)。您可以使用以下回调,它比EarlyStoping更适合您的情况:
  • 使用数据集扩展。处理不平衡数据集的最佳方法是使用过采样。您可以通过在少数类中添加更多示例来平衡类的支持,而不是对表现良好的类进行采样,从而减少数据集的差异

  • 加载结果后是否介意分享?是否会使用不同的文件加载每个模型?“只是为了确定吗?”Eliethesaiyan,当然。更新了post.huum,看起来像wied,你能试试
    model.save(“model.h5”)
    吗,因为它保存了重量和架构,并使用
    load\u model
    加载,看看结果是否相同?我已经获得了数据,所以我无法获得更多的少数族裔数据。但我会尝试其他选项。很好,没问题。我相信应用1+2+3将使您获得更好的结果。好的luck@kruparulz14请你也投票表决我的答案,因为它解决了你的问题,谢谢。