如何在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
相关产品推荐
相关产品推荐

