书接上文,进行数据清洗过程后,我们得到了没有空值、异常值、错误值的数据,但想要用海量的数据来建立我们所需要的算法模型,仅仅是数据清洗的过程是不够的,因为有的数据类型是数值,有的是字符,怎样将不同类型的数据联系起来?以及在保证最大化信息量的前提下,怎样得到便于分析的数据?这就是特征预处理要做的工作。
一、理论基础
1. 基本概念
特征预处理是数据预处理过程的重要步骤,是对数据的一个的标准的处理,几乎所有的数据处理过程都会涉及该步骤。在进行特征预处理之前需要确定标注,即标签(label)。标注的选择主要与我们的目的相契合,比如要探究不同种族、不同地区的人们长寿是否与性别相关,那么性别就可以作为标注来表明我们的目的。
2. 一般步骤
2.1 特征选择
目标是寻找最优特征子集。特征选择能剔除与标注不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。
之所以要考虑特征选择,是因为机器学习经常面临过拟合的问题。 过拟合的表现是模型参数太贴合训练集以及验证集数据,在训练集上效果很好而在测试集上表现不好。简言之模型的泛化能力差。过拟合的原因是模型对于训练集数据来说太复杂,要解决过拟合问题,一般考虑用特征选择的方法对数据进行降维。
特征选择的思想主要有三种:
- 过滤思想:在n个特征中,对每个特征 x(i),分别计算 x(i) 相对于标注 y 的信息量 S(i) ,得到 n 个结果。然后将 n 个 S(i) 按照从大到小排序,输出前 k 个特征。显然,这样数据的复杂度大大降低。那么关键的问题就是使用什么样的方法来度量 S(i) ,我们的目标是选取与 y 关联最密切的一些 特征x(i)。
- 包裹思想:基于留出法(hold-out),将特征全集X划分为两个互斥的集合,其中一个集合作为训练集S,另外一个作为测试集T,即X=S∪T,S∩T=0。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的评估。将训练集根据特征子集选择方法选出特征子集,对于每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出特征子集。需要先选定特定算法,通常选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。
- 嵌入思想:先使用某些机器学习的简单回归模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征(采用这个方法有比较大的风险,要慎重选择用哪个回归模型)。
2.1.1 过滤思想
2.1.1.1 皮尔逊(pearson)相关系数
特征选择与提取最全总结之过滤法 - 腾讯云开发者社区-腾讯云 (tencent.com)
相关系数是衡量特征与标注相关性最直接简单的方法,取值范围在[-1,1],当相关系数接近或等于0时,说明该特征与标注的相关性很小或不相关。皮尔逊相关系数可以用来探究任何数据类型之间的相关性,即使有离散非二值的数据,经过定序处理后也可用相关系数的方法。
以下代码为相关系数的输出,若要遍历特征全集根据相关系数筛选特征,还需要通过函数或方程等方法遍历全集。
import pandas as pd
s1=pd.Series([0.1,0.2,1.1,2.4,1.3,0.3,0.5])
s2=pd.Series([0.5,0.4,1.2,2.5,1.1,0.7,0.1])
s1.corr(s2,method='pearson ') #输出s1、s2之间的相关系数