Pytorch AutoEncoder 的功能重要性

问题描述 投票:0回答:1

我需要从 Pytorch AutoEncoder 中获取它对每个输入变量的重要性。我正在使用表格数据集,没有图像。

我的自动编码器如下:

class AE(torch.nn.Module):
    def __init__(self, input_size, hidden_layer, latent_layer):
        super().__init__()

        self.encoder = torch.nn.Sequential(
            torch.nn.Linear(input_size, hidden_layer),
            torch.nn.ReLU(),
            torch.nn.Linear(hidden_layer, latent_layer)
        )

        self.decoder = torch.nn.Sequential(
            torch.nn.Linear(latent_layer, hidden_layer),
            torch.nn.ReLU(),
            torch.nn.Linear(hidden_layer, input_size)
        )

    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded

为了节省不必要的信息,我只需调用以下函数来获取我的模型:

average_loss, model, train_losses, test_losses = fullAE(batch_size=128, input_size=genes_tensor.shape[1],
                                 learning_rate=0.0001, weight_decay=0,
                                 epochs=50, verbose=False, dataset=genes_tensor, betas_value=(0.9, 0.999), train_dataset=genes_tensor_train, test_dataset=genes_tensor_test)

其中“模型”是先前 AutoEncoder 的训练实例:

model = AE(input_size=input_size, hidden_layer=int(input_size * 0.75), latent_layer=int(input_size * 0.5)).to(device)

现在我需要获得该模型对原始“genes_tensor”数据集中每个输入变量的重要性,但我不知道如何做。我研究了如何做到这一点,并找到了一种使用 shap 软件来做到这一点的方法:

e = shap.DeepExplainer(model, genes_tensor)

shap_values = e.shap_values(
    genes_tensor
)

shap.summary_plot(shap_values,genes_tensor,feature_names=features)

这个实现的问题如下:1)我不知道我实际做的是否正确。 2)需要很长时间才能完成,因为数据集包含 950 个样本,我尝试仅使用 1 个样本来完成,并且需要足够长的时间。使用单个样本的结果如下:

我已经看到还有其他选项可以获取输入变量的重要性,例如 Captum,但 Captum 只允许了解具有单个输出神经元的神经网络的重要性,在我的情况下有很多。

我在 github 上看到的 AE 或 VAE 选项对我不起作用,因为它们总是使用具体案例,尤其是图像,例如:

https://github.com/peterparity/PDE-VAE-pytorch

https://github.com/FengNiMa/VAE-TracIn-pytorch

我的 shap 实施正确吗?我应该尝试其他方法吗?

编辑:

我只运行了 4 个样本的 shap 代码并得到以下结果:

shap with 4 samples

我不明白为什么它不是随处出现的典型 shap summary_plot 图。

我一直在查看 shap 文档,这是因为我的模型是多输出的,输出端有多个神经元。

deep-learning pytorch neural-network autoencoder shap
1个回答
0
投票

下面对 SHAP 没有太多评论,但我对潜在的替代方案有一些想法。

需要很长时间才能完成,因为数据集包含 950 个样本,我尝试仅使用 1 个样本来完成,并且需要足够长的时间 [...] 我应该尝试其他方法吗?

由于 SHAP 花费了很长时间,我认为如果您认为其他技术可以提供有用的信息并可以更快地迭代,那么我认为值得考虑其他技术。

一种方法是运行排列重要性测试。首先使用原始数据获取模型的重建和重建误差。然后,对于每个

feature_i

  • 清零
    feature_i
    (或排列/随机洗牌)。这将在后续训练中很大程度上抵消其效果。
  • 记录新训练模型的重建和侦察误差,并计算与原始结果的差异。
  • 您可以选择通过所有更改的总和对结果进行标准化,以便您获得所有特征的总和为 1 的分数。

此信息将允许您绘制侦察中的特征与变化,或侦察错误中的特征与变化。第一个图告诉您每个特征如何影响模型的输出,并且可以将其视为 SHAP 的近似值(尽管我将其视为一种独特且有用的方法)。第二张图告诉您每个特征如何影响重建精度。

此方法的局限性在于,如果特征高度相关,则排列测试可能会低估或错过特征的重要性。有一些方法可以缓解这种情况,例如提前评估相关性并删除或分组相关的相关性。

评估自动编码器特征重要性的另一种方法是记录每个样本的潜在表示。您可以运行互信息分析来查看要素与潜在空间表示之间的关联强度。某些特征可能比其他特征更多地解释压缩表示,表明相对重要性。

其他技术可以查看为每个特征学习的权重大小(可能与稀疏性惩罚相结合)或激活大小。

对于任何给定的方法,请考虑仅在数据集的一部分上运行它以节省时间,或者仅训练几个时期。结果将更加近似,但可能足以评估相对特征重要性。

为了最大限度地减少过度拟合,您可能需要对部分数据运行拟合,然后使用未见过的验证样本获取侦察和侦察错误。

© www.soinside.com 2019 - 2024. All rights reserved.