【问题标题】:Tuning Keras's parameters to improve model accuracy调整 Keras 的参数以提高模型的准确性
【发布时间】:2019-07-19 06:18:34
【问题描述】:

我是一名生物学家,并开始寻找通往深度学习世界的道路。因此,我阅读了许多书籍和在线教程。简而言之,我正在构建一个模型,以使用 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%)。

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

非常感谢, 何

【问题讨论】:

    标签: r keras deep-learning


    【解决方案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 实现类似结果的方法......

    我认为虽然这篇文章并不能真正回答您的问题,但您可能会对它感兴趣。

    【讨论】:

    • 非常感谢您的时间和精力。我认为我的您的 keras 模型已经改进了很多。我已经尝试过支持向量机,但效果不佳。 LGBM 的结果很有趣,我会试试你的代码,看看敏感性和特异性如何。
    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 2020-01-07
    • 2018-05-21
    • 2018-10-05
    • 1970-01-01
    • 2020-12-13
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多