第三周打卡:数据预处理与特征工程

1、前言

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
特征工程在机器学习中占据着重要地位
定义:特征工程时利用数据领域的只是来创建能够使机器学习算法达到最佳性能的特征的过程。

特征工程包括:

  • 数据预处理 Data preprocessing
  • 特征提取 Feature Extraction
  • 特征选择 Feature Selection
  • 特征构造 Feature Construction

数据预处理包括数据清洗,特征预处理
特征预处理包括无量纲化,特征分桶,统计转换,特征编码

2、数值型特征无量纲化

无量纲化使不同规格的数据转换到同一规格。常见的有标准化、归一化

为什么需要数据标准化

  1. 某些算法要求样本具有零均值和单位方差。
  2. 需要消除不同属性具有不同量级时的影响。
    2.1 归一化有可能提高精度;数量级的差异有可能导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这是实际情况时值域范围小的特征更重要)
    2.2数量级的差异倒是迭代收敛速度减慢;当使用梯度下降法寻求最优解时,很可能走“之”字型路线(垂直等高线走),从而导致需要迭代很多次才能收敛
    2.3依赖于样本距离的算法对数据的数量级非常敏感

3、数据标准化

前提时数据服从正态分布,标准化后,其转换为标准正态分布
X基于均值(mean)和标准差(std)通过Z分数标准化到X片

适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况
优缺点:
优点:简单、容易计算;Z-score能够应用于数值型的数据,并不受数据量级的影响
缺点:1、估算Z-score需要总体的均值和标准差,但是在真实场景的分析和挖掘中很难拿得到,大多数都是使用样本的均值和标准差。2、Z-score对数据的分布有要求,正态分布是最有利的。3、Z-score消除了数据的实际意义,因此的Z-score的结果只能用于比较数据间的结果。4、存在异常值时,无法保证平衡的特征分布

4、数据归一化

最值归一化(MinMax)

将属性缩放到[0,1]中
第三周打卡:数据预处理与特征工程_第1张图片
缺点:当有新的数据加入时,可能导致min和max的变化,MinMaxscore对异常值的存在十分敏感

最大值归一化(Maxabs)

单独的缩放每个特征,区间[-1,1]不会移动、居中数据,不会破坏稀疏性
第三周打卡:数据预处理与特征工程_第2张图片
缺点:同MaxMin

5、正态分布化(normalization)

6、总结:

异同点

相同点:

1、都能取消量纲不同导致的误差
2、都是线性转换,对X按照比例压缩再平移

不同点:

1、目的不同:归一化时消除量纲再压缩到[0,1],标准化时调整特征整体的分布
2、归一化与max、min有关;标准化与mean、std有关
3、输出不同:归一化局限输出范围[0,1];标准化则无限制

如何选择

