数据预处理
近期做的内容遇到了许多和数据预处理相关的内容,结果对模型效果具有较大影响,因此将官方给出的预处理的解决方法大体了解了一下,并大体翻译了一下,方便以后查找。
翻译自sklearn官方文档,原文链接: link.
目录
类方法
几乎每种处理的类都有以下几种方法,具体的根据不同的类具体考虑,大体功能如下:
- fit :根据某个数据集学习预处理需要的数据特征
- transform :对某个数据集进行通过fit方法学到的处理方法
- fit_transform : 利用当前数据学习模式并对当前数据进行处理
- inverse_transform : 将数据还原
- get_params : 获取模型参数设置
- set_params : 修改参数设置
1.标准化
数据集的标准化是许多在scikit-learn中实现的机器学习估计器的普遍要求。例如,学习算法的目标函数中使用的许多元素(例如支持向量机的RBF内核或线性模型的l1和l2正则化器)都假定所有特征都围绕零为中心并且具有相同阶数的方差。如果某个特征的方差比其他特征大几个数量级,则它可能会支配目标函数并使估计器无法按预期从其他特征中正确学习。
# 使用scale进行标准化
from sklearn import preprocessing
import numpy as np
x_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
x_scaled = preprocessing.scale(x_train)
x_scaled
# 从结果可知是对二维数组的每一列进行标准化
有时候我们需要对训练数据集进行标准化处理,同时对测试数据集进行相同的标准化处理,这时可以使用 StandardScaler类。
方法:
- partial_fit : 这适用于由于n_sample数量过多或从连续流中读取X而无法进行拟合的情况
基本属性:
- mean_ : 均值
- scale_ : 标准差
- var_ :方差
可以通过设置with_mean=False或with_std=False使其不中心化或者不进行放缩,只进行另一种变化
scaler = preprocessing.StandardScaler().fit(x_train)
scaler.mean_
scaler.scale_
scaler.transform(x_train)
# 将其应用到别的数据集上
X_test = [[-1., 1., 0.]]
scaler.transform(X_test)
1.1 将特征缩放成一个范围
使用这类缩放的动机包括(1)使特征对很小标准偏差具有鲁棒性(2)保留稀疏数据中的零项。
类:
- MinMaxScaler()等价于:
X
−
m
i
n
(
X
)
m
a
x
(
X
)
−
m
i
n
(
X
)
\frac{X - min(X)}{max(X) - min(X)}
max(X)−min(X)X−min(X)
- 将特征的范围变成[0, 1]
- MaxAbsScaler等价于:
x
m
a
x
(
x
)
\frac{x}{max(x)}
max(x)x
- 将数据变成 [-1, 1]
- 适用于已经以0位中心的数据或稀疏数据
直接应用的函数:minmax_scale 和 maxabs_scale
1.2 放缩稀疏数据
对于稀疏数据中心化是没有意义的,并且会破坏稀疏数据的数据结构,但是进行放缩却是可以的。
常用的方法:
- MaxAbsScaler和maxabs_scale
- scale和StandardScaler可以接受scipy.sparse的矩阵,但是要设置with_mean=False,否则会报错
- RobustScaler不能使用稀疏数据进行fit,但是可以对稀疏数据使用transform方法
1.3 放缩有异常值的数据
当数据含有许多异常值时,直接标准化结果可能不好。可以使用 robust_scale和RobustScaler(利用0.25和0.75分位数对数据进行处理)
1.4 中心化核矩阵
如果有一个内核K的内核矩阵,可以在由函数 ϕ \phi ϕ定义的特征空间中计算点积,则KernelCenterer可以可以对其进行中心化。
2 非线性变换
有两种类型的转换:分位数转换和幂转换。
特点:
- 都基于特征的单调变换,保留了每个特征的值的等级。
- 分位数变换可以平滑异常分布,并且与缩放相比,离群值的影响较小。但是,它扭曲了要素内部和要素之间的相关性和距离。
- 幂变换旨在将数据从任何分布映射到接近高斯分布。
import numpy as np
from sklearn.preprocessing import quantile_transform
rng = np.random.RandomState(0)
X = np.sort(rng.normal(loc=0.5, scale=0.25, size=(25, 1)), axis=0)
X
quantile_transform(X, n_quantiles=10, random_state=0, copy=True, output_distribution='normal')
# output_distribution设置映射成均匀分布还是正态分布
2.1映射成[0, 1]均匀分布
QuantileTransformer和quantile_transform
2.2 映射成高斯分布
PowerTransformer包含两者中变换:Yeo-Johnson transform and the Box-Cox transform(对数正态分布取对数)
3.normalization
是变量具有单位范数,一般只支持l1,l2和max(使用最大值进行归一化)
4.编码类型变量
- 将类别变量转化成数字编码 OrdinalEncoder或者OneHotEncoder
- 可以使用categories参数设置编码对应的类型
- 当类型变量存在缺失时,最好不要通过上面的方法手动设置类别,通过handle_unknown='ignore’将所有已有类别设置为0而不会报错。该方法只适用于onehotencode。并且当某些类别在训练数据集中出现但是在测试数据集中没出现过时非常有用。
- onehotencode通过设置参数drop删除每个特征的某个类别,可以是模型避免共线性的影响,例如将结果数据输入神经网络非正则化回归模型
5.离散化
注意一个常用的的方法:将连续变量离散化为一系列互不相交的区间
5.1 k-bins离散化
KBinsDiscretizer(注意不同的切分方法和编码方法)
5.2 特征二值化
特征二值化是对数字特征进行阈值化以获得布尔值的过程。这对于下游概率估计器很有用,这些估计器假设输入数据是根据多元伯努利分布进行分布的。
Binarizer
6.估算缺失数据
7.生成多项式特征
PolynomialFeatures,将 ( x 1 , x 2 ) (x_{1}, x_{2}) (x1,x2)变成 ( 1 , x 1 , x 2 , x 1 2 , x 2 2 , x 1 x 2 ) (1, x_{1}, x_{2}, x_{1}^{2}, x_{2}^{2}, x_{1}x_{2}) (1,x1,x2,x12,x22,x1x2)。
- 注意这里结果中有1,因此如果拟合回归模型,不应单独计算截距项。
- 参数interaction_only=True只返回交叉项,也就是
将 ( x 1 , x 2 ) (x_{1}, x_{2}) (x1,x2)变成 ( 1 , x 1 , x 2 , x 1 x 2 ) (1, x_{1}, x_{2}, x_{1}x_{2}) (1,x1,x2,x1x2)
8.自定义变换
FunctionTransformer