Keras二进制分类

时间:2018-12-26 19:08:22

标签: keras

我调整了我的keras模型,并获得了良好的logloss和准确性结果。

测试损失:0.205 测试精度:0.938

I have attached here the result

但是,当我使用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)

1 个答案:

答案 0 :(得分:0)

这听起来像是个过拟合的问题。我认为这里回答的范围太广了,但是在类似情况下通常可以尝试几种方法。

  • 获取更多培训数据
  • 退出(您已经拥有)
  • 早点停止培训

如果我做对了,您的测试数据大约是所有数据的30%(test_size = 0.30)。如果您有足够的数据,比如说成千上万的样本,那么仅使用1%或2%,甚至更少的数据就足够了。

我还注意到您接受了100个时期的训练。从“损失”图表来看,尝试训练10或20个时期-训练和验证的性能应稍差一些,但可以帮助保持数据的性能。

同样,这些只是假设和猜测。您要查找的术语是overfit