You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Autoencoders自编码器中显示提取得到的特征名称

问题核心

你现在遇到的问题分两部分:

  • 取编码器层的代码存在隐患:你没有给内部的Sequential子模型手动命名,靠默认名sequential取层很容易取错解码器或者其他顺序层,拿不到正确的编码输出。
  • 自编码器输出的低维隐特征是所有原始输入经过多层非线性加权、激活得到的抽象组合特征,本身不存在和原始数据集列一一对应的原生名称,你当前用feature_加序号的命名是工业界通用做法,如果需要可解释的名称,需要额外通过权重关联原始特征生成。
修正代码:正确提取编码特征

不要靠默认层名取层,直接调用你在模型类里定义的encoder属性即可,不会出现取错层的问题:

import pandas as pd
import numpy as np

# 直接访问模型实例的编码器属性,100%拿到正确的编码部分
encoder_model = auto_encoder.encoder
# 预测得到降维后的特征矩阵
encoded_features = encoder_model.predict(x_test_scaled, verbose=0)

# 先使用通用序号命名生成DataFrame
reduced_df = pd.DataFrame(
    encoded_features,
    columns=[f"encoded_feat_{i}" for i in range(encoded_features.shape[1])]
)
给隐特征增加可解释的关联名称

如果需要让特征名体现和原始NASA数据集特征的关联,可以通过编码器输出层的权重,计算每个隐节点关联最强的原始特征,生成带语义的名称,参考代码如下:

# 获取原始输入的特征名列表
original_cols = x_train_scaled.columns.tolist()
# 简单场景可直接用编码器最后一层的权重做参考,若需要精准关联原始特征,可建立从输入到编码输出的端到端编码器计算累计权重
final_encoder_layer = encoder_model.layers[-1]
layer_weights = final_encoder_layer.get_weights()[0]

semantic_col_names = []
for feat_id in range(layer_weights.shape[1]):
    # 按权重绝对值排序,取对当前隐节点影响最大的2个原始特征
    top2_original_idx = np.abs(layer_weights[:, feat_id]).argsort()[-2:][::-1]
    top2_original_names = [original_cols[i] for i in top2_original_idx]
    # 生成名称:编码特征序号+关联最强的原始特征名
    semantic_name = f"ae_feat{feat_id}_{'&'.join(top2_original_names)}"
    semantic_col_names.append(semantic_name)

# 替换DataFrame列名为带语义的名称
reduced_df.columns = semantic_col_names
display(reduced_df)

补充说明:由于自编码器存在多层非线性激活变换,通过权重关联得到的特征名称仅作参考,无法100%代表隐特征的全部语义。如果你需要完全可解释的特征命名,建议替换为PCA这类线性降维方法,主成分可以通过载荷矩阵精确计算每个原始特征的贡献,命名可解释性更强。

内容的提问来源于stack exchange,提问作者user9479133

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:57:14