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

如何基于Keras实现用于高维数据集特征选择的简单Autoencoder?

没问题!我刚好有个实用的Keras实现示例,专门针对高维数据集的特征选择——核心是利用Autoencoder的无监督学习能力,先学习数据的低维表示,再通过两种常用方法筛选关键特征。下面一步步来:

核心逻辑

Autoencoder(AE)的本质是通过编码器把高维数据压缩到低维隐层,再用解码器重构原始数据。对于特征选择,我们可以从两个角度切入:

  • 编码器权重:输入层到编码器第一层的权重绝对值越大,说明该特征对低维表示的贡献越大,也就越关键。
  • 重构误差:某个特征的重构误差越小,说明AE很好地捕捉了这个特征的信息,它的价值更高。
完整Keras实现示例

1. 准备依赖和数据

首先导入需要的库,这里我们用模拟的高维数据集(你可以直接替换成自己的真实数据集):

import numpy as np
from keras.models import Model
from keras.layers import Input, Dense
from keras.optimizers import Adam
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification

# 生成高维模拟数据:100个样本,500个特征,仅20个是有效特征
X, y = make_classification(n_samples=100, n_features=500, n_informative=20,
                           n_redundant=100, n_classes=2, random_state=42)

# !!重要:AE对数据尺度敏感,必须做标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

2. 构建Autoencoder模型

我们搭建一个对称的编码器-解码器结构,你可以根据自己的数据规模调整层数和神经元数量:

# 输入层:维度和特征数一致
input_layer = Input(shape=(X_scaled.shape[1],))

# 编码器:逐步压缩到低维隐层(这里设为20维,对应模拟数据的有效特征数)
encoder = Dense(256, activation='relu')(input_layer)
encoder = Dense(128, activation='relu')(encoder)
encoder = Dense(64, activation='relu')(encoder)
bottleneck = Dense(20, activation='relu')(encoder)  # 低维表示的核心层

# 解码器:逐步还原到原始特征维度
decoder = Dense(64, activation='relu')(bottleneck)
decoder = Dense(128, activation='relu')(decoder)
decoder = Dense(256, activation='relu')(decoder)
output_layer = Dense(X_scaled.shape[1], activation='linear')(decoder)

# 组装完整模型并编译
autoencoder = Model(inputs=input_layer, outputs=output_layer)
autoencoder.compile(optimizer=Adam(learning_rate=0.001), loss='mse')

# 查看模型结构
autoencoder.summary()

3. 训练模型

AE是无监督学习,所以用原始数据同时作为输入和标签:

history = autoencoder.fit(X_scaled, X_scaled,
                          epochs=100,
                          batch_size=8,
                          shuffle=True,
                          validation_split=0.2)
两种特征选择方法

方法1:基于编码器权重的特征选择

直接提取编码器第一层的权重,计算每个特征的权重绝对值之和作为重要性:

# 获取输入层到第一个编码器层的权重矩阵(shape: [特征数, 第一层神经元数])
encoder_weights = autoencoder.layers[1].get_weights()[0]

# 计算每个特征的权重绝对值总和,作为重要性得分
feature_importance = np.sum(np.abs(encoder_weights), axis=1)

# 按重要性降序排序,取前20个特征(你可以根据需求调整数量)
top_feature_indices = np.argsort(feature_importance)[::-1][:20]
print("基于权重筛选的Top 20特征索引:", top_feature_indices)

方法2:基于重构误差的特征选择

计算每个特征的平均重构误差,误差越小说明特征越重要:

# 得到模型重构后的数据集
X_reconstructed = autoencoder.predict(X_scaled)

# 计算每个特征的平均MSE重构误差
feature_recon_error = np.mean(np.square(X_scaled - X_reconstructed), axis=0)

# 按误差升序排序,取前20个特征
top_feature_indices_recon = np.argsort(feature_recon_error)[:20]
print("基于重构误差筛选的Top 20特征索引:", top_feature_indices_recon)
关键注意事项
  • 数据预处理:一定要做标准化/归一化,否则AE的训练效果会大打折扣。
  • 隐层维度调整:如果不知道最优的隐层维度,可以先用PCA估计数据的有效维度,或者通过网格搜索尝试不同的维度。
  • 防止过拟合:如果你的数据集不大,可以在编码器/解码器层加入Dropout层,或者减少神经元数量。
  • 验证效果:筛选完特征后,建议用这些特征训练一个分类器(比如逻辑回归、随机森林),对比全特征的模型效果,验证筛选的有效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:10:09