使用scikit-learn进行初步的数据预处理

本文详细介绍了sklearn库中数据预处理的方法,包括Z-Score标准化、区间缩放法及正则化技术。讲解了如何使用StandardScaler、MinMaxScaler、MaxAbsScaler进行数据标准化,并探讨了L1和L2正则化在防止过拟合中的作用。

对于机器学习来说,sklearn具有非常丰富且方便的算法模型库,现在我们将使用sklearn中的preprocessing库来对数据进行初步的预处理。


1.Z-Score标准化(尽量使均值为0,方差为1)

标准化即将数据按比例进行缩放,使其落入一个限定的区间。特点是使得不同量纲之间的特征具有可比性,同时不改变原始数据的分布。属于无量纲化处理。

公式

需要计算特征的均值和标准差,使用sklearn中preprocessing库中的StandardScaler类对特征进行标准化代码如下:

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
# data 即为标准化后返回的数据
data = ss.fit_transform(train_data)
特点:

1.标准化后不会改变原始数据的分布,即不会影响各自特征对目标函数的权重。
2.在样本数据大的情况下比较稳定,适用于嘈杂的现代大数据场景。


2.区间缩放法

顾名思义,将数据进行伸缩变换到[0, 1]或者是[-1, 1]范围内进行处理,也是属于无量纲化处理。

最小最大值标准化(MinMaxScaler)

使用sklearn中preprocessing库中的MinMaxScaler类对特征进行标准化代码如下:

from sklearn.preprocessing import MinMaxScaler

# 使用 MinMaxScaler 对数据进行缩放
# MinMaxScaler(feature_range = (0, 1), copy = True) 
# 其中 feature_range: tuple(min, max), default = (0, 1)
# 即可以自行指定最小最大值范围,因此也称最小最大值标准化

mms = MinMaxScaler()
data = mms.fit_transform(data)
绝对值最大标准化

使用sklearn中preprocessing库中的MaxAbsScaler类对特征进行标准化代码如下:

from preprocessing import MaxAbsScaler

# 通过除以最大值,将数据缩放至[-1, 1]
# 这意味着数据以0为中心或者含有非常多的0,即稀疏数据

mas = MaxAbsScaler()
train_data = mas.fit_transform(data)
特点:

1.对不同特征维度数据进行伸缩变换,达到归一。
2.改变了原始数据的分布,即各特征对目标函数的权重影响是一致的。
3.可对方差特别小的数据增强其稳定性,也可以维持稀疏矩阵中多为0的样本条目。
4.可以提高迭代求解的收敛速度和精度。
5.最小值和最大值容易受噪声点影响,鲁棒性差。


3.正则化

奥卡姆剃刀定律:如无需要,勿增实体。因此模型越复杂,越容易出现过拟合。之前以最小化损失函数(经验风险最小化)为目标,后来以最小化损失函数和模型复杂度(结构风险最小化)为目标。所以,通过降低模型的复杂度来防止模型过拟合的规则称为正则化。

  • 机器学习中最常见的无外乎就是L1正则化L2正则化
  • 对于线性回归模型而言,使用L1正则化的模型称为Lasso回归,使用L2正则化的模型称为岭回归(Ridge 回归)
  • 在一般回归模型分析中,w一般称为回归系数,而使用正则化项就是对回归系数进行处理。
  • L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||1
  • L2正则化是指权值向量w中各个元素的平方和然后再求平方根,通常表示为||w||2
  • L1正则使得带有L1正则的模型在拟合过程中,部分参数权值降为0,可以产生稀疏权值矩阵,进而用来进行特征选择。
  • L2正则即使带有L2正则的模型在拟合的过程中,不断的让权值变小,因此加入有数据发生偏移(噪声点)也不会对结果造成什么影响,即抗干扰能力强。
  • L1正则之所以一定程度上可以防止过拟合,是因为当L1的正则化系数很小时,得到的最优解会很小,可以达到和L2正则化类似的效果。

使用sklearn中preprocessing库中的normalize类对特征进行标准化代码如下:

from preprocessing import normalize

# data 为被正则的数据集,norm 参数选择为 l1, l2
# 即选择L1正则还是L2正则