1、对结果输出范围有要求,使用归一化;
2、数据较稳定,没有极端值的max,min使用归一化;
3、数据存在异常值或者较多噪声,用标准化(简介通过中心化避免极端值和噪声的影响

应用场景

1、在分类、聚类算法中,需要使用距离来度量相似性的时候(SVM,KNN)或使用PCA技术降维时,Z-score更好。
2、不涉及距离度量,协方差计算数据不符合正态分布时,可以使用归一化,如图像处理中,灰度值有限定
3、基于树的方法不需要特征的归一化

如果时基于参数或者基于距离的模型,需要对参数、距离计算,都需要归一化

一般来说,优先推荐标准化

7、数值型特征特征分箱(数据离散化)

离散化时数值型特征非常重要的一种处理,就是将数值型数据转化为离散型数据(类别型数据)即对连续型数据进行离散化处理

分箱的优势及重要性

离散特征的增加和减少都很容易,易于模型的快速迭代;
稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
离散化后的特征对异常数据有很强的鲁棒性;
比如一个特征是年龄>30是1,否则0。
如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
对于线性模型,表达能力受限;
单变量离散化为N个后,每个变量有单独的权重,相当于模型引入了非线性,能够提升模型表达能力,加大拟合;
离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
特征离散化后,模型会更稳定;
比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。
当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险;
可以将缺失作为独立的一类带入模型;
将所有变量变换到相似的尺度上。

无监督分箱法

1、自定义分箱法

根据业务经验或常识等自行设定划分的区间,将数据归类于各个区间

2、等距分箱

按照相同宽度将数据分成几等份
缺点是受异常值的影响比较大

3、等频分箱

将数据分为几等份,每一份里边的个数一样
第三周打卡:数据预处理与特征工程_第3张图片

4、聚类分箱

基于k均值聚类的分箱
将观测值分类K类,但预测过程中需要保证分箱的有序性,第一个分箱的所有观测值都小于第二个分箱,第二个都小于第三个。
实现步骤:
1、对预处理额数据进行归一化处理
2、对归一化的数据应用Kmeans聚类算法划分多区间,采用等距法设定K-means聚类算法的初始中心得到聚类中心
3、在得到聚类中心后将相邻的聚类中心的重点作为分类的划分点,将每个对象加入到距离最近的类中,从而将数据划分为多个区间
4、重新计算每个聚类中心,重新划分数据,知道每个聚类中心不再变化,得到最终的聚类结果

5、二值化

将数值型数据的feature按照阈值得到Boolean型数据
第三周打卡:数据预处理与特征工程_第4张图片

有监督分箱法

1、卡方分箱法

定义
自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

基本思想
对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。

实现步骤
Step 0:
预先定义一个卡方的阈值;
Step 1:
初始化;
根据要离散的属性对实例进行排序,每个实例属于一个区间;
Step 2:
合并区间;
计算每一对相邻区间的卡方值;
将卡方值最小的一对区间合并;

2、最小熵法分箱

8、特征工程

sklearn中的数据预处理和特征工程
介绍模块:
1、preprocessing:几乎包括数据预处理的所有内容
2、impute:填补缺失值专用
3、feature_selection:包含特征选择的各种方法和实践
4、decomposition:包含降维算法

8.1数据预处理

8.1.1 数据无量纲化

8.1.2缺失值处理

如何处理缺失值
sklearn.impute.SimpleImpute(messing_values = np.nan,strategy=‘mean’,fill_value = None,copy = True)
参数说明:
missing_values:告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan

strategy:我们填补缺失值的策略,默认均值。
输入“mean”使用均值填补(仅对数值型特征可用)
输入“median"用中值填补(仅对数值型特征可用)
输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)

fill_value:当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0

copy:默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

或者使用pandas、numpy处理

8.1.3 处理分类型特性 编码与哑变量

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。
然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小学”,“初中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

preprocessing.LabelEncoder 标签专用,将分类转化为分类数值
preprocessing.OrdinalEncoder 特征专用,将分类特征转化为分类数值
preprocessing.OneHotEncoder 独热变化,创建哑变量

我们来思考三种不同性质的分类数据:
1) 舱门(S,C,Q)
  三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量。
2) 学历(小学,初中,高中)
  三种取值不是完全独立的,我们可以明显看出,在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量。
3) 体重(>45kg,>90kg,>135kg)
  各个取值之间有联系,且是可以互相计算的,比如120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量。
  然而在对特征进行编码的时候,这三种分类数据都会被我们转换为[0,1,2],这三个数字在算法看来,是连续且可以计算的,这三个数字相互不等,有大小,并且有着可以相加相乘的联系。所以算法会把舱门,学历这样的分类特征,都误会成是体重这样的分类特征。这是说,我们把分类转换成数字的时候,忽略了数字中自带的数学性质,所以给算法传达了一些不准确的信息,而这会影响我们的建模。
  类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息:
  第三周打卡:数据预处理与特征工程_第5张图片
  这样的变化,让算法能够彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。在我们的数据中,性别和舱门,都是这样的名义变量。因此我们需要使用独热编码,将两个特征都转换为哑变量。

8.1.4 处理连续型特征:二值化与分段

sklearn.preprocessing.Binarizer
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。
sklearn.preprocessing.KBinsDiscritizer
这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:

n_bins 每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征

encode 编码的方式,默认“onehot”
“onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该 类别的样本表示为1,不含的表示为0
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含 有不同整数编码的箱的矩阵
“onehot-dense”:做哑变量,之后返回一个密集数组。

strategy 用来定义箱宽的方式,默认"quantile"
“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为 (特征.max() - 特征.min())/(n_bins)
“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同 “kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同

你可能感兴趣的:(机器学习)