AttributeError: 'StandardScaler' object has no attribute 'feature_names_in_'
时间: 2025-07-01 12:05:43 浏览: 7
在使用 `StandardScaler` 时,如果遇到 `AttributeError: 'StandardScaler' object has no attribute 'feature_names_in_'` 错误,通常是因为尝试访问了一个在当前版本的 `scikit-learn` 中并不存在的属性 `feature_names_in_`。
### 原因分析
`StandardScaler` 是 `scikit-learn` 提供的一个用于标准化数据的类。从 `scikit-learn` 版本 **1.0** 开始,部分预处理类(如 `OneHotEncoder`、`ColumnTransformer` 等)引入了 `feature_names_in_` 属性,该属性用于存储训练过程中输入特征的名称。然而,并非所有预处理器都支持这一属性,`StandardScaler` 就是其中之一 [^1]。
因此,当代码中尝试访问 `StandardScaler` 实例的 `feature_names_in_` 属性时,就会抛出 `AttributeError`。
### 解决方法
如果需要获取 `StandardScaler` 处理后的特征名,可以通过以下方式实现:
1. **手动记录原始特征名**:在调用 `fit` 或 `transform` 方法之前,保存输入模型的特征名称。
2. **结合 `Pipeline` 和 `ColumnTransformer` 使用**:若需更复杂的特征处理流程,可以将 `StandardScaler` 与其他支持 `get_feature_names_out` 方法的转换器一起使用,从而通过 `get_feature_names_out` 获取最终特征名。
#### 示例代码
```python
from sklearn.preprocessing import StandardScaler
import numpy as np
# 假设的特征名称列表
original_features = ['feature1', 'feature2', 'feature3']
# 创建 StandardScaler 实例
scaler = StandardScaler()
# 模拟数据
X_train = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 拟合数据
scaler.fit(X_train)
# 手动获取特征名称
scaled_features = original_features # 因为 StandardScaler 不改变特征名称
print("Scaled feature names:", scaled_features)
```
### 替代方案
如果确实需要动态追踪特征名称,可以考虑使用 `FunctionTransformer` 包装 `StandardScaler` 并添加自定义逻辑以支持 `feature_names_in_` 或 `get_feature_names_out` 方法。
---
阅读全文
相关推荐

















