tensorflow 改进DNN预测

yebdmbv4  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个来自原始NHANES的处理过的数据集。根据可用的特征,我需要执行回归任务,即确定一个人的实际年龄(通常,我需要确定生物年龄,但现在我停在实际年龄上)。
问题是,我不能选择正确的层和它们的数量,以及超参数,优化器,损失和其他(我尝试了其中的许多)。我已经试着这么做了好几天了,但没有用。也许我做错了什么,或者我的数据相关性太差,这是我能得到的最大值。总的来说,我需要一些比我更有经验的人的建议。任何具体的建议或提示将不胜感激,但感谢任何帮助。
下面是输入数据的示例(最后两列是KDM计算的生物年龄及其调整值。在将来,我需要精确计算这些值,但现在我不使用它们):

下面是一个示例代码(我知道这个模型很简单,但更复杂的变体显示出同样糟糕的结果,类似于mae和mse等默认损失函数的情况):

# BA and BAC is biological age estimated using KDM method
# Need to estimate similar value without them
X = df_male.drop(columns=['Age', 'BA', 'BAC'])
y = df_male[['Age', 'BA', 'BAC']]

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.3,
                                                    random_state=20)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model_0_ha = Sequential([
    layers.BatchNormalization(input_shape=(X_train_scaled.shape[1],)),
    layers.Dense(50),
    layers.PReLU(),
    layers.BatchNormalization(),
    layers.AlphaDropout(0.2),
    layers.Dense(25),
    layers.PReLU(),
    layers.BatchNormalization(),
    layers.Dense(1, activation='relu'),
])

optimizer = optimizers.experimental.Adamax(learning_rate=0.01)    

def max_mae_loss(y_true, y_pred):
    mae = K.abs(y_true - y_pred)
    max_mae = K.max(mae)
    min_mae = K.min(mae)
    return max_mae-min_mae

model_0_ha._name = "model_male_0_ha"

model_0_ha.compile(loss=max_mae_loss,
                  optimizer = optimizer,
                  metrics=[metrics.MeanSquaredError(),
                         metrics.MeanAbsoluteError()])

custom_metrics_callback = CustomMetricsCallback()
custom_metrics_callback.X_test = X_test_scaled
custom_metrics_callback.y_test = y_test['Age']
custom_metrics_callback.loss_name = 'CMASE'
custom_metrics_callback.epoch_count = 50

start_time = time.time()

history = model_0_ha.fit(X_train_scaled, y_train['Age'],
                         epochs=250,
                         batch_size=100,
                         callbacks=[custom_metrics_callback],
                         verbose=0)

end_time = time.time()
execution_time = end_time - start_time

prediction = model_0_ha.predict(X_test_scaled)

我已经把我的代码和数据集放在google colab上了,所以你可以在这个link上尝试一下(如果这个资源允许这样的链接的话)。

g52tjvyc

g52tjvyc1#

我已经多次运行了您的代码,修改了模型架构,调整了优化器,并更改了损失函数。

model_0_ha = Sequential([
    layers.BatchNormalization(input_shape=(X_train_scaled.shape[1],)),
    layers.Dense(50),
    layers.PReLU(),
    layers.BatchNormalization(),
    layers.AlphaDropout(0.2),
    layers.Dense(25),
    layers.PReLU(),
    layers.BatchNormalization(),
    layers.Dense(1, activation='relu'),
])
optimizer = optimizers.experimental.Adam(learning_rate=0.1)
def max_mse_loss(y_true, y_pred):
    return K.mean((y_true - y_pred)**2)

然而,最终的MSE和MAE分别收敛到约144和9.2。
这是我的结果。

Model results:
Time: 205.96876192092896 s.
MSE: 144.18941585132137
MAE: 9.241665510296738 | MAX:  57.41379356384277 | MIN:  6.103515625e-05
R2: 0.6252561398114401
|Real age       |Predicted      |
|---------------|---------------|
|21.000         |26.333         |
|35.000         |46.165         |
|48.000         |51.437         |

考虑到你的数据集是表格类型的,考虑使用基于树的机器学习模型可能更有益,比如XGBoost、Random Forest或LightGBM。
欲了解更多信息,您可以参考本文:' Tabular Data: Deep Learning Is Not the Sole Solution. '

相关问题