train_data = normalize(data, norm = 'l2')
<think>我们聚焦于scikit-learn数据预处理功能,根据用户提供的引用内容,特别是引用[1][2][3][4]中提到的数据预处理技术,我们将详细说明如何使用scikit-learn进行数据预处理,包括数据缩放、归一化、编码等,并给出代码示例。主要步骤:1.数据缩放(标准化、归一化)2.特征编码(如独热编码)3.缺失值处理4.特征选择与降维我们将结合引用中的示例代码进行说明,并注意引用标识的添加。注意:根据系统指令,数学公式使用LaTeX格式,代码块使用标准格式,相关问题在最后提出。</think>### scikit-learn 数据预处理完整指南 scikit-learn 提供全面的数据预处理工具,以下是核心功能及使用方法: --- #### 一、**数据缩放与归一化** 解决特征量纲差异问题,提高模型收敛速度[^1][^3] 1. **最小-最大缩放 (Min-Max Scaling)** 将数据线性变换到 [0,1] 区间 ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_train_scaled = scaler.fit_transform(X_train) # 训练集拟合并转换 X_test_scaled = scaler.transform(X_test) # 测试集仅转换[^3] ``` 2. **标准化 (Z-Score)** 使数据服从标准正态分布 $(\mu=0, \sigma=1)$ 公式:$$x_{\text{new}} = \frac{x - \mu}{\sigma}$$ ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_data = scaler.fit_transform(raw_data) # 同时处理均值和标准差[^1] ``` 3. **最大绝对值缩放 (MaxAbs Scaling)** 按特征最大绝对值缩放,保留数据稀疏性 ```python from sklearn.preprocessing import MaxAbsScaler scaler = MaxAbsScaler() X_scaled = scaler.fit_transform(X) # 适用于稀疏数据[^4] ``` --- #### 二、**特征编码** 处理分类变量和文本特征 1. **独热编码 (One-Hot Encoding)** 将分类变量转为二进制向量 ```python from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder(sparse=False) encoded_data = encoder.fit_transform(categorical_data) # 消除类别顺序影响[^2] ``` 2. **标签编码 (Label Encoding)** 为类别分配整数值 ```python from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y_encoded = le.fit_transform(y_labels) # 适用于目标变量 ``` --- #### 三、**缺失值处理** ```python from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') # 可选: mean/median/most_frequent X_imputed = imputer.fit_transform(X_missing) # 自动填充缺失值[^1] ``` --- #### 四、**特征工程高级技巧** 1. **多项式特征生成** ```python from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly.fit_transform(X) # 生成交互项和平方项 ``` 2. **分箱离散化 (Binning)** ```python from sklearn.preprocessing import KBinsDiscretizer binner = KBinsDiscretizer(n_bins=5, encode='ordinal') X_binned = binner.fit_transform(X) # 连续变量离散化 ``` --- #### 五、**工作流整合:Pipeline** 自动化预处理流程,避免数据泄露 ```python from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier pipeline = Pipeline([ ('imputer', SimpleImputer(strategy='median')), # 步骤1: 缺失值填充 ('scaler', StandardScaler()), # 步骤2: 标准化 ('clf', RandomForestClassifier()) # 步骤3: 建模 ]) pipeline.fit(X_train, y_train) # 一键执行全流程[^2] ``` --- ### 注意事项 1. **训练/测试集分离处理** - 所有转换器(如 `scaler.fit_transform()`)**必须先在训练集拟合** - 测试集仅使用 `transform()`,避免信息泄露[^3] 2. **稀疏数据优化** 使用 `MaxAbsScaler` 或 `OneHotEncoder(sparse_output=True)` 节省内存 3. **类别不平衡** 结合 `imbalanced-learn` 库的 `SMOTE` 进行过采样 --- ### 典型应用场景 1. 金融风控:标准化交易金额,编码地区分类 2. 医疗诊断:填充缺失检测值,离散化年龄分段 3. 自然语言处理:TF-IDF文本向量化(`sklearn.feature_extraction.text`) --- ### 相关问题 1. 如何处理包含混合类型(数值+分类)的数据集? 2. 如何在交叉验证中正确应用数据预处理? 3. scikit-learn 的 `ColumnTransformer` 如何使用? 4. 特征缩放对哪些机器学习算法影响最大? 5. 如何自定义转换器(Transformer)集成到 Pipeline? [^1]: 数据缩放与转换方法 [^2]: 预处理流程与工程实践 [^3]: 训练/测试集分离处理规范 [^4]: 稀疏数据处理技术
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值