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

独热编码分类特征后无法获取特征名的问题求助

解决ColumnTransformer生成特征名时的AttributeError问题

你尝试通过Pipeline集成缺失值填充、标准化、独热编码处理混合特征数据集,最终要生成带新特征名的DataFrame,但调用preprocessor.get_feature_names_out()时触发AttributeError。相关代码如下:

num_pipeline = Pipeline(
steps = [
    ("Imputer", SimpleImputer(strategy = 'median')),
    ("Scaler", StandardScaler(with_mean=False))
        ]
)

cat_pipeline = Pipeline(
steps = [
    ("Imputer", SimpleImputer(strategy='most_frequent')),
    ("Encoder", OneHotEncoder(sparse=False)),
    ("Scaler", StandardScaler(with_mean=False))
        ]
)


preprocessor = ColumnTransformer(
  [
    ("Numerical_Pipeline", num_pipeline, num_columns),
    ("Categorical_Pipeline", cat_pipeline, cat_columns)
  ]
)

from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

X_train = preprocessor.fit_transform(X_train)

X_train = pd.DataFrame(data = X_train, columns = preprocessor.get_feature_names_out())

错误原因分析

  • 版本兼容问题:get_feature_names_out()是scikit-learn 0.24版本新增的方法,若你的版本低于0.24,调用该方法会触发AttributeError。旧版本对应的方法是get_feature_names()。
  • 冗余步骤干扰:分类Pipeline中,独热编码后再做标准化没有实际意义(独热特征是0/1二元值,标准化不会提升模型效果),且可能干扰特征名的正常生成逻辑。

解决方向

方向1:升级scikit-learn版本

打开终端执行升级命令:

pip install --upgrade scikit-learn

升级到0.24及以上版本后,get_feature_names_out()可以正常调用,且能自动生成带前缀的清晰特征名(比如Numerical_Pipeline__age、Categorical_Pipeline__gender_female这类格式)。

方向2:适配旧版本scikit-learn

如果无法升级版本,改用旧版方法get_feature_names(),修改代码如下:

# 替换原DataFrame生成代码
X_train = pd.DataFrame(data=X_train, columns=preprocessor.get_feature_names())

注意:旧版本生成的特征名可能是Numerical_Pipeline__0这类索引式名称,若需要对应原特征名,可手动映射,或在OneHotEncoder中设置handle_unknown='ignore'并指定categories参数来确保特征名准确性。

方向3:优化Pipeline步骤(推荐)

移除分类Pipeline中的StandardScaler,优化后的代码:

cat_pipeline = Pipeline(
steps = [
    ("Imputer", SimpleImputer(strategy='most_frequent')),
    ("Encoder", OneHotEncoder(sparse=False, handle_unknown='ignore'))
        ]
)

优化后既减少了不必要的计算,也避免了冗余步骤导致的特征名生成异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:03:29