【发布时间】:2018-11-15 00:58:36
【问题描述】:
我有一个奇怪的 Keras 分类行为。
使用交叉验证与保留集时,我得到了不同的准确度。
2 个相同的模型,但具有不同的评估方法:
- Model1 使用 10-Kfold 交叉验证(达到 0.98 平均 AUC 和最低 AUC 0.89)。
- Model2 使用支持集(精度 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
如您所见,我的平均 ROC 为 0.98。
问题:
模型 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 分类器有关。
如果我做错了,请纠正我。
【问题讨论】:
-
好吧,我的回答可能听起来很愚蠢,但这不就是 K 折验证的本意吗? (即一种优化训练集和开发集之间分布的方法)。您将数据分成子集以在训练和开发之间分配的次数越多,您就越有可能获得人口的代表性分布(因此准确性更高)
-
我投票结束这个问题,因为这个问题在其前提下存在根本性的缺陷。它基于对两个无可比拟的指标的比较。数学联觉。这就像在问为什么红色听起来不像在鼓掌。
标签: python machine-learning scikit-learn keras classification