调整Keras的参数以提高模型准确性

时间:2019-07-19 06:18:34

标签: r keras deep-learning

我是一名生物学家,开始寻找通往深度学习世界的道路。因此,我阅读了许多书籍和在线教程。简而言之,我正在建立一个模型,在6500条记录的数据集中使用522个变量来预测R中的keras生成的二进制类。 该模式的主要代码如下:

model <- keras_model_sequential() 
model %>% 
  layer_dense(units = 256, activation = 'relu', input_shape = ncol(x_train),kernel_regularizer = regularizer_l2(0.001),) %>% 
  layer_dropout(rate = 0.4) %>% 
  layer_dense(units = 128, activation = 'relu',kernel_regularizer = regularizer_l2(0.001),) %>%
  layer_dropout(rate = 0.3) %>%
  layer_dense(units = 2, activation = 'sigmoid')

history <- model %>% compile(
  loss = 'binary_crossentropy',
  optimizer = 'adam',
  metrics = c('accuracy')
)

model %>% fit(
  x_train, y_train, 
  epochs = 50, 
  batch_size = 150,
  validation_split = 0.20
)

acc<-model %>% evaluate(x_test, y_test)

我已经调整了每层中的隐藏单位,批处理大小,时期,越来越低,但是我得到的精度却不能令人满意。具体来说,取决于我添加的隐藏单元的数量,训练精度很快达到了70-90%,但是在任何情况下,验证精度都不会超过30%。 当我将模型应用于预测测试集时,我得到了70%的准确性,但是问题是,当我进一步看混淆矩阵表时,该模型似乎只能预测1类(灵敏度为97%),为什么0的预测较差(特异性约为20%)。

我实际上使用带有mixOmics包的PLS-DA运行了相同的数据,结果相当不错。在测试集上,我的灵敏度,特异性和曲线下面积均> = 70%。

因此,在这种情况下,我不需要深度学习比PLS-DA更好,但我希望它应该在PLS-DA附近。

能给我一些建议,以便我朝正确的方向发展以改善深度学习模型。 我正在处理的训练和测试数据可以在这里获得: https://drive.google.com/file/d/1XFmTosHk5hZABFgJOHgQGLiP-DnbGHLv/view?usp=sharing https://drive.google.com/file/d/10viyKknQNolgCR45mEijF5RIxKqMK23a/view?usp=sharing

非常感谢, 何

1 个答案:

答案 0 :(得分:1)

我玩了一点您的数据...

Colab笔记本: https://colab.research.google.com/drive/1SpkNIxCp56iATSybLZO9OhYDlK-uFXVl

一个简单的线性回归使用sklearn.metrics.roc_auc_score给我0.63的测试数据的auc分数。就是这个简单的模型:

tf.set_random_seed(42)

model = keras.models.Sequential([
    keras.layers.Input(shape=(len(df_train.columns) - 1)),
    keras.layers.Dense(1, activation='sigmoid',
                       kernel_regularizer=keras.regularizers.l2(0.01))
])

model.compile(keras.optimizers.Adam(lr=0.0001), 'binary_crossentropy', metrics=['acc'])
model.summary()

通过使用“ relu”转换添加其他隐藏层似乎并没有改善。

例如,该模型:

tf.set_random_seed(42)

model = keras.models.Sequential([
    keras.layers.Input(shape=(len(df_train.columns) - 1)),
    keras.layers.Dense(512, activation='relu',
                      kernel_regularizer=keras.regularizers.l2(0.01)),
    keras.layers.Dense(256, activation='linear',
                      kernel_regularizer=keras.regularizers.l2(0.01)),
    keras.layers.Dense(128, activation='relu',
                      kernel_regularizer=keras.regularizers.l2(0.01)),
    keras.layers.Dense(64, activation='linear',
                      kernel_regularizer=keras.regularizers.l2(0.01)),
    keras.layers.Dense(1, activation='sigmoid',
                       kernel_regularizer=keras.regularizers.l2(0.01))
])

model.compile(keras.optimizers.Adam(lr=0.001), 'binary_crossentropy', metrics=['acc'])
model.summary()

经过50次迭代后,我的auc得分为0.62。比纯线性回归稍差。

我了解您曾特别问过关于keras的问题,但是我尝试使用LGBM模型,结果auc得分为0.78,明显更好。

import lightgbm as lgb

train_data = lgb.Dataset(df_train[data_cols].values, label=df_train['Class'])
eval_data = lgb.Dataset(df_test[data_cols].values, label=df_test['Class'])

param = {
    'num_leaves': 31,
    'objective': 'binary',
    'metric': 'auc',
}

bst = lgb.train(param, train_data, 500, valid_sets=[eval_data],
                early_stopping_rounds=5)
bst.save_model('model.txt', num_iteration=bst.best_iteration)

这使我相信,对于这种类型的问题,决策树具有更高的准确性;也许该论坛的其他成员可以提出一些建议,以使keras达到类似的结果...

我认为,尽管这篇文章并没有真正回答您的问题,但您可能对此很感兴趣。