我有一个熊猫的数据框架,包含了大约100000种植物及其年龄的观测数据,并附加了一些数值预测因子(气候)。我用tensorflow和keras建立了一个预测物种age的sequential模型。下面是我的基本回归网络的代码:
# Create model structure
model = Sequential([
Dense(128,activation='relu',
kernel_regularizer=regularizers.L1L2(l1=1e-3,l2=1e-4)),
Dense(64,activation='relu',
kernel_regularizer=regularizers.L1L2(l1=1e-3,l2=1e-4)),
Dense(32,activation='relu',
kernel_regularizer=regularizers.L1L2(l1=1e-3,l2=1e-4)),
Dense(16,activation='relu',
kernel_regularizer=regularizers.L1L2(l1=1e-3,l2=1e-4)),
Dense(1,activation='relu')
])
# Compile the models
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.mae,
metrics=['mae'])
# Train
random.seed(132)
model_trained = model.fit(X_train,
y_train,
epochs = 200,
validation_split = 0.15,
verbose = 0)在训练前对物种数据进行编码,并对所有变量进行规范化处理。大约有110个物种,所以经过一个热编码,我有一个训练数据集,大约有900000行和180个列。
对于培训,我认为将所有物种的数据包含在一个数据框架中,将允许更好的性能,因为该模型正在同时从更多的数据中学习。
模型没有显示出过度拟合的迹象,验证、测试和培训MAE都是非常相似的。看上去不错!

然而,当我尝试做预测时,使用不同的数值数据(未来气候),age预测对于不同的物种都是一样的。例如,当我为预测建立新的数据框架时,我将数据框架编码为特定物种的数据框架,即存在Species_1,因此所有其他物种都不存在。
# Species_1 prediction
[[23.043112]
[23.11334 ]
[24.231022]
[23.026756]
[25.771097]]# Species_2 prediction
[[23.043112]
[23.11334 ]
[24.231022]
[23.026756]
[25.771097]]事实上,对不同物种的预测是相同的,这使我认为网络在训练期间没有使用一个热编码的物种信息,或者更确切地说,物种信息在预测年龄时被认为不重要,因此受到了较低的重视。我绝不是神经网络方面的专家,我仍然在学习。
我的目标是在不同的气候情景下对不同的物种进行年龄预测。如何迫使网络在训练过程中始终使用物种数据?我是否错在一个数据框架中使用所有物种数据,而应该将每个物种的数据框架分开?我应该使用其他机器学习算法(随机森林)吗?网络是否过于复杂,从而记忆响应变量,或影响预测因素与响应之间的关系?如有任何建议,将不胜感激。
发布于 2023-03-09 17:09:58
在对手头的问题有了更好的理解之后,下面是我的解决方案,对我的物种类别进行深入编码,以便网络能够从中学习。
# Perform deep encoding on species names
# Create test data frame containing y and Species
test = pd.concat([y, X['Species']], axis=1)
# Convert species names to ordinal numbers
test['Species_ord'] = pd.Categorical(test['Species'], categories=test['Species'].unique(), ordered=True).codes
# Define embedding parameters
m = len(test['Species'].unique())
embedding_size = min(50,m+1/2)
# Create model structure
model = Sequential([
Embedding(input_dim = m,
output_dim = embedding_size,
input_length = 1,
name="embedding"),
Flatten(),
Dense(32,activation="relu"),
Dense(1,activation="relu")
])
# Compile the models
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.mae,
metrics=['mae'])
# Train
random.seed(132)
model.fit(x = test['Species_ord'],
y = test['Age'],
epochs = 50,
batch_size = 16,
verbose = 1)
# Grab the new embedded variables for species
Species_embedded = model.get_layer('embedding').get_weights()
Species_embedded_df = pd.DataFrame(Species_embedded[0])
# Change name of embeddings
Species_embedded_df = Species_embedded_df.rename(columns=lambda x: f"Species_encode_{x}")
# Add species names to embeddings as ID
Species_embedded_df["Species"] = test['Species'].unique()
# Save to disk for later use
Species_embedded_df.to_csv(dir + "3-Resultats/Tables/Tree_Species_Embeddings.csv", index=False)
```https://datascience.stackexchange.com/questions/120056
复制相似问题