数据挖掘是当下十分火热的一个职业,几乎各行各业都需要这方面的人才。博主是刚从事数据挖掘工作的一枚小白,此专栏用来记录学习数据挖掘的点点滴滴,希望有助于和我一样小白选手快速入门和避坑,同时欢迎大神指出博文中的错误。
根据博主目前已经参加过的几个建模项目,以及向公司大牛们的请教,愈发发现数据建模工作存在着一些固定的套路,学会这些套路有助于新手更快更好地完成数据挖掘的项目,并能让你在数据挖掘道路上走得更远。
在开始数据建模工作之前,博主其实看了蛮多关于数据挖掘的书籍,以为自己可以 hold 这个职位。但是,真正从事数据建模工作后,可以说只能用 “纸上谈兵” 来形容自己,我甚至搞不清楚在数据建模分为几个阶段,要先做什么后做什么,模型原理更是一知半解。随着自我的学习以及大佬们的指教,慢慢懂得数据挖掘工作一般步骤与套路,熟记这些建模的步骤与讨论,能让你明确当前任务是什么,下一步任务又是什么,每一步任务中应该注意的一些问题。
机器学习中最常见的两类问题是有监督学习和无监督学习,关于其概念这里不做非常详细的解释,百度上有很好的博客解释这个概念,后续会有专门一篇博客讲解有监督学习和无监督学习的相关概念,以及都有哪些模型属于有监督学习,哪些模型属于无监督学习,请参考 有监督学习和无监督学习。
首先,需要明确的是需要解决的问题是属于哪一类问题,是有监督学习下的分类问题还是回归问题?还是无监督学习下的聚类问题等。接下来,需要先确定模型的 Target (即 y y y ),也就是你最终想要预测的东西是什么。
本篇博客以最常见的二分类问题,讲述一下建模的一般步骤。
在明确了我们需要解决的问题属于哪一类问题之后,我们就可以基本确定使用哪些模型来解决这个问题。既然模型已经确定了,那么我们下一步就需要准备相应的数据来让模型进行训练。
首先需要确定数据的时间窗口,我们并不需要拿全部的数据进行模型训练,只需要挑选某些月份的数据来预测下一个月的结果(或者下一天),在进行时间窗口的选择,需要注意哪些月份的数据存在异常,避免模型开发进入到后期阶段,才被别人指出所选择时间窗口的数据在业务上存在着明显的异常,这样就就显得非常尴尬了。
在确定了时间窗口之后,我们需要确定 In-Time 和 Out-of-Time(OOT) ,以及 Validation(val,也可以看作是 oot2) 数据集。这里以 20181001 ~ 20190430 作为我们模型的时间窗口,那么 In-Time 数据集时间窗口可以选用 20181001~20190228,OOT 数据集的时间窗口为 20190301 ~ 20190331,Validation 数据集的时间窗口可以选用 20190401 ~ 20190430。
这里只是初步拟定各个数据集下的时间窗口,在后边变量创建完之后,还需要回过头来填写各个时间窗口下数据集的详细信息(数据量、Target Rate 等),保持一个良好的记录习惯,能让你在初步完成模型开发任务之后,能够很好地回溯整个过程以及发现其中的不足。
各个时间窗口被确定下来之后,接下来就是创建模型所需要的变量。创建模型的变量也是有迹可循的,一般是常规套路+头脑风暴。
常规套路指的是,通过全方面能描述对象的变量。以用户是否会购买网站会员为例,我们可以将所要创建的变量分为几个大类:
根据实际不同的问题,所归纳出来的大类也是不同,但是规则是能通过这些大类的变量能够将对象全面描述出来,并对适当的变量进行向下拆分。此外你可能还需要构建一些衍生变量,衍生变量的创建一般可以通过 RFM(Recency、Frequency、Monetary)、WOE 等方面来构建:
头脑风暴则指的是,跳出一般的套路之外,构建一些脑洞大开的变量,这些变量应在业务上就有着非常重要的可能性,并期盼这些变量能够在模型中起到好的效果。
变量的工作完成后,需要来评价你所创建的变量效果如何,通常有以下几个手段来进行评价:
我们最终的期望是,通过尽可能少的变量来训练模型,并且能让模型达到较好的预测精度。
完成第三步工作之后,有些模型需要对数据进行一定的正则化处理,这一步是可选的,因为有些模型并不需要。常见的正则化操作有以下几种,且 Scikit-Learn 中也提供了相应的包来使用:
方法 | 功能 | 简介 |
---|---|---|
StandardScaler | 标准化 | 均值-标准差化数据标准化 |
MaxMinScaler | 标准化 | 极值化法数据标准化 |
Normalizer | 归一化 | 行记录单位化 |
Binaizer | 二值化 | 连续变量离散化 |
OneHotEncoder | 分类编码 | 将定性数据编码为定量数据 |
Imputer | 缺失值填补 | 缺失值插补 |
PolynomialFeatures | 多项式变换 | 多项式数据变换 |
为了提高模型的准确度和泛化能力,需要对 In-Time 数据集进行切分。
模型训练的结果与参数的设置也存在很大的关系,合适的参数才能让模型得出接近于最好的效果。如果每次通过人工手动调整模型参数,会花费大量的时间,幸好 Scikit-Learn 提供了 GridSearch(网格搜索),可以一次性设置参数的范围,模型会自动这些参数依次带入模型中进行训练,并得出每组参数组合下的结果,简直就是一神器。
有兴趣的同学可以参考: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
正常来说,不同模型应该分开训练和调优,但是 Scikit-Learn 中也提供了 Pipeline 来一次训练多个模型,并得出不同模型下的预测结果,从而将不同模型一次性进行对比。
有兴趣的同学,可以参考: https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html
值得一提的是,在 SparkML 中也有 Pipeline 组件,非常好用。但是目前自己在真实建模项目中,还没有用到。
模型过拟合在模型开发中很常见,可以采取一些手段和方法来避免过拟合:
当完成最终模型的开发,你需要填写如下的表格,作为模型开发的文档。
月份 | 总样本 | 正样本 | 目标响应率 |
---|---|---|---|
2018-10 | |||
2018-11 | |||
2018-12 | |||
2019-01 | |||
总计 |
var_name | 变量说明 | coef(变量的系数) | std err(变量的方差) | z | P>|z| |
[95.0% Conf. Int.] | missrate | IV | VIF | FI | category |
---|---|---|---|---|---|---|---|---|---|---|---|
最后应该模型效果图包括分别在 In-Time(train 和 test) 和OOT 的预测表现。
模型变量在 train、test 和 oot 的表现(图)
重要变量的 WOE 和 IV 值(图)
woe 分 bin 后的矩阵表
变量 EDD 结果
数据字典