Python-sklearn-预处理
2026/8/10 11:58:00 网站建设 项目流程

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_)# 每个特征的 IQR

5.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-IDFNormalizer(norm='l2')
类别特征编码OneHotEncoder
混合数据类型ColumnTransformer

[[sklearn-总览|← 返回总览]]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询