standardscaler适用于近似正态、无强离群点的数据,minmaxscaler适用于边界明确、需归一至[0,1]的场景;树模型无需缩放;多项式特征应限制交互项、剔除低方差列;fit仅在训练集执行,推理时仅transform;onehotencoder需处理未知类别。

特征缩放用 StandardScaler 还是 MinMaxScaler?看数据分布和模型需求
不是所有模型都吃同一套缩放逻辑。线性模型、SVM、KNN 对量纲敏感,必须缩放;树模型(如 RandomForest、XGBClassifier)完全不需要——缩了反而可能引入噪声。
StandardScaler 假设数据近似正态,中心化 + 除以标准差;MinMaxScaler 把特征压到 [0, 1],对异常值极其敏感——一个极大离群点就能把其他所有值挤成一坨。
- 用
StandardScaler:数据大致对称、没强离群点、后续接逻辑回归或 PCA - 用
MinMaxScaler:输入是图像像素值、神经网络输入层(尤其带 sigmoid/tanh 激活)、已知边界清晰(如百分比、评分 0–100) - 怀疑有离群点?先用
boxplot或df.describe()看25%/75%和max差距;差距大就别硬上MinMaxScaler
多项式特征生成别直接套 PolynomialFeatures(degree=2)
全组合爆炸是真的快。10 个原始特征开到 degree=2,输出特征数直接跳到 66 个;升到 degree=3 就 220+,再加交互项,训练慢、内存爆、还容易过拟合。
真正有用的交互往往来自业务理解,不是数学穷举。比如房价预测里 area * rooms 有意义,但 area * postal_code 几乎没意义。
立即学习“Python免费学习笔记(深入)”;
- 先限制
interaction_only=True,只生成交叉项不生成平方项 - 用
include_bias=False,避免无意义的常数列 - 配合
ColumnTransformer只对数值列做多项式,分类列单独做OneHotEncoder - 生成后立刻用
VarianceThreshold删掉方差为 0 的列(比如某交叉项全是 0)
fit 和 transform 顺序搞错,线上推理必崩
训练时用 scaler.fit_transform(X_train) 没问题,但部署时如果对新样本调 scaler.transform(X_new) 却忘了先 fit —— 不会报错,但结果完全错乱。更常见的是:用 fit_transform 处理测试集 X_test,等于偷看了测试数据分布。
- 训练阶段:只对
X_train调fit_transform,保存 fitted 的scaler对象(用joblib.dump) - 推理阶段:加载已 fit 好的
scaler,只调transform,绝不fit新数据 - 多项式同理:
poly.fit(X_train)后,poly.transform(X_test)才合法;poly.fit_transform(X_test)是典型数据泄露
类别型特征做 OneHotEncoder 前,务必处理未见过的类别
训练时某列有 ['A', 'B', 'C'],线上来了个 'D',默认 OneHotEncoder 直接报错 ValueError: Found unknown categories。这不是 bug,是设计如此——它拒绝隐式降维。
- 设
handle_unknown='ignore',遇到未知值就全输出 0 向量(适合后续接树模型) - 设
handle_unknown='infrequent'(v1.3+),自动把低频类别合并,同时兼容未知值 - 更稳的做法:训练前用
pd.Categorical(..., categories=all_known_values)显式固定类别集合 - 注意:
get_feature_names_out()返回的列名不含未知类,别靠名字索引,用np.where定位更安全
特征工程最麻烦的从来不是代码写不对,而是训练和线上用的预处理链不一致——多一个 fit,少一个 fillna,或者缺失值填法不同,模型效果就断崖下跌。留好 pipeline 的每个中间对象,比调参重要得多。










