Sklearn 数据预处理
sklearn.preprocessing模块提供了数据标准化、归一化、编码、离散化等全部预处理功能。
📐 标准化与归一化(Scaling)
1.StandardScaler— Z-Score 标准化 ⭐
将特征转换为均值为 0、标准差为 1 的分布。最常用的标准化方法,适合大多数算法(SVM、逻辑回归、神经网络等)。
fromsklearn.preprocessingimportStandardScaler scaler=StandardScaler()X_scaled=scaler.fit_transform(X)# 关键属性print(scaler.mean_)# 每个特征的均值print(scaler.var_)# 每个特征的方差print(scaler.scale_)# 每个特征的标准差print(scaler.n_features_in_)# 特征数# 重要方法X_new=scaler.transform(X_test)# 用已学的参数转换新数据X_orig=scaler.inverse_transform(X_new)# 逆变换恢复原始数据参数说明:
with_mean=True— 是否中心化(稀疏矩阵需设为 False)with_std=True— 是否缩放到单位方差copy=True— 是否复制数据
2.MinMaxScaler— 最小-最大缩放
将特征缩放到给定的范围(默认 [0, 1])。
fromsklearn.preprocessingimportMinMaxScaler scaler=MinMaxScaler(feature_range=(0,1))X_scaled=scaler.fit_transform(X)# feature_range=(-1, 1) 缩放到 [-1, 1]# feature_range=(0, 255) 缩放到像素值范围# 核心属性print(scaler.min_)# 每个特征的最小值(调整后)print(scaler.scale_)# 缩放因子print(scaler.data_min_)# 原始数据的最小值print(scaler.data_max_)# 原始数据的最大值print(scaler.data_range_)# 原始数据的范围# 逆变换X_orig=scaler.inverse_transform(X_scaled)适用场景: 神经网络、图像处理、需要保持在特定范围内的数据。
3.MaxAbsScaler— 最大绝对值缩放
缩放到 [-1, 1] 区间,保留零值(适合稀疏数据)。
fromsklearn.preprocessingimportMaxAbsScaler scaler=MaxAbsScaler()X_scaled=scaler.fit_transform(X)print(scaler.max_abs_)# 每个特征的最大绝对值print(scaler.scale_)# 缩放因子 (= 1 / max_abs_)4.RobustScaler— 鲁棒缩放
使用中位数和四分位距(IQR)进行缩放,对异常值不敏感。
fromsklearn.preprocessingimportRobustScaler scaler=RobustScaler(with_centering=True,# 是否减去中位数with_scaling=True,# 是否除以 IQRquantile_range=(25.0,75.0),# IQR 范围unit_variance=False# 是否使方差为 1)X_scaled=scaler.fit_transform(X)print(scaler.center_)# 每个特征的中位数print(scaler.scale_)# 每个特征的 IQR5.Normalizer— 样本归一化
将每个样本归一化为单位范数(按行操作,非按列)。
fromsklearn.preprocessingimportNormalizer normalizer=Normalizer(norm='l2')# 'l1', 'l2', 'max'X_normalized=normalizer.fit_transform(X)参数norm:
'l2'— L2 范数(欧几里得距离),默认'l1'— L1 范数(曼哈顿距离)'max'— 最大值范数
适用场景: 文本分类、TF-IDF 后常用 L2 归一化。
6.PowerTransformer— 幂变换
使数据更接近高斯分布。
fromsklearn.preprocessingimportPowerTransformer pt=PowerTransformer(method='yeo-johnson')# 或 'box-cox'(仅正数)X_transformed=pt.fit_transform(X)print(pt.lambdas_)# 每个特征的变换参数| method | 适用范围 | 说明 |
|---|---|---|
'yeo-johnson' | 任意实数 | 默认,更通用 |
'box-cox' | 严格正数 | 经典的 Box-Cox 变换 |
7.QuantileTransformer— 分位数变换
将特征映射到均匀分布或正态分布。
fromsklearn.preprocessingimportQuantileTransformer qt=QuantileTransformer(n_quantiles=1000,# 分位数数量output_distribution='uniform',# 'uniform' 或 'normal'random_state=42)X_transformed=qt.fit_transform(X)print(qt.references_)# 分位数参考值适用场景: 处理具有大量异常值的数据、创建更平滑的分布。
8.scale()— 快速缩放函数
无需创建实例的快捷函数。
fromsklearn.preprocessingimportscale X_scaled=scale(X,axis=0,with_mean=True,with_std=True)还有其他快捷函数:
fromsklearn.preprocessingimportminmax_scale,maxabs_scale,robust_scale X_minmax=minmax_scale(X,feature_range=(0,1))X_maxabs=maxabs_scale(X)X_robust=robust_scale(X)🏷️ 标签编码(Encoding)
1.LabelEncoder— 标签编码器
将类别标签转换为 0 到 n_classes-1 的整数。
fromsklearn.preprocessingimportLabelEncoder le=LabelEncoder()y_encoded=le.fit_transform(['cat','dog','bird','cat','dog'])# 输出: [0, 1, 2, 0, 1]# 核心属性与方法print(le.classes_)# ['bird' 'cat' 'dog'](按字母顺序排列)y_orig=le.inverse_transform(y_encoded)# 还原为原始标签# 重要: 仅用于目标 y,不用于特征 X!2.OrdinalEncoder— 序数编码器
将类别特征转换为整数(适用于特征 X,尤其是有序类别)。
fromsklearn.preprocessingimportOrdinalEncoder oe=OrdinalEncoder(categories='auto',# 自动推断类别顺序handle_unknown='use_encoded_value',# 处理未知类别unknown_value=-1# 未知类别的填充值)X_encoded=oe.fit_transform(X)print(oe.categories_)# 每个特征的类别列表3.OneHotEncoder— 独热编码器 ⭐
fromsklearn.preprocessingimportOneHotEncoder ohe=OneHotEncoder(drop=None,# None='first' 或 'if_binary'(避免多重共线性)sparse_output=True,# 默认输出稀疏矩阵,设为 False 输出稠密数组handle_unknown='ignore',# 'error' 或 'ignore'min_frequency=None,# 低频类别合并的最小频率max_categories=None# 每个特征最多保留的类别数)X_ohe=ohe.fit_transform(X)# 默认返回稀疏矩阵,用 .toarray() 转换# 获取特征名称feature_names=ohe.get_feature_names_out()# e.g. ['color_red', 'color_blue', 'color_green', 'size_big', 'size_small']参数drop详解:
None— 保留所有类别(默认)'first'— 丢弃每列第一个类别(避免线性依赖)'if_binary'— 仅对二分类特征丢弃一个array-like— 指定每列丢弃的类别
4.LabelBinarizer— 标签二值化器
fromsklearn.preprocessingimportLabelBinarizer lb=LabelBinarizer()y_bin=lb.fit_transform(['yes','no','yes','maybe'])# 输出: 3 列的独热编码矩阵print(lb.classes_)# 类别y_orig=lb.inverse_transform(y_bin)# 还原5.MultiLabelBinarizer— 多标签二值化
fromsklearn.preprocessingimportMultiLabelBinarizer mlb=MultiLabelBinarizer()y_bin=mlb.fit_transform([['sci-fi','action'],['comedy'],['action','comedy','romance']])# 输出: (3, 4) 矩阵,每列代表一个类别print(mlb.classes_)# ['action', 'comedy', 'romance', 'sci-fi']🎯 目标变量变换
LabelEncoder
(见上方)
📊 离散化(Discretization)
1.KBinsDiscretizer— K 等分/分位数离散化
将连续特征分箱为离散值。
fromsklearn.preprocessingimportKBinsDiscretizer discretizer=KBinsDiscretizer(n_bins=5,# 分箱数encode='onehot',# 'onehot', 'ordinal', 'onehot-dense'strategy='quantile',# 'uniform', 'quantile', 'kmeans'subsample=200000# kmeans 策略时的子采样数)X_binned=discretizer.fit_transform(X)# 获取分箱边界print(discretizer.bin_edges_)# 每个特征的边界数组列表print(discretizer.n_bins_)# 实际分箱数三种策略对比:
| strategy | 说明 |
|---|---|
'uniform' | 等宽分箱 |
'quantile' | 等频分箱(每箱样本数相同) |
'kmeans' | K-Means 聚类分箱 |
2.Binarizer— 二值化
fromsklearn.preprocessingimportBinarizer binarizer=Binarizer(threshold=0.5,copy=True)X_bin=binarizer.fit_transform(X)# 大于 threshold → 1, 小于等于 → 0快捷函数:
fromsklearn.preprocessingimportbinarize X_bin=binarize(X,threshold=0.5)➕ 多项式与自定义变换
1.PolynomialFeatures— 多项式特征 ⭐
生成多项式特征和交互项。
fromsklearn.preprocessingimportPolynomialFeatures poly=PolynomialFeatures(degree=2,# 多项式最高次数interaction_only=False,# True 时只生成交互项(不含 x1²)include_bias=True,# 是否包含偏置列(全 1)order='C'# 'C' 或 'F'(输出顺序))X_poly=poly.fit_transform(X)# 获取生成的特征幂次print(poly.powers_)# 每列对应的各原始特征的指数# 特征名称print(poly.get_feature_names_out())# e.g., ['1', 'x0', 'x1', 'x0^2', 'x0 x1', 'x1^2']示例:[a, b]→[1, a, b, a², ab, b²]
2.SplineTransformer— 样条基函数
生成 B-样条基特征。
fromsklearn.preprocessingimportSplineTransformer spline=SplineTransformer(n_knots=5,# 节点数degree=3,# 多项式阶数(默认三次样条)knots='uniform',# 'uniform' 或 'quantile'extrapolation='linear',# 'error', 'constant', 'linear', 'continue'include_bias=True)X_spline=spline.fit_transform(X)3.FunctionTransformer— 自定义函数变换
fromsklearn.preprocessingimportFunctionTransformerimportnumpyasnp# 方式一: 传入函数transformer=FunctionTransformer(func=np.log1p,# 变换函数inverse_func=np.expm1,# 逆变换函数validate=False,# 是否验证输入accept_sparse=False,check_inverse=True,feature_names_out='one-to-one'# 或 callable)X_transformed=transformer.fit_transform(X)# 方式二: 链式到 Pipeline 中fromsklearn.preprocessingimportFunctionTransformer log_transformer=FunctionTransformer(np.log1p,np.expm1,validate=True)4.KernelCenterer— 核矩阵中心化
fromsklearn.preprocessingimportKernelCenterer centerer=KernelCenterer()K_centered=centerer.fit_transform(K)🔧 缺失值处理
SimpleImputer— 简单缺失值填充
fromsklearn.imputeimportSimpleImputer imputer=SimpleImputer(missing_values=np.nan,# 缺失值标识strategy='mean',# 填充策略fill_value=None,# 'constant' 策略时的填充值copy=True,add_indicator=False# 是否添加缺失指示列)X_imputed=imputer.fit_transform(X)# 属性print(imputer.statistics_)# 填充值(均值/中位数等)print(imputer.indicator_)# MissingIndicator 实例(如果 add_indicator=True)strategy可选值:
| 值 | 说明 |
|---|---|
'mean' | 均值填充(默认,仅数值) |
'median' | 中位数填充(仅数值) |
'most_frequent' | 众数填充(数值或字符串) |
'constant' | 常数填充(需配合 fill_value) |
KNNImputer— KNN 缺失值填充
fromsklearn.imputeimportKNNImputer imputer=KNNImputer(n_neighbors=5,# 邻居数weights='uniform',# 'uniform' 或 'distance'metric='nan_euclidean',# 距离度量copy=True,add_indicator=False)X_imputed=imputer.fit_transform(X)IterativeImputer— 迭代式缺失值填充
fromsklearn.imputeimportIterativeImputerfromsklearn.linear_modelimportBayesianRidge imputer=IterativeImputer(estimator=BayesianRidge(),# 用于建模的回归器missing_values=np.nan,max_iter=10,random_state=42,n_nearest_features=None,initial_strategy='mean',imputation_order='ascending',verbose=0)X_imputed=imputer.fit_transform(X)MissingIndicator— 缺失值标记
fromsklearn.imputeimportMissingIndicator indicator=MissingIndicator(missing_values=np.nan,features='missing-only',# 'all' 或 'missing-only'sparse='auto')mask=indicator.fit_transform(X)# 返回布尔标记矩阵🎨 高级变换
ColumnTransformer— 列转换器 ⭐
对 DataFrame 的不同列应用不同的预处理。
fromsklearn.composeimportColumnTransformerfromsklearn.preprocessingimportStandardScaler,OneHotEncoder preprocessor=ColumnTransformer(transformers=[('num',StandardScaler(),['age','income']),# 数值列标准化('cat',OneHotEncoder(),['gender','city']),# 类别列独热编码],remainder='passthrough',# 'drop', 'passthrough'sparse_threshold=0.3,n_jobs=-1,force_int_remainder_cols=True)X_transformed=preprocessor.fit_transform(X)使用make_column_transformer()快捷方式:
fromsklearn.composeimportmake_column_transformer preprocessor=make_column_transformer((StandardScaler(),['age','income']),(OneHotEncoder(),['gender','city']),remainder='passthrough')make_column_selector()— 列选择器
fromsklearn.composeimportmake_column_selector# 按数据类型选择列num_selector=make_column_selector(dtype_include=np.number)cat_selector=make_column_selector(dtype_include='object')# 配合 ColumnTransformerfromsklearn.composeimportmake_column_transformer preprocessor=make_column_transformer((StandardScaler(),make_column_selector(dtype_include=np.number)),(OneHotEncoder(),make_column_selector(dtype_include='object')),)TransformedTargetRegressor— 目标变量变换回归
fromsklearn.composeimportTransformedTargetRegressorfromsklearn.preprocessingimportQuantileTransformer model=TransformedTargetRegressor(regressor=LinearRegression(),transformer=QuantileTransformer(output_distribution='normal'),check_inverse=True)model.fit(X,y)predictions=model.predict(X_test)📝 使用建议
| 场景 | 推荐方法 |
|---|---|
| SVM / 神经网络 / 逻辑回归 | StandardScaler |
| 有异常值 | RobustScaler |
| 需要限定范围(如图像) | MinMaxScaler |
| 偏态分布 | PowerTransformer/QuantileTransformer |
| 文本 TF-IDF | Normalizer(norm='l2') |
| 类别特征编码 | OneHotEncoder |
| 混合数据类型 | ColumnTransformer |
[[sklearn-总览|← 返回总览]]