我是一名生物学家,开始寻找通往深度学习世界的道路。因此,我阅读了许多书籍和在线教程。简而言之,我正在建立一个模型,在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
非常感谢, 何
答案 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达到类似的结果...
我认为,尽管这篇文章并没有真正回答您的问题,但您可能对此很感兴趣。