前言
构建多元线性回归模型时,如果能够充分的使用已有变量,或将其改造成另一种形式的可供使用的变量,将在一定程度上提高模型精度及其泛化能力。因为数据集中的名义变量(或叫类别变量)是无法直接使用的,所以虚拟变量(又叫哑元变量)的设置便是非常经典且必须掌握的一步,原理简单,实现优雅,效果拔群。原理趣析
至于虚拟变量的官方解释和值得参考的短小精悍的论文集和虚拟变量的深度应用及拓展,笔者都已经打包放在了后台,文末查看关键字回复即可。因为虚拟变量的原理其实非常简单,所以如何有趣且快速的理解原理并应用于实际的 Python 程序才是本文的侧重点。 将无法直接用于建模的名义变量转换成可放入模型的虚拟变量的核心就短短八个字:四散拆开,非此即彼。下面用一个只有4行的微型数据集辅以说明。 从上表中,不难发现:该名义变量有 n 类,就能拆分出 n 个名义变量
巧妙的使用 0 和 1 来达到用虚拟变量列代替原名义变量所在类别
效果实现
数据读入 属性说明neighborhood:所在街区(A,B,C,D)
area:房屋面积
bedrooms:卧室面积
bathrooms:浴室面积
style:房屋类型(乡间小屋/维多利亚/阁楼式)
price:房屋价格(美元)
抽出希望转换的名义变量(一个或多个)
Python pandas 的 get_dummies 函数
与原数据集横向拼接
结果说明
所以最终的建模结果为:房屋价格 price = 344.39×area + bedrooms×5609.34 - bathrooms×4900.94 - A×77.9 + B×524381.71 - 203072.2,模型精度为 0.919.
等式结果中,截距项 Intercept 和 area,bedrooms,bathrooms 等项都还好理解,A,B 这两个虚拟变量项可能会给理解带来困难。其实根据原理趣析部分的表格来看,如果房屋在C区,那等式中 A 和 B 这两个字母的值便是 0,所以这便引出了非常重要的一点:使用了虚拟变量的多元线性回归模型结果中,存在于模型内的虚拟变量都是跟被删除掉的那个虚拟变量进行比较。所以这个结果便表示在其他情况完全一样时(即除虚拟变量外的项) A 区的房屋比 C 区低 77.9 美元,B 区则比 C 区贵524381.7 美元。当然我们也可以画个箱线图来查看与检验,发现结果正如模型中 A 与 B 的系数那般显示。
注:相关数据源和超详细的代码(python,Jupyter Notebook 版本 + 详细注释)已经整理好,在 “ 数据分析与商业实践 ” 公众号后台回复 “ 虚拟变量 ” 即可获取。还有,虽然模型精度比较理想,但在使用 ols 进行建模时,结果表格下方其实还显示了如下的 Warnings(警告),表明可能存在比较强的多元共线性问题,这也是提升多元线性回归模型精度和泛化性的非常经典且简单的操作,篇幅原因,就放在文末链接了?
多元共线性检测 -- 方差膨胀因子