数据预处理及sklearn方法实现

时间:2022-03-19 06:53:23

1、标准化(中心化)

在许多机器学习执行前,需要对数据集进行标准化处理。因为很对算法假设数据的特征服从标准正态分布。所以如果不对数据标准化,那么算法的效果会很差。

例如,在学习算法的目标函数,都假设数据集的所有特征集中在0附近,并且有相同的方差。如果某个特征的方差远大于其他特征的方差,那么该特征可能在目标函数占的权重更大,使得算法不能从所有特征中学习。

在实践中,我们往往忽略了分布的形状,只需要通过减去每个特征的均值,然后除以非标准特征的标准偏差来转换数据。

scale方法提供了在一个类似数据的数据集上执行操作的简便方法:

from sklearn import preprocessing

X_scaled = preprocessing.scale(X)

preprocessing模块还提供了一种使用类:StandardScaler,主要计算训练集的均值和标准差,然后应用在测试集的转换上

scaler = preprocessing.StandardScaler().fit(X)                              
sscaler.transform(X)                              

1.1将特征缩放到一个范围

另一种标准化方法是将特征值缩放到在一个给定的最小值和最大值之间,通常是0~1;或者每个特征的最大绝对值被缩放到单位大小。该方法可以分别通过MinMaxScaler或者MaxAbsScaler实现。

使用范围:特征对非常小的标准差的鲁棒性和希望在稀疏数据中保存零项

Example1

min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)

Example2:

 max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)

1.2稀疏数据缩放

对稀疏数据中心化处理会破坏数据的稀疏性结构,所以很少对稀疏数据中心化。但是如果特征在不同的方差下,依然需要对数据进行缩放。

MaxAbsScaler和方法maxabs_scale是专门用来对稀疏数据进行缩放的。

1.3、离群点的缩放

如果数据集中包含很多离群点,那么使用数据的均值方差进行缩放的效果不会很好。

在这种情况下,可以使用方法robust_scale和类RobustScaler来进行替换,它们对数据的均值和方差使用更健壮的估计

1.4、中心化核矩阵

如果有一个核K的核矩阵,通过定义的函数phi计算特征空间的点积,使用类KernelCenterer可以变换核矩阵,它包含去除特征空间均值后,再利用phi计算特征空间的内积。

2、归一化

归一化是将单个样本缩放为单位范数的过程。如果使用一个二次形式,例如点积或其他任何内核来量化一对样本的相似度,这个步骤会很有必要。这个步骤是向量空间模型的基础,常被用于文本分类聚类中。

normalize方法提供了快速简单的方法来对单个array数据集进行归一化,可以选择L1或者L2范数。

preprocessing.normalize(X, norm='l2')

preprocessing模块还提供了类Normalizer,通过方法Transformer API对另一数据集执行同样的操作。

normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)

注:normalize和Normalizer同样适用于类似array的稠密的或者稀疏的矩阵。

3、二值化

特征二值化是对数值特征进行阈值化以得到布尔值的过程。这对于假设输入数据服从多变量伯努利分布的后验分布的估计是有用的。例如,在sklearn.neural_network.BernoulliRBM的使用时需要二值化。

在文本处理中经常使用二值特征(可能是为了简化推理过程),例如在计数或者TF-IDF特征值中,使用二值特征能够更有效。

类Binarizer是专门用于二值化的,例如:

preprocessing.Binarizer().fit(X)或者preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)

preprocessing模块提供binarize方法来对特征进行二值化处理。

4、种类特征编码

在很多情况下,特征值不是连续的值而是种类。例如,一个人可能的特征是[male, female]等等,这些特征可以用整数值来进行编码。

在scikit-learn中,将种类特征用1-of-k或者one-hot编码。预处理模块中有OneHotEncoder来对种类特征编码,通常是m个可能的种类用m个值来表示。例如:

preprocessing.OneHotEncoder()

默认情况下,m值时通过数据集自动推断出来的。例如,数据集中有2种性别,三种可能的地方,4中可能的浏览器。然后在编码时,在9列的array数组中,前2个数字编码性别,接下来3个数字编码地方,最后4个数字编码浏览器。

5、缺失值处理

由于各种原因,许多现实世界的数据集包含缺失值,通常变为为空白、NaN或其他占位符。使用不完整数据集的基本策略是丢弃包含缺失值的整行或整列,然而这样会丢失可能有价值的数据。一个更好的策略就是从已知的部分数据中推断出缺失值。

Imputer类提供了基本的策略来填充缺失值,可以用行或者列的均值、中位数或众数来填充缺失值。例如:

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(X)

该类还支持稀疏矩阵(将缺失值编码为0),将稀疏矩阵填充为稠密的矩阵。

6、生成多项式特征

通常,通过考虑输入数据的非线性特征来增加模型的复杂度是很有用的。一个简单常用的方法是多项式特征,它可以得到特征的高阶和相互作用项。

PolynomialFeatures类可以用来生成多项式特征。

poly = PolynomialFeatures(2)
poly.fit_transform(X)     

上述将(X1, X2)转化为(1, X1, X2, X12, X1X2, X22)

应用范围:多样式特征常用于核方法中(SVM, 核PCA)

PS:该内容从sklearn数据预处理模块整理,具体方法和类的使用可以在sklearn官网上查询:http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing