1. 说明
本文并非介绍某个成熟算法或者工具,只是个人的一点感悟,写得可能不正确,不全面,希望能给大家带来一些启发,也欢迎各位回复讨论。
2. 特征工程
大数据相关的工作可简要地归纳为:模型部分和数据部分,在模型部分,目前大家的做法主要是拿现成的模型来用,对其做内部修改或重写的很少,主要工作在选型和调参。
相对来说,对数据部分做的工作更多,在比赛中数据都是固定的,且很多时候数据已脱敏,特征工程能做的不太多,而真实场景中,往往能从复杂数据中提取更多信息,因此如期何提取以及筛选信息就变得尤为重要。
3. 筛选
筛选分为筛选实例和筛选特征,如果把整体数据看成一张表,就是删行或者删列。
在实际应用时,常遇到的一个难题是:怎么把人的经验和算法结合起来,特征工程是一个重要的入口,一方面我们可以用经验构造更多特征,另一方面,也可以通过经验选择合理的实例代入模型,以及分配权重。
4. 特征筛选
(1) 为什么筛选
对特征的筛选主要是去掉无关特征,无关特征一般有两种影响:在数据量大的情况下,影响训练速度,在数据量少的情况下,带来更多误差。像天池的汽车上牌赛和糖尿病预测赛,前几名介绍经验,有的最终砍掉了多一半特征。在去掉无关特征的同时,也突显了主要特征,对进一步提取因果关系,以及解释模型也有很大作用。
(2) 如何筛选
有一些特征,明显没啥用,比如缺失值特别多的;和其它特征重复的;某特征的取值对结果不构成任何影响的;另外一些,并不容易察觉,比如某特征对结果有影响,却是一种噪声数据,把模型给带偏了,这种特征一般只能在训练模型的过程中发现。
5. 实例筛选
(1) 为什么选筛
i. 数据量大
数据并不是越多越好,如果数据量非常大,比如电商中的购买记录,是海量数据,训练起来,任何一个模型都无法承受,此时,可以随机选取一部分数据训练。选取时,尽量均匀采样,可以采取一些规则优先提取更有规律的数据。
ii. 有噪数据
数据中常有一些显而易见的错误,比如:“身高为162米”,这种单位错误,还有一些缺失数据多或者缺失关键特征的实例。这种错误非常明显,一般是由于操作人员的失误,或者前后版本格式不一致造成的,发现后删除或修改(如果能修正,还可以继续使用),见招拆招就可以了。
iii. 数据不合理
这种情况非常重要,又常被忽略,人的经验往往能在此处发挥巨大作用。主要的情况有:实例的因果关系不合逻辑;同样的条件引发不同的结果。
比如某君只得了脚气,结果死了,能不能得出结论说:一定是脚气致死的。也许这个人本身有其它病症(比如心脏病),但在当前的特征中并未提取到。
也就是说根据已知条件,不能形成任何有效推论,或者形成的推论违背常理,下次遇到了此情况,不能由此因推出此果。与留着这种规则在这儿搅和,不如把它删掉。
iv. 可预测与不可预测――不可避免的黑天鹅事件
事件的发生,有一部分是可控的,一部分是随机的,像海啸地震,它们是可能发生又无法预期的。我们可以从结果中分析出原因,却无法事先提取“因”作为特征,比如我们知道地震会影响旅游业,却不知何时地震。这样的实例,即使做出了模型,也用不上。对于这种意外事件,也建议去掉。
(2) 如何筛选
在一开始统计和分析数据的过程有一些特殊的实例和特征可以被发现。我们也可以选择少量实例,进行人工数据分析。
在实例和特征都很多,不可能一一过目,且我们也希望让模型自己发现一些规律的情况下,可以尝试:先用所有数据训练一个模型,把数据都代入模型并预测,然后分析主要特征,并把预测结果不正确筛出来分析原因,或者只用正确的单独训练模型。
(3) 筛选之后怎么处理
特殊数据处理起来相对复杂。它往往取决于数据的质和数据的量。
比如训练集一共十万条数据,筛完后就剩一万条了,此时模型就变成了一个只适合特殊情况的“小众”逻辑。如果按同样的分布,预测集中也有九成都是不可预测的,此时,就需要先想想那九成不能代入模型的,应该怎么处理?比如实在无法使用模型,用一些统计值(如均值、中值),也不失为一种方法。
另一种方法是保留大部分数据,但为不同的实例分配不同权重。如果模型支持,可为典型的事例赋予更大的权重,如模型不支持权重设置,简单的方法是构造更多的典型实例代入模型。
需要注意的是:我们对实例的任何处理,都可能引入误差。是增是删还是改的权衡往往反应的是开发者对数据和业务逻辑的理解。
6. 写在最后
我们常常觉得某些意外情况发性的概率不大,在海量数据中往往可以忽略不计,因而无需额外处理。但忽略不计的前提是其它大量数据都是有规律可循的;在整体规律不太明显的情况下,还是需要额外处理一下。
做模型就像养孩子,虽然人类的基因决定,可以通过历练打磨,自我学习,他能从现实中学习出很多的关系和规则,但我们更愿意把“确定是对的”东西直接教给他,这样可以少走很多弯路。
另外,预测的背后有一个重要因素:不确定性——并不是所有情况都可以被预测,如果我们能把需要预测的问题分为模型“可预测的”和“不可预测”的,比如在操作股票的情况下,只对可预测的情况“作为”,也不失为一种选择。
实际场景中,我们不只是模型的实现者,作为服务的设计者,能做的更多。比如说提示,由于信息太少,或者缺少关键信息,而无法预测,也好过勉强给出一个瞎蒙的预测结果。