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

使用Keras回归模型做特征选择时遇RuntimeError问题求助

解决RFE结合Keras回归模型的RuntimeError问题

嘿,这个问题我之前也碰到过!RFE(递归特征消除)之所以报错,核心原因是它需要从你传入的estimator里读取coef_或者feature_importances_属性来判断特征重要性,但Keras的MLP模型默认不会暴露这两个属性——毕竟神经网络的特征重要性不像树模型那样有现成的直接指标。

下面给你两种可行的解决方案:

方案一:自定义Keras回归器,添加特征重要性属性

我们可以手动计算MLP的特征重要性(比如用输入层到第一个隐藏层的权重绝对值之和),然后把这个值赋值给feature_importances_属性,让RFE能识别到。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.base import BaseEstimator, RegressorMixin
import numpy as np
from sklearn.feature_selection import RFE

# 自定义带特征重要性的Keras MLP回归器
class KerasMLPRegressor(BaseEstimator, RegressorMixin):
    def __init__(self, epochs=3, batch_size=20):
        self.epochs = epochs
        self.batch_size = batch_size
        self.model = None
        self.feature_importances_ = None  # 初始化特征重要性属性
        
    def fit(self, X, y):
        # 构建你的基线模型(和原来的baseline_model逻辑一致)
        self.model = Sequential()
        self.model.add(Dense(10, input_dim=X.shape[1], activation='relu'))
        self.model.add(Dense(1, activation='linear'))
        self.model.compile(loss='mean_squared_error', optimizer='adam')
        self.model.fit(X, y, epochs=self.epochs, batch_size=self.batch_size, verbose=0)
        
        # 计算特征重要性:输入层权重的绝对值之和(每个特征对应所有隐藏层神经元的权重绝对值总和)
        input_layer_weights = self.model.layers[0].get_weights()[0]
        self.feature_importances_ = np.sum(np.abs(input_layer_weights), axis=1)
        return self
    
    def predict(self, X):
        # 确保输出是一维数组,符合sklearn的输出格式
        return self.model.predict(X).flatten()

# 现在用自定义回归器跑RFE
seed = 7
np.random.seed(seed)
estimator = KerasMLPRegressor(epochs=3, batch_size=20)
rfe = RFE(estimator=estimator, n_features_to_select=5)
fit = rfe.fit(X_set, Y_set)

# 查看结果
print("特征排名(1表示选中):", fit.ranking_)
print("被选中的特征索引:", np.where(fit.support_)[0])

这种方法的好处是能继续用RFE的递归消除逻辑,一步步筛选出最优特征子集。

方案二:用排列重要性(Permutation Importance)替代RFE

如果不想修改模型,排列重要性是更通用的选择——它不需要模型本身有特征重要性属性,而是通过打乱单个特征的取值,观察模型性能的下降幅度来判断特征的重要性:下降越多,特征越关键。

from sklearn.inspection import permutation_importance
from sklearn.pipeline import Pipeline
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
import numpy as np

# 先训练你的原始模型
seed = 7
np.random.seed(seed)

def baseline_model():
    # 这里放你原来的baseline_model代码
    model = Sequential()
    model.add(Dense(10, input_dim=X_set.shape[1], activation='relu'))
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

estimators = [('mlp', KerasRegressor(build_fn=baseline_model, epochs=3, batch_size=20))]
pipeline = Pipeline(estimators)
pipeline.fit(X_set, Y_set)

# 计算排列重要性
result = permutation_importance(
    pipeline, X_set, Y_set, 
    n_repeats=10,  # 重复打乱次数,结果更稳定
    random_state=seed,
    scoring='neg_mean_squared_error'  # 回归任务的评分指标
)

# 按重要性从高到低排序
sorted_idx = result.importances_mean.argsort()[::-1]

print("特征重要性排名(从高到低):")
for idx in sorted_idx:
    print(f"特征 {idx}: 平均重要性 = {result.importances_mean[idx]:.4f} (标准差 = {result.importances_std[idx]:.4f})")

之后你可以根据这个排名手动选择前5个特征,或者结合其他方法进一步筛选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:03