简单数据预处理和特征工程

Posted favor-dfn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单数据预处理和特征工程相关的知识,希望对你有一定的参考价值。

本篇是机器学习小组第3周的学习内容输出,参考资料包括:

机器学习的敲门砖:归一化与KD树

https://mp.weixin.qq.com/s?__biz=MzI4MjkzNTUxMw==&mid=2247483857&idx=3&sn=5a4573e5fe074241a45f6affb969448f&chksm=eb932867dce4a171ff2890ee6b326cfc234e1361948d673c30ea30110894435a63f780b0540e&token=932563280&lang=zh_CN&scene=21#wechat_redirect

【量化课堂】kd 树算法之思路篇

https://www.joinquant.com/view/community/detail/dd60bd4e89761b916fe36dc4d14bb272

美团技术博客-机器学习中的数据清洗与特征处理综述

数据预处理之离散化

https://www.cnblogs.com/jiaxin359/p/8574510.html

  • 特征归一化

不同的特征有不同的取值范围,在有些算法中,例如线性模型或者距离相关的模型像聚类模型、kNN模型等,特征的取值范围会对最终的结果产生较大影响,例如二元特征的取值范围为[0,1],而距离特征取值可能是[0,正无穷)(关于距离取值,在第一个学习链接中提到了kNN算法对距离取值的依赖,当维度越来越多的时候,距离会越来越大),在实际使用中会对距离进行截断,例如[0,3000000],但是这两个特征由于取值范围不一致导致了模型可能会更偏向于取值范围较大的特征,为了平衡取值范围不一致的特征,需要对特征进行归一化处理,将特征取值归一化到[0,1]区间。常用的归一化方法包括:

1.函数归一化,通过映射函数将特征取值映射到[0,1]区间,例如最大最小值归一化方法,是一种线性的映射。还有通过非线性函数的映射,例如log函数等。

  • 最值归一化实现
 1 >>> import numpy as np
 2 >>> X = np.random.randint(0,100,(50,2))
 3 >>> # 最值归一化公式,映射到0,1之间
 4 ... (x - np.min(x)) / (np.max(x) -  np.min(x))
 5 
 6 >>> #最值归一化(矩阵),初始化0~100范围内的50*2的矩阵
 7 ... X = np.random.randint(0,100,(50,2))
 8 >>> X = np.array(X, dtype=float)
 9 >>> X = (X-np.min(X,axis=0)) / (np.max(X,axis=0) - np.min(X,axis=0))
10 >>> X
11 array([[0.35714286, 0.69473684],
12        [0.41836735, 0.29473684],
13        [0.66326531, 0.23157895],
14        [0.86734694, 0.86315789],
15        [0.68367347, 0.        ],
16        [0.60204082, 0.11578947],
17        [0.96938776, 0.48421053],
18        [0.94897959, 0.01052632],....
  • 均值方差归一化实现
>>> X2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)
>>> X2=(X2-np.mean(X2,axis=0)) / np.std(X2,axis=0)
>>> X2
array([[-0.69972732,  1.16541396],
       [-0.66498416, -0.3998551 ],
       [ 1.76703732,  0.98754248],
       [ 1.24588986,  0.95196818],
       [-0.63024099, -0.18640932],
       [ 1.55857833,  1.20098826],
       [ 1.31537619, -0.50657799],
       [-0.56075467, -0.89789525],
       [ 0.58576974,  0.98754248]...

sklearn的实现(StandarScalar)

 1 import numpy as np
 2 from sklearn import datasets
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 
 6 iris = datasets.load_iris()
 7 X = iris.data
 8 y = iris.target
 9 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=666)
10 
11 standardScaler = StandardScaler()
12 standardScaler.fit(X_train)
13 standardScaler.mean_
14 standardScaler.scale_   # 表述数据分布范围的变量,替代std_
15 
16 # 使用transform或者fit_transform计算z-score
17 X_train_standard = standardScaler.transform(X_train)
18 X_test_standard = standardScaler.transform(X_test)
19 
20 X_train_standard_z_score = standardScaler.fit_transform(X_train)

2.分维度归一化,可以使用最大最小归一化方法,但是最大最小值选取的是所属类别的最大最小值,即使用的是局部最大最小值,不是全局的最大最小值。

3.排序归一化,不管原来的特征取值是什么样的,将特征按大小排序,根据特征所对应的序给予一个新的值。

  • 特征离散化

连续值的取值空间可能是无穷的,为了便于表示和在模型中处理,需要对连续值特征进行离散化处理。常用的离散化方法包括等值划分和等量划分。等值划分是将特征按照值域进行均分,每一段内的取值等同处理。例如某个特征的取值范围为[0,10],那么可以将其划分为10段,[0,1),[1,2),...,[9,10)。等量划分是根据样本总数进行均分,每段等量个样本划分为1段。例如距离特征,取值范围[0,3000000],现在需要切分成10段,如果按照等比例划分的话,会发现绝大部分样本都在第1段中。使用等量划分就会避免这种问题,最终可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的区间划分比较密,后面的比较稀疏。

1.连续型属性离散化:

    • 等宽分箱法:该方法的思想是,将数据均匀划分成n等份,每份的间距相等。

    • 等频分箱法:该方法的思想是,将观察点均匀分成n等份,每份的观察点数相同。

2.无序分类变量的离散化:使用独热编码解决。

 

3.有序分类变量的离散化:

有序分类变量可以直接利用划分后的数值。如分类变量 [贫穷,温饱,小康,富有],直接可以将他们转换为[0,1,2,3]就可以了。可以直接使用pandas当中的map函数进行映射离散化:

train_df[Sex] = train_df[Sex].map({male:0, female:1})

或者是借用sklearn.preprocessing.LabelEncoder 来完成这样的操作。

 

以上是关于简单数据预处理和特征工程的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘——特征工程

Python数据挖掘—特征工程—数据处理

DataScience:数据预处理/特征工程之构造特征—构造日期特征/基于时间序列数据特征的简介(模型提效技巧)代码实现之详细攻略

2021 年 MathorCup 高校数学建模挑战赛—赛道A数据预处理特征工程及模型训练Baseline 和数据

特征工程中数据预处理方法总结

特征工程基本流程