独热编码分类特征后无法获取特征名的问题求助
解决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
相关产品推荐
相关产品推荐

