相同Keras型号的精度低于AUC&数据

时间:2018-06-05 13:49:10

标签: python machine-learning scikit-learn keras classification

我有一个奇怪的Keras分类行为。

使用交叉验证与保持集时,我的准确度不同。

2相同的模型,但评估方法不同:

  • Model1使用10-Kfold交叉验证(达到0.98平均AUC和最低AUC 0.89)。
  • Model2使用hold out set(Accuracy 0.82)

我期望模型2的最差精确度是最低折叠精度(0.89不是0.82)。

小尺寸的数据~10k x 13

Kfold:10倍

模型1:

def create_baseline():
    # create model
    model = models.Sequential()
    model.add(layers.Dense(64, input_dim=set_1.iloc[:,0:-1].shape[1], activation='relu'))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

这是我的代码的重要部分(其余部分与绘制ROC有关):

注意:无论是否有标准化,我都尝试了

estimators = []
estimators.append(('standardize', MinMaxScaler()))
estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, nb_epoch=1000, batch_size=1000, verbose=0)))
pipeline = Pipeline(estimators)
cv = StratifiedKFold(n_splits=10)
classifier = pipeline
mean_tpr = 0.0
mean_fpr = np.linspace(0, 1, 100)

colors = cycle(['cyan', 'indigo', 'seagreen', 'yellow', 'blue', 'darkorange'])
lw = 2
i = 0
for (train, test), color in zip(cv.split(X, y), colors):
    classifier.fit(X[train], y[train])
    probas_ = classifier.predict_proba(X[test])
    fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
    mean_tpr += interp(mean_fpr, fpr, tpr)
    mean_tpr[0] = 0.0
    roc_auc = auc(fpr, tpr)
    plt.plot(fpr, tpr, lw=lw, color=color,
             label='ROC fold %d (area = %0.2f)' % (i, roc_auc))

    i += 1

输出: enter image description here

如你所见,我有.98 averag ROC。

问题:

模型2:

std = MinMaxScaler()
X_norm = std.fit_transform(X)
X_train_norm, X_test_norm, y_train_norm, y_test_norm = train_test_split(X_norm, y, test_size=0.1, random_state=5)

Keras模型

model_2 = models.Sequential()
model_2.add(layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
model_2.add(layers.Dense(64, activation='relu'))
model_2.add(layers.Dense(1, activation='sigmoid'))
model_2.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])

运行模型:

history = model_2.fit(X_train_norm,
y_train_norm,
epochs=1000,
batch_size=1000,
validation_data=(X_test_norm, y_test_norm))

结果(最后一次迭代):

8988/8988 [==============================] - 0s - loss: 0.3517 - acc: 0.8249 - val_loss: 0.3701 - val_acc: 0.7954
Epoch 997/1000
8988/8988 [==============================] - 0s - loss: 0.3516 - acc: 0.8238 - val_loss: 0.3699 - val_acc: 0.8059
Epoch 998/1000
8988/8988 [==============================] - 0s - loss: 0.3516 - acc: 0.8250 - val_loss: 0.3694 - val_acc: 0.8038
Epoch 999/1000
8988/8988 [==============================] - 0s - loss: 0.3512 - acc: 0.8241 - val_loss: 0.3692 - val_acc: 0.7975
Epoch 1000/1000
8988/8988 [==============================] - 0s - loss: 0.3504 - acc: 0.8247 - val_loss: 0.3696 - val_acc: 0.7975

为什么model2的性能低于model1?

注意: - 相同的数据,类型的keras模型和种子,但结果不同! - 我做了多次测试,有没有标准化和使用相同和不同的种子,我仍然有同样的问题。 - 我明白我可以使用更简单的模型,但我的问题是使用Keras分类器。

如果我做错了,请纠正我。

1 个答案:

答案 0 :(得分:3)

你似乎有点困惑......

  

为什么model2的性能低于model1?

不是;确切地说,结果中没有任何内容表明它更低或更高。

  

2相同的模型,但评估方法不同

您不仅使用不同的评估方法(CV与验证集),还使用不同的指标:比较ROC曲线下的面积,即AUC(模型1)的准确性(模型2) )就像比较苹果和橙子 ......

这些指标不仅不同,它们从根本上不同,并且用于完全不同的目的:

  • 准确性隐含地应用于计算概率的阈值;粗略地说,对于二进制分类,当计算的样本概率高于该阈值时,样本被分类为1,否则它被分类为0。在应用此阈值后计算准确度,结果为01(我的this answer详细说明了此过程)。通常(在这种情况下),此阈值隐式设置为0.5。

  • ROC曲线(和AUC)不涉及最终的"硬"分类(0/1),但是前一阶段,即模型给出的计算概率,它们实际上给出了在所有可能的阈值上平均的二元分类器的聚合性能。因此,ROC& AUC对最终部署的模型几乎没有什么可说的,它总是包含上面提到的决策阈值,关于哪个选择的阈值ROC曲线本身什么也没说(请参阅here以获得更详细的说明)。

    < / LI>

更新(在评论中进行了长时间的讨论之后,遗憾的是没有帮助澄清事情):

为了说服自己案例如我所解释的那样,尝试执行您的模型1简历,但报告准确性而不是ROC;这将恢复所有其他相同的条件,这是此类调查所必需的。您会发现准确性确实与您的模型2相当。

  

如果我做错了,请纠正我。

你不能说我没有尝试......