本文是Python商业数据挖掘实战的第3篇


1 - 基于不平衡数据的反欺诈模型实战


2 - Apriori算法实现智能推荐


3 - 随机森林预测宽带客户离网

前言

组合算法也叫集成学习,在金融行业或非图像识别领域,效果有时甚至比深度学习还要好。能够理解基本原理并将代码用于实际的业务案例是本文的目标,本文将详细介绍如何利用Python实现集成学习中随机森林这个经典的方法来预测宽带客户的流失,主要将分为两个部分:


详细原理介绍


Python代码实战

原理+代码|深入浅出Python随机森林预测实战

集成学习

本文的主角是随机森林,所以我们将以随机森林所属的分支 —— 装袋法 入手,深入浅出该集成学习方法的原理步骤。装袋法流程如下

原理+代码|深入浅出Python随机森林预测实战

乍一看图中的步骤可能有些复杂,现在来逐步拆解。装袋法中的装袋二字是精髓,顾名思义即将多个模型装入同一个袋子后,让这个袋子作为一个新的模型来实现预测需求,仅此而已。换句话说,即把多个模型组合起来形成一个新的大模型,这个大模型最终给出的预测结果是由这多个小模型综合决定的,决定方式为少数服从多数。

假设有10万条原始数据,用这些数据来做十棵决策树(当然也可以是其他模型),最后这10棵树将被装进了同一个袋子中。这时候取其中一条数据放入这个袋子,便会得出10个预测值(每棵树各一个),假如其中三棵树给出的预测值为0,剩余的七棵给出的为1,那我们便可知道这个袋子对这个数据的预测结果为 0 的概率是 3/10。

为了更深入的理解装袋法,下面将回答三个与装袋法有关的常见问题:

问:袋子中的每个模型使用的样本量范围应为多少合适?

答:如果是上面的例子,袋子里面有十棵树,源数据总量为 10万 条,则每棵树取用的样本量的最小值为最少是1w个(10w/10棵 = 1w/棵),因为至少要保证不能浪费样本,但每棵树最多可取用多少样本呢?其实在样本量已知,同一袋子中模型个数为n的情况下,样本的选择比例为1/n ~ 0.8最好。每个小模型取用 100% 的样本是绝对没有意义的,那就跟没抽是一样的,这样也就没有体现出装袋,只有每个模型用到的数据都有一定的不同,组合起来后每个的投票(预测结果)也才有意义。

问:袋中模型们之间的相关性会影响最后的决策结果吗?

答:装袋法思路最重要的一点:袋子中每个模型之间不能相关,越不相关越好,这里的不相关主要体现在用于训练每个模型的样本不一样。其次,每个模型的精度越高越好,这样它的投票才更有价值。

PS:训练模型的样本不一样这一点可以理解为总统选举,抽 10 波选民来投票,这 10 波选民的差异性越大越好,这样一来,只有在选民千差万别的情况下你依然脱颖而出,才足以说明你的实力,如果这10波选民中每一波之间的差异性都很小,比如都是本来就偏袒于总统候选人,那投票结果的说服力就会大减。

问:上面所说的模型精度高是不是哪怕模型很复杂也可以,如果每个模型的精度高但都过度拟合怎么办?

答:在装袋法中,模型是越精确越好,哪怕是过度拟合的也没有关系。因为一个模型要想在训练集上做到越精确越好,而精确程度与模型的复杂度大多是成正比的,所以出现过拟合的情况也是正常且情有可原的。复杂和过度拟合只是对袋子中每个模型而言,因为最后都会被加权,所以整个袋子(整体)并不会出现过度拟合的情况。

随机森林

随机森林的实现步骤如下:

原理+代码|深入浅出Python随机森林预测实战

有关随机森林算法,本文说明以下几个问题

问:为什么在列上也要随机抽样?

答:在引入笔者最最喜欢的一个比喻之前,先来看一个实际的业务场景,来自某城市商业银行。我们有一大个电子表格存着大量的历史数据,大概50多个变量(50多列),变量们来自几个不同的公司如人行,电信等(同一个客户在不同公司),最后希望预测的是该客户是否会违约。电子表格组成如下:

原理+代码|深入浅出Python随机森林预测实战

而根据基础的业务知识可知,与银行有关的数据中往往会存在许多缺失值,以上图为例,通常情况下只有待预测的变量这一列的数据是齐全的,毕竟客户们是否违约这个行为的历史数据很容易查找,但蓝框和绿框这两部分的缺失值往往较多,而且较随意,具体随意程度参见下图:

原理+代码|深入浅出Python随机森林预测实战

红框表示数据缺失,这里只展示了部分行和部分列数据,如果这份数据表的规模为 4万行 * 50列,那这数据缺失的分布得有多随意啊