机器学习第三课_数据预处理2

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

特征工程又包含了Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和Feature construction(特征构造)等子问题,而数据预处理又包括了数据清洗和特征预处理等子问题。



1、归一化

最大最小【0,1】归一化

MaxAbs归一化

MAXABS归一化

某些算法要求样本具有零均值和单位方差;

需要消除样本不同属性具有不同量级时的影响。

归一化有可能提高精度; 数量级的差异将导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要);

数量级的差异将导致迭代收敛速度减慢; 当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

依赖于样本距离的算法对于数据的数量级非常敏感。

数据标准化的原因:fromsklearn.preprocessing import   MaxAbsScaler

maxAbsScaler=MaxAbsScaler().fit(X_train)

maxAbsScaler.transform(X_train)

标准化(也叫Z-score standardization,均值为0方差为1)(对列向量处理)

标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。

基于原始数据的均值(mean)和标准差(standarddeviation)进行数据的标准化。将A的原始值x使用z-score标准化到x’。z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。

from sklearn import preprocessing

import numpy as np

# 初始化数据

x = np.array([[ 0., -3.,  1.],

              [ 3.,  1.,  2.],

              [ 0.,  1., -1.]])

# 将数据进行 Z-Score 规范化

scaled_x = preprocessing.scale(x)

print (scaled_x)

数据标准化的原因:

某些算法要求样本具有零均值和单位方差;

需要消除样本不同属性具有不同量级时的影响。

归一化有可能提高精度; 数量级的差异将导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要);

数量级的差异将导致迭代收敛速度减慢; 当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

依赖于样本距离的算法对于数据的数量级非常敏感。

相同点:

它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。

不同点:

目的不同,归一化是为了消除纲量压缩到[0,1]区间;

标准化只是调整特征整体的分布;

归一化与最大,最小值有关;

标准化与均值,标准差有关;

归一化输出在[0,1]之间;

标准化无限制。

归一化与标准化的应用场景

在分类、聚类算法中,需要使用距离来度量相似性的时候(如SVM、KNN)、或者使用PCA技术进行降维的时候,标准化(Z-score standardization)表现更好;

在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用归一化方法。

比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围;

基于树的方法不需要进行特征的归一化。

例如随机森林,bagging与boosting等方法。

如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。

一般来说,建议优先使用标准化。对于输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。

除了上面介绍的方法外,还有一些相对没这么常用的处理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。

正则化

正则化-Normalizer,将同一行数据的不同特征进行规范化,这样一个数据的不同特征具有相同的量纲

Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

from sklearn.preprocessing import Normalizer

#归一化,返回值为归一化后的数据

Normalizer().fit_transform(iris.data)

array([[0.80377277, 0.55160877, 0.22064351, 0.0315205 ],

      [0.82813287, 0.50702013, 0.23660939, 0.03380134],

      [0.80533308, 0.54831188, 0.2227517 , 0.03426949],

      [0.80003025, 0.53915082, 0.26087943, 0.03478392],

      [0.790965  , 0.5694948 , 0.2214702 , 0.0316386 ],

#normalizer  = Normalizer(norm='l2').fit(X_train)

#normalizer.transform(X_train)

你可能感兴趣的:(机器学习第三课_数据预处理2)