建模数据的预处理的过程中,变量分箱(即变量离散化)往往是较为核心一环。变量分箱的优劣往往会影响模型评分效果。
上一步:数据预处理——缺失值、异常值、重复值处理
下一步:变量显著性检验——计算 WOE、IV
那么本篇文章要解决2个问题:
1. 变量分箱的必要性
2. 三类变量分箱方法的及注意要点
一、变量分箱的必要性
知其然知其所以然:我刚开始接触建模时,只是看着其他建模流程中存在这个操作,但却不知道为什么要进行变量离散化,实践过后发现分箱主要有以下4个好处:
1.1 对异常数据有很强的鲁棒性:比如一个特征是会话时长=702341sec,换算成天是8.1天,这属于明显的异常值。如果特征没有离散化,一个异常数据“会话时长=8.1天”会给模型造成很大的干扰;在很多网页分析系统中,0点之后会话将被强行切分,所以会话时长不可能超过1天。
1.2 在逻辑回归模型中,单变量离散化为N个哑变量后,每个哑变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
1.3 缺失值也可以作为一类特殊的变量进入模型
1.4 分箱后降低模型运算复杂度,提升模型运算速度,对后后期生产上线较为友好在真正生产环境中,模型的反馈时效是非常重要的指标。一般地,如果反馈时间超过200ms,系统会返回一个超时的默认结果,以避免用户产品体验变差。
二、三类变量分箱方法的及注意要点
3.1 无序变量分箱
举个例子,在实际模型建立当中,有个 job 职业的特征,取值为(“国家机关人员”,“专业技术人员”,“商业服务人员”),对于这一类变量,如果我们将其依次赋值为(国家机关人员=1;专业技术人员=2;商业服务人员=3),就很容易产生一个问题,不同种类的职业在数据层面上就有了大小顺序之分,国家机关人员和商业服务人员的差距是2,专业技术人员和商业服务人员的之间的差距是1,而我们原来的中文分类中是不存在这种先后顺序关系的。所以这么简单的赋值是会使变量失去原来的衡量效果。
怎么处理这个问题呢,“一位有效编码” (one-hot Encoding)可以解决这个问题,通常叫做虚变量或者哑变量(dummpy variable):比如职业特征有3个不同变量,那么将其生成个2哑变量,分别是“是否国家党政职业人员”,“是否专业技术人员” ,每个虚变量取值(1,0)。为什么2个哑变量而非3个?
在模型中引入多个虚拟变量时,虚拟变量的个数应按下列原则确定:
1.回归模型有截距:一般的,若该特征下n个属性均互斥(如,男/女;儿童/青年/中年/老年),在生成虚拟变量时,应该生成 n-1个虚变量,这样可以避免产生多重共线性。
2. 回归模型无截距项:有n个特征,设置n个虚拟变量
【1】国家党政职业人员= 1 &专业技术人员 =0,则为国家党政职业人员;
【2】国家党政职业人员= 0 &专业技术人员 =1,则为专业技术人员;
【3】国家党政职业人员= 0 &专业技术人员 =0,则为商业服务人员;
使用pandas可以很方便的对离散型特征进行one-hot编码:
# python 实现
import pandas as pd
df= pd.DataFrame([['专业技术人员','A',1],['国家机关人员','C',2],['国家机关人员','A',1],['商业人员','C',4],['国家机关人员','B',5]],columns=['job','class','value'])
df = pd.get_dummies(df,columns&#