首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强迫网络在学习过程中权衡特定变量

强迫网络在学习过程中权衡特定变量
EN

Data Science用户
提问于 2023-03-08 19:08:21
回答 1查看 19关注 0票数 0

我有一个熊猫的数据框架,包含了大约100000种植物及其年龄的观测数据,并附加了一些数值预测因子(气候)。我用tensorflowkeras建立了一个预测物种agesequential模型。下面是我的基本回归网络的代码:

代码语言:javascript
复制
# 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,因此所有其他物种都不存在。

代码语言:javascript
复制
# Species_1 prediction
[[23.043112]
 [23.11334 ]
 [24.231022]
 [23.026756]
 [25.771097]]
代码语言:javascript
复制
# Species_2 prediction
[[23.043112]
 [23.11334 ]
 [24.231022]
 [23.026756]
 [25.771097]]

事实上,对不同物种的预测是相同的,这使我认为网络在训练期间没有使用一个热编码的物种信息,或者更确切地说,物种信息在预测年龄时被认为不重要,因此受到了较低的重视。我绝不是神经网络方面的专家,我仍然在学习。

我的目标是在不同的气候情景下对不同的物种进行年龄预测。如何迫使网络在训练过程中始终使用物种数据?我是否错在一个数据框架中使用所有物种数据,而应该将每个物种的数据框架分开?我应该使用其他机器学习算法(随机森林)吗?网络是否过于复杂,从而记忆响应变量,或影响预测因素与响应之间的关系?如有任何建议,将不胜感激。

EN

回答 1

Data Science用户

回答已采纳

发布于 2023-03-09 17:09:58

在对手头的问题有了更好的理解之后,下面是我的解决方案,对我的物种类别进行深入编码,以便网络能够从中学习。

代码语言:javascript
复制
# 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)

```
代码语言:javascript
复制
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/120056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档