DataJam

数据预处理与特征工程:无纲量化

一、数据预处理与特征工程

1.数据预处理

  数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程。
可能面对的问题有:
  • 数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。
  • 数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
数据预处理的目的:让数据适应模型,匹配模型的需求

2. 特征工程:

  特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
可能面对的问题有:
  • 特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌
特征工程的目的:1) 降低计算成本,2) 提升模型上限
 

3. sklearn中的数据预处理和特征工程

sklearn官网:https://scikit-learn.org/stable/index.html

sklearn.__version__#查看版本
'0.23.2'

3.1 sklearn中模块

  • Classification

  • Regression

  • Clustering

  • Dimensionality reduction:包含降维算法

    • 模块feature_selection:包含特征选择的各种方法的实践
  • Model selection

  • Preprocessing:几乎包含数据预处理的所有内容

  • 模块Impute:填补缺失值专用
特征工程推荐书籍:O'Reilly Media:《Feature Engineering for Machine Learning
翻译代码与数据科学:https://github.com/fengdu78/Data-Science-Notes/tree/master/9.feature-engineering
书籍下载:PDF下载
 

二、数据预处理

2.1 数据无量纲化

  1.无量纲化:将不同规格的数据转换为统一规格,或将不同分布的数据转换到某个特定的分布。

  2.应用场景:

  • 梯度和矩阵为核心的算法中:如逻辑回归,支持向量机,神经网络,无量纲化可以加快求解速度;
  • 距离类模型:如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
  • 特例:决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。

  3.类别:

  • 线性:
    • 中心化(Zero-centered或者Mean-subtraction)处理:本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。
    • 缩放处理(Scale):的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
  • 非线性  

  4.方法汇总:

  4.1数据归一化((Normalization,又称Min-Max Scaling)

    当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间; 

 

                                   

 1 from sklearn.preprocessing import MinMaxScaler
 2 import pandas as pd 
 3 import numpy as np 
 4 data = [[-10, 50], [-0.5,78], [0, 19], [1, 180]]#列表
 5 #data = np.array([[-10, 50], [-0.5,78], [0, 19], [1, 180]])#数组
 6 #data = pd.DataFrame(data)#dataframe
 7 #实现归一化
 8 scaler = MinMaxScaler()#实例化对象
 9 result = scaler.fit_transform(data)#合生成min(x)和max(x),通过接口导出结果
10 result#使用三种数据结构输出结果均一致
11 
12 #输出结果
13 array([[0.        , 0.19254658],
14        [0.86363636, 0.36645963],
15        [0.90909091, 0.        ],
16        [1.        , 1.        ]])

 

  • 使用numpy进行归一化:
1 #numpy利用公式实现数据归一化
2 x = np.array([[-10, 50], [-0.5,78], [0, 19], [1, 180]])
3 X_nor = (x - x.min(axis=0)) / (x.max(axis=0) - x.min(axis=0))
4 
5 输出结果:
6 array([[0.        , 0.19254658],
7        [0.86363636, 0.36645963],
8        [0.90909091, 0.        ],
9        [1.        , 1.        ]])

逆转归一化

1 #逆转归一化
2 X_returned = X_nor * (X.max(axis=0) - X.min(axis=0)) + X.min(axis=0)
3 
4 输出结果:
5 array([[-10. ,  50. ],
6        [ -0.5,  78. ],
7        [  0. ,  19. ],
8        [  1. , 180. ]])

  4.2数据标准化(Standardization,又称Z-score normalization)

当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化; 
                                               

 

 使用sklearn进行标准化:sklearn.preprocessing .StandardScaler

1 from sklearn.preprocessing import StandardScaler
2 X = np.array([[-10, 50], [-0.5,78], [0, 19], [1, 180]])
3 scaler = StandardScaler() #实例化
4 result = scaler.fit_transform(X)  #直接拟合转化结果

输出结果:

1 array([[-1.71916266, -0.52530042],
2        [ 0.42274492, -0.06204336],
3        [ 0.53547689, -1.03819217],
4        [ 0.76094085,  1.62553595]])
1 X = np.array([[-10, 50], [-0.5,78], [0, 19], [1, 180]])
2 scaler = StandardScaler()
3 scaler = scaler.fit(X)#进行拟合
4 scaler.mean_  #查看标准化的均值
5 scaler.var_#查看标准化的方差
6 result = scaler.transform(X)
7 result.mena()#查看标准化后的均值
8 result.std()#查看标准化后标准差
array([-2.375, 81.75 ])#标准化变换均值.
array([  19.671875, 3653.1875  ])#标准化变换方差.

注意:

对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fifit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。通常来说,我们输入的X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。 
X = np.array([[-10], [-0.5], [0], [1]])#二维不报错
X = np.array([-10, -0.5, 0, 1])#一维报错

2.2如何选择?

大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。
MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。
建议先试试看StandardScaler,效果不好换MinMaxScaler。除了StandardScaler和MinMaxScaler之外,sklearn中也提供了各种其他缩放处理(中心化只需要一个pandas广播一下减去某个数就好了,因此sklearn不提供任何中心化功能)。
比如,在希望压缩数据,却不影响数据的稀疏性时(不影响矩阵中取值为0的个数时),我们会使用MaxAbsScaler;在异常值多,噪声非常大时,我们可能会选用分位数来无量纲化,此时使用RobustScaler。更多详情请参考以下列表。 
(来源:菜菜老师)

 

 

 

 

posted on 2021-06-08 15:52  DataJam  阅读(821)  评论(0)    收藏  举报

导航