来自:《Python金融大数据风控建模实战-基于机器学习》
数据清洗与预处理是整个评分卡模型开发乃至整个机器学习模型开发过程中非常重要的部分,该过程非常耗时,所处理的问题虽不复杂,但需要耐心和毅力。
·数据集成:将多个数据源的数据构成一个统一的数据结构或数据表的过程。如果不同数据源有结构化数据与非结构化数据,数据集成时要统一转化为结构化数据,并存储在一个数据库或数据表中,已备后续模型开发时使用。
·数据清洗:即清除脏数据的过程,包括数据源自身与数据集成后产生的数据格式不一致、单位不一致、数据冗余等问题。
·探索性数据分析:是通过计算简单的统计量或用绘图的方法快速理解原始数据的形式,进一步了解数据,为特征工程提供参考,如可以观察数据中缺失值的情况,异常值的情况和变量分布等信息。
·数据预处理:对缺失值、异常值等脏数据进行处理的过程。由于大部分机器学习不支持缺失值建模或对异常值敏感,缺失值与异常值会影响模型效果,因此,数据预处理非常必要,可以保证模型的准确性。
需要注意的是:在评分卡模型中,缺失值是非常重要的特征,往往不需要填补,可直接作为特征进行编码或分箱后再进行编码;异常值也是非常重要的特征,尤其在反欺诈模型中,更不能提前处理异常值,而在其他评分卡模型中,如果进行变量分箱,异常值也不处理,直接作为参数进行分箱即可。
(一)在数据集成的过程中需要考虑数据的完整性、一致性和唯一性
1、数据完整性
在数据集成时,要考虑集成后数据的完整性问题。通常,基本信息数据、消费数据与行为数据覆盖率会明显不足。
数据的完整性需要分不同的情况进行考虑。如果希望不同数据源的数据都比较完整,则数据集成时要尽量取不同数据源之间的交集。这样可以保证每个数据源的数据完整性比较好,而不会出现数据合并时产生额外的缺失值。如果认为某个数据源的权威性最高,如征信数据,可以将征信数据作为主表,其他数据源的数据与其进行左关联,以保证集成合并后的样本数与有征信的样本数相同。这样做的好处是保证了征信数据的样本量,其他数据在集成合并时,如果没有记录则用缺失值填充或用特殊意义的字符填充。显然,不同数据源集成时,会因为数据源间的数据覆盖率不一致而造成新的缺失值,这时要根据实际情况,尽可能保证集成后的数据完整性较好。另外,还要考虑后续业务的影响,如后续业务更改为必须有征信数据的借款人才可能给予授信,则本次建模就一定要保证有征信的样本的缺失率较低才可以。同时,要保证建模数据的时效性,即使数据量不多也不能将观察期的时间范围无限放大,这样得到的模型很可能不符合未来的客群。
2、数据一致性
不同的数据源会有相似含义的变量,要保证合并后单位的一致性。例如,基础数据中有借款人的收入信息,征信数据中有信用卡或借记卡的消费信息,社保数据中有社保缴纳的基数和缴纳额度信息,这些变量的单位要统一。同时,信用卡数据中,有的信用卡额度是以美元为单位,这时也要统一进行处理。这种一致性的校验一定要在数据集成之前确定各个数据源的定义方式,否则数据集成后在数据清洗阶段很难发现单位不一致的问题,从而导致模型不准确。
3、数据唯一性
不同数据源中有些属性或字段可能是相同的,会存在不同名单意义相同的情况,集成时要做去冗余处理。有些字段虽然同名,但是表示的含义不同,集成时要加以分区。此外,当多个数据源的某个字段含义相同时,就出现了集成冲突问题。
一般来说,征信数据的权威性最高,而基本信息由于是用户自行编写的,所以权威性最低。集成时可以保留最权威的变量,也可以衍生一下数据不一致的标志特征,以提示该借款人可能误报了某些信息,如基本信息填写的收入较高,但是社保缴纳基数却较低或没有缴纳社保,这也是一个变量衍生的思路。
(二)探索性数据分析
1、数据范围
变量分为离散变量和连续型变量,在数据集成与数据清洗完成之后,需要确定原始数据中变量的性质,即区分离散变量和连续变量。最简单的方式可以通过观察原始数据的前几条记录进行手动区分,当然也可以自动区分变量性质,如将数据读取成功后,判断数据类型,将整型或浮点型的数据直接划分为连续变量,而数据类型为字符串的为离散变量,如果为日期类型则分为日期变量。
变量性质区分后,需要直观地观察变量的取值范围。例如,离散变量需要观察变量的可能值,连续变量可以计算简单的统计值,如均值、方差、最大值、最小值和分位数等。
2、数据缺失情况
不同的数据源本身的数据覆盖率问题导致了不同程度的数据缺失情况。另外,在数据集成时也会产生缺失值,因此需要确定每个变量的数据缺失情况,对于数据缺失严重的变量应删除。注意,在评分卡建模中,缺失值是一种非常重要的特征,往往不需要进行缺失值填补,而应直接作为特征进行变量编码或先分箱后编码,而其他领域的缺失值需要填补才可以满足机器学习模型的输入要求(只有少部分模型不需要处理缺失值可以直接建模,如决策树模型)。缺失值填补的方法很多,如均值填补、中位数填补、随机森林模型填补等。缺失值填补是数据预处理部分的工作,评分卡模型会将缺失值作为特征进行处理。离散变量缺失值作为特征直接进行变量编码,连续变量缺失值作为特征先进行分箱,即缺失值单独作为一箱,然后对分箱后的结果进行变量编码。
3、异常值分析
异常值也是影响模型效果的重要因素。如果选择的机器学习模型或模型选择的损失函数对异常值敏感,则模型会过多地关注异常值而出现过拟合问题,导致其模型的泛化能力会显著降低。例如线性回归模型、Adaboost模型、神经网络模型等都是异常值敏感的。
只有连续变量才需要处理异常值。在评分卡建模中,如果采用传统的评分卡建模方法,则异常值不需要处理。连续变量先进行分箱处理,变量分箱可以将异常值作为一箱,然后再进行变量编码。如果连续变量不采用变量分箱的方法,则需要进行异常值截断,以减少异常值对模型的影响。同时可以衍生一个异常值表示特征,如增加一个二值特征,即变量中是异常值时该行取值为1,不是异常值时该行取值为0,增加一个衍生变量。
在反欺诈模型中,异常值是非常重要的特征。反欺诈的目的就是找到与正常行为相违背的少数样本,反映在变量上就是那些偏离正常范围的异常样本。因此,异常值是否需要处理,还是与建模的目的有关系。
由于异常值可以通过变量分箱的方法处理,所以在变量分箱选择初始化分箱候选集时,需要先截断异常值,否则初始化分箱候选集会被异常值影响。另外,超出合理范围的异常值需要统一处理,如年龄大于100的样本需要进行截断。
4、变量分布
评分开模型是一个二分类问题。因此,对于离散型变量可以观察在变量的不同取值上好坏样本的比例,如坏样本占比,进而分析该离散变量中坏样本较高的是那种变量取值。对于连续变量,可以按照好坏样本分组,并对比好坏样本中的变量分布情况。另外,可以观察变量的分布是否极度不均衡,如离散变量中某个变量的可能取值是总样本的90%,就可以删除该变量。