在机器学习和数据挖掘中,数据处理相关的工作时间往往占据整个项目的70%以上。数据的质量,决定了模型预测和泛化能力的上限,训练过程只是在逼近这个上限。
数据的质量涉及多个方面,包括准确性、完整性、一致性、时效性、可解释性等。在真实数据中,往往包含了大量缺失值,噪声,以及人为因素导致的误差或异常点。这样的数据很不利于训练得到好的模型。
特征工程和数据预处理就是要得到干净的、有价值的数据,提供给数据挖掘使用。
特征方案
一般讨论数据预处理,往往比较强调如何由采集的数据提取或组合得到新的特征。从数据中获取主要成分,或因子。但这一定程度上忽视了明确分析问题所需的特征对数据采集的指导意义。
在解决任何问题前,首先离不开对问题的建模分析。明确什么特征能帮助分析和解决问题,什么数据中含有这些特征。这些都是建立在对业务的理解和数学建模的基础之上的。好的特征工程很好的混合了专业领域知识、直觉和基本的数学能力。
在明确了需要的特征,再去有目的性的采集数据,而不是盲目的从采集的数据中寻找特征。目标特征决定要采集的数据,有了采集到的数据再去思考如何进行数据处理来得到有用的特征。两者是相互影响,相互决定的。
此外在决定特征及采集的数据时,还要考虑数据在可获得性、采集、存储性能方面的问题,兼顾采集可行性、采集效率、时效性。
特征处理
可以把对采集数据的特征处理分为数据清洗和数据预处理两个部分。
数据清洗
就数据清洗而言,主要任务就是通过处理缺失值和离群点来解决数据不一致的问题。
缺失值处理
采集的数据中某些变量的值常常可能缺失。最好的策略当然是把含有缺失值的观测数据一同丢弃。但一般我们没有那么大的数据样本来允许我们这么做。针对缺失的数据,主要根据变量的分布特性和重要性采取不同的方法。
删除变量:如果某个特征变量缺失率很高,并且重要性较低,可以直接去掉这个变量。
统计值填充:如果特征变量的缺失率较低,则可以根据数据分布的情况进行填充。对于数值变量,如果数据符合均匀分布,可以用现有数据的均值来代替缺失值;如果数据分布存在倾斜的情况,则可以采用中位数进行填充。对于离散变量,用最可能出现的值,或常出现的值来代替缺失值。
插值填充:线性插值、拉格朗日插值、牛顿插值。
模型填充:通过已知的其他变量来预测缺失变量,根据数据类型,定义相应的回归或分类问题。将未丢失数据的那部分样本作为新问题的训练数据。
有一些具有特殊含义的数据,不能简单视为离散或数值变量的,采用一些标量值表示缺失含义即可。
离群点检验
离群点是一个实例,它与样本中其他实例非常不同。可能表示系统的异常行为,或是采集中过程中产生的误差。离群点检测一般不设计成监督的、将典型实例和离群点分开的分类任务。因为通常只有少数实例会被标记为离群点,而且它们并不拟合一个可以很容易被一个二类分类器捕获的模式。
相反,被建模的是典型实例,有时称为一类分类。一旦对典型实例建模,那么不拟合典型实例模型的任何实例都是离群点。但需要意识到,训练数据集也是未标记的,可能包含离群点和典型实例。
离群点检验就是要发现那些不正常的实例。也就是说它是密度估计,并检查估计密度下的小概率实例。在参数模型下,可以使用高斯模型拟合整个数据,并且任何具有低概率的实例,都是一个离群点的候选。在半参数的情况下,可以拟合混合高斯分布,选出具有小概率的实例。
对于符合正态分布的数据集,可以通过排除以外的数据,来排除异常离群点。更简单地,基于箱线图对数据进行截断,排除离群点。
但当用于拟合模型的数据本身就包含离群点时,非参数密度估计更有意义。因为模型的参数越多,对离群点的出现就越不鲁棒。
在非参数密度估计中,附近有越多实例的地方,估计密度越高。令是实例x 与它的第k个最近邻实例间的距离,
是x 的邻域中训练实例的集合。对
,计算
如果LOF(x) 接近1,表示 x 周围的密度较均衡,x不是离群点;随着LOF(x)变大,x是离群点的概率提高。
在机器学习任务中,需要排除异常数据对我们了解一般情况实质所带来的障碍。但是有的时候,考虑如何看待“黑天鹅”,恐怕也是值得花费心思的。
其他数据清洗方法
其他比较常见的数据清洗任务包括:
- 删除无效列
- 更改数据dtypes
- 删除列中的字符串
- 将时间戳字符串转换为日期时间格式
数据预处理
数据预处理可分为数据变换和数据规约。
数据均衡
正负样本数据量不均衡的情况,要如何处理
https://www.analyticsvidhya.com/blog/2017/03/imbalanced-data-classification/
数据变换
数据变换只对单个特征变量在数值上的处理,包括规范化、离散化、稀疏化。
1、规范化处理
也就是数据的归一化和标准化。数据中不同的特征由于量纲往往不同,数值间差距可能非常大,会影响到数据分析的结果。需要对数据按照一定比例进行缩放,保持数据所反映的特征信息的同时,使之落在合理范围内,便于进行综合分析。
一般基于样本间距离的机器学习方法,都离不开对数据的规范化处理。有一些模型由于其不关心变量的值,只关心分布情况,故不需要进行规范化处理。例如基于概率模型的方法,或如C4.5分类决策树依靠数据集关于特征的信息增益比,归一化不会影响结果。
常用方法包括:
- 线性归一化:
等
- 非线性数据变换:
对数函数,常用于数据量级非常大的场合。
反正切函数,用于将角频率转换到
范围内。
- 标准化(z-score):
,使数据服从标准正态分布
2、离散化处理
指将连续的数据进行分段,称为离散化的区间,或称分箱处理。
分段的原则有基于等距离、等频率等方法。一个常见的例子是对年龄的分段,对不同年龄段的人群进行一定的分析。
离散化的原因是因为一些模型是基于离散的数据的,如决策树。有时将数值属性转换为类别属性更有意义,有效的离散化能减少算法的空间时间开销,提高系统对样本的分类聚类能力和抗噪声能力。
只有了解属性的领域知识,确定属性能够划分为简洁的范围时,离散化分区才有意义。也就是说,要保证落入一个分区的数值具有某种共同的特性。
3、稀疏化处理
对于离散型类别标签数据,通常将其做0、1哑变量的稀疏化。尤其将原始字符串形式的数据数值化,例如将颜色属性转换为数值。
除了决策树等少量模型能直接处理字符串输入,对于逻辑回归、SVM等来说,数值化处理是必须的。
如果特征的不同值较多,则根据频数,所有出现次数较少的值可以归为同一类。
一般采用的方法有Ordinal Encoding、One-hot Encoding、Binary Encoding。对于只有两个类的情况,通过{0,1}对应两个类即可。而如学历数据,{学士,硕士,博士}也可以采用Ordinal Encoding方法对应为{1,2,3}。但对于颜色数据,如{红,黄,蓝},采用{1,2,3}来表示则不合适。这是因为在数学意义上,会出现红色与黄色比红色与蓝色更相似的情况()。所以除非属性有明显的序列性质,否则更适合用One-hot Encoding方式编码。
4、交叉处理
交叉特征处理是非常重要的方法之一,它将两个或更多的类别属性组合为一个。在组合的特征比单个特征更好时,这是一项非常有用的技术。数学上来说,是对类别特征的所有可能值进行交叉相乘。
假如拥有一个特征A,A有两个可能值{A1,A2}。拥有一个特征B,存在{B1,B2}可能值。然后,A&B之间的交叉特征如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)}
数据规约
数据规约用来得到数据集的规约表示,使数据集更小,同时接近原数据的完整性。实现维度的减低,可以从现有维度中选取(特征选择),或组合现有维度来实现(维度规约)。组合维度提取特征的内容可见《维度规约(特征的提取和组合)》。
特征选择
特征选择意在删除不重要的属性,来减少数据量,同时保持信息的损失最小。可以分为三类方法。
1、filter过滤法
按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。通过卡方检验、皮尔逊相关系数、互信息等指标判断哪些维度重要,剔除不重要的维度。
-
方差选择
计算各特征的方差,根据阈值,选择方差大于阈值的特征。
-
相关系数
计算各特征与目标值的相关系数及相关系数的P值。选择相关系数较大的特征。
但注意对于与目标值非线性相关的特征,不可草率地根据反映线性相关性的相关系数过滤。
-
卡方检验
卡方检验统计量的含义简而言之就是自变量对因变量的相关性。选择卡方值排在前面的K个特征作为最终的特征选择。
-
互信息法
互信息也是评价定性自变量对定性因变量的相关性的。
同样选择互信息排列靠前的特征作为最终的选取特征。
过滤法方法与学习器无关。
2、wrapper包装法
使用一个基模型进行多轮训练,每次选择若干特征,或者排除若干特征。根据目标函数(通常是预测效果评分),来决定各特征是否重要。通常结合遗传算法或模拟退火算法等搜索方法来对选取特征。(Las Vegas Wrapper方法)
3、embedded嵌入法
该方法基于机器学习的算法和模型进行训练,学习器通过训练自动对特征进行选择。
如使用L1范数作为惩罚项的线性模型(例如lasso回归)会得到稀疏解,大多数特征对应的系数为0。从而实现了特征选择。
特征构造
特征构造用于增强数据表达,添加先验知识。实际上一些数据变换、数据规约的操作本身就属于特征构造。常见的基于原数据的特征构造有
- 统计量特征——计数、求和、比例、标准差···
- 时间特征——绝对时间、相对时间
- 非线性变换——log/平方/根号···
- 数据分桶——等频/等距分桶、Best-KS分桶、卡方分桶···
- 特征组合
附注:《【机器学习】数据预处理与特征工程》中使用scikit-learn对不同数据处理方法做了比较全面的介绍,推荐大家参考学习。