我调整了我的keras模型,并获得了良好的logloss和准确性结果。
测试损失:0.205 测试精度:0.938
但是,当我使用predict_proba对保持数据进行预测时,这令人失望(对数损失很高)。请帮忙。这是我的第一个keras模型。
# resample data with SMOTEEN
smoteen = SMOTEENN(random_state=42) # ratio={0:438, 1:400},
X_res, y_res = smoteen.fit_resample(X, y)
X_train, X_test, y_train, y_test = train_test_split(X_transform,y_res,
test_size = 0.30, random_state=42, stratify=y_res)
# Save the number of columns in predictors: n_cols
n_cols = X_train.shape[1]
input_shape = (n_cols,)
# create model
def create_model(input_shape=input_shape, optimizer=Adam(lr=0.001)),
kernel_initializer=keras.initializers.RandomUniform()):
model = Sequential()#
model.add(Dense(500,
activation='relu',kernel_initializer=kernel_initializer,
input_shape=input_shape,))
model.add(BatchNormalization())
model.add(Dropout(.5))
model.add(Dense(950,activation='relu', input_shape=input_shape,
kernel_initializer=kernel_initializer))
model.add(BatchNormalization())
kernel_regularizer=regularizers.l2(0.01),
model.add(Dropout(.25))
model.add(Dense(950,activation='relu', input_shape=input_shape,
kernel_initializer=kernel_initializer))
model.add(BatchNormalization())
kernel_regularizer=regularizers.l2(0.01),
model.add(Dropout(.25))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer=optimizer, metrics=
['accuracy'] )
return model
model = create_model()
batch_size = 32
epochs = 500
history=model.fit(X_train, y_train, batch_size= batch_size,
epochs=epochs, verbose=2, validation_data=(X_test, y_test),
validation_split=0.2,)
scores=model.evaluate(X_test,y_test)
print('\n%s: %.2f%%' % (model.metrics_names[1], scores[1]*100))
predictions = model.predict_proba(holdout_1_transform, batch_size=32)
答案 0 :(得分:0)
这听起来像是个过拟合的问题。我认为这里回答的范围太广了,但是在类似情况下通常可以尝试几种方法。
如果我做对了,您的测试数据大约是所有数据的30%(test_size = 0.30
)。如果您有足够的数据,比如说成千上万的样本,那么仅使用1%或2%,甚至更少的数据就足够了。
我还注意到您接受了100个时期的训练。从“损失”图表来看,尝试训练10或20个时期-训练和验证的性能应稍差一些,但可以帮助保持数据的性能。
同样,这些只是假设和猜测。您要查找的术语是overfit
。