热线电话:13121318867

登录
首页精彩阅读手中无y,心中有y——聚类算法的正确建模方式
手中无y,心中有y——聚类算法的正确建模方式
2021-12-10
收藏
手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

CDA数据分析师 出品

作者:CDA教研组

编辑:JYD

聚类算法是属于无监督机器学习方法;机器学习里把算法分为有监督无监督的算法,所谓有监督,即我想研究的数据集有目标数据,白话点就是建模里大家常说的那个y,如我想基于公司数据库已经有的相关数据集训练一个模型,用来预测客户是否会流失,从数据库中得到的数据集里是有一个特征(一列)是客户是否流失的,可能1代表流失,0代表不会流失;但业务的初期或者数据库中没有该特征,即手中无y,那该怎么办?如对客户进行价值分群,此时对于这种目标明确,但确实缺少y这一列这种分析需求,可考虑聚类算法来实现。

首先简单阐述一下聚类算法的思想,其逻辑是计算观测值之间的距离,然后根据距离来进行分组(簇),目的是组内之间的距离尽可能小,而组与组之间的距离大(即差异大)来达到分类(分组)的目的,得到的结果可以用来做数据挖掘

回到我们的标题,我们说聚类算法是无监督机器学习,没有y,那怎么还说心中要有y呢?我们看下面的一个例子。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图1

如图1给出一些弹珠,我们的需求是将这些不同差异的弹珠做聚类分析,可这些弹珠不同的差异太多了在不同的角度上,如果你心里没有目的,是很难将这些弹珠做好聚类分群的。

如果我们的目的是根据弹珠的体积大小这个目的进行分群的话,可能会聚成三类,即图2里的大中小三种体积;

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图2

如果我们的需求是根据弹珠的透明程度,可能会分成图3所示的2类:透明的一类和不透明的一类;

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图3

那如果我们的关注点是弹珠的颜色,可能会成为图4所示的几类,红色系、黄色系、蓝色系和紫色系等;

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图4

上面的例子我们可以看到,即使对于同一笔资料,根据需求的不同,聚类分群的结果也不太一样,如果一个商业需求,分析师没有目的或者会错需求的话,那挖掘出来的结果大概率是不会满意的。

聚类算法要解决三个问题:

1.如何表示观测值之间的相似性

2.如何根据这些相似性将类似的观测值分到同一个类

3.对所有的观测值分好类之后,如何对每一个类(群、组、簇这些说法都可)进行特征描述

对于第一个问题,怎么计算观测值之间的相似性呢,计算距离,常见的计算距离方法有曼哈顿距离、欧式距离。

图5是曼哈顿距离的公式和演示

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图5

曼哈顿距离,即算直角距离,如图5中object1和object2两个观测点的虚线(直角)距离就是曼哈顿距离,R是指相应特征的范围;图6是一个计算的例子。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图6

两个观测值,分别有年纪和收入两个维度,对其使用曼哈顿距离计算其距离为0.4。

下面要讲的另外一种距离是欧式距离,欧式距离我们很早就接触过,比如两个点在二维坐标轴上x(x1,x2)和y(y1,y2)他们的欧式距离平方就是(x1-y1)^2+(x2-y2)^2;

图7是欧式距离的公式,欧式距离是Minkowski距离的一种推广。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图7

这就是使用计算距离的公式来表示观察与观察之间的相似性。

那么第二个问题:如何根据这些相似性将类似的观测值分到同一个类?这就是涉及到聚类的算法。

聚类算法根据样本的不同处理会有很多种方法,这里会介绍层次聚类和基于划分聚类里的kmeans聚类(该两种聚类商业上经常用)。

层次聚类,也有译成系统聚类,指的是形成类相似度层次图谱,便于直观的确定类之间的划分。该方法可以得到较理想的分类,但是难以处理大量样本。

层次聚类的算法步骤是:

1.计算点与点之间的距离

2.将最近的两个观测点聚为一类,将其看做一个整体(类)计算与其他类之前的距离

3.一直重复上述过程,直至所有的观测被聚为一类

如图8是系统聚类的一个聚类过程演示:首先计算点与点之间的距离,如我们计算点1和点3之间的距离,发现其两个点相对来说较近,我们把该两个点化为一类叫类1,我们发现点2和点5距离第二近,所以也合并起来归为一个类2,接着计算发现,点4与点5较为近,但是点5已经和点2合并了,所以呢点4、点2和点5合并成类3,接着点与点的距离矩阵告诉我们点1和点2的距离为第四近,但是点2、5、4已经是类3了,点1也属于类1,所以类1和类3合并成类4,类4再和点6合并为最后的类5。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图8

分层聚类到底分几个类呢,往往是通过层次树(树形图)来结合业务来决定的,图9是上面演示聚类结果的层次树。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图9

层次树的x轴是观测点,y轴是距离,聚类分析的目的是组内之间的距离小,组与组之间的距离尽可能大(差异明显),从y轴画一条平行于x轴的直线,如我在y轴0.1到0.15之间画一条平行x轴的直线,与层次图有4个交点,意思是说分成了4个类(组),且这时组间距离是最大的(有4个交点的上平行线和下平行线之间的距离),1和3分成一组,2和5分成1组,4,6单独一个组,这时算法角度给出的最优分组,但是也要结合业务场景,比如算法角度给出分成20组组间差异最大,但是分成20个群进行针对性营销显然大部分业务是不合适的。

我们刚才说,近的点划分到一个类,那么怎么计算类与类之间的距离?如果把各观测点圈在一个椭圆里的话,即怎么去计算两个椭圆的距离?

计算类与类之间的距离方法也有很多,如平均链接法、重心法、Ward最小方差法;下面只介绍用的频率高的Ward最小方差法。

所谓Ward最小方差法,是思想是使各个观测之间的离差平方和最小。

图10是该方法的计算公式,其特点是较少受到异常值的影响,适用范围广。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图10

图11数据演示怎么计算各观测之间的离差平方和

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图11

以上图为例,一开始如果将AB合成一组,那么此时SS的值是

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

如果将CD合成一个组,其SS值是

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

当合并成3组时,如果是AB、CD和E的组合,那么SS的值是1+4+0=5,以同样的计算方式,可以得到不同的分组情况和相应的SS值,如下图。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式
手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

我们找出SS值最小的分组,上图看到分成4群即AB分成一类,C、D、E单独一类离差平方和最小(为1),分成3群时最小的SS值是3.5,其他情况下的分群数量最小SS值也可看出。

接下来我们讲层次聚类的建模流程。

1. 针对业务需求,我们select到相关的数据集,通常要经过处理才能进行分析:

a) 缺失值

b) 异常值(极大或极小)

c) 分类变量需要转化为哑变量(0/1数值)

d) 分类变量类别过多

当然有些算法允许有缺失值异常值等资料,如决策树,但聚类不支持这些情况,所以要处理。

2.要做变量标准化

变量的量纲的不一样引起计算距离的偏差,因此要统一,统一的方式有两种方法:

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

3.不同维度的变量,相关性尽量低

图12演示了大部分公司业务普遍性的变量分类模式,如图12,将数据分成购买记录数据(如消费频率、消费的间隔周期等)、消费习惯行为等数据(如消费的区域)、第三方行为数据(如网络浏览偏好等)。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图12

4.层次聚类演示和确定聚类

层次聚类的一大优点是可以结合聚类可视化来对聚类结果进行业务上的理解和验证,图13是几个省份的经济数据聚类结果,肉眼观察,如果你分成4的话,那上海、广东是单独一类,天津、广西、福建、辽宁、河北是另外一类,浙江、江苏、山东、是第四类,那么现在看看算法的聚类跟我看左图的肉眼观察是否一致,如果一致,那说明算法在解释上也是很好的;

不过看右边的树形图展示,其两类是建议的,即福建、辽宁、河北、天津、广西是一类,其他省份为另外一类,因为这样划分类与类之间的距离最长(差异最大),这里根据你的聚类观察结合业务需求分成4类,或者根据算法的建议分成2类且能在商业情景下能够得到解释也可(这里根据当时各省的情况,上海跟山东划分一类应该不合理的,上海是一线城市,这里分成4类合适点)。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图13

值得一提的是层次分类可以得到较为理想的分类数量,但是难处理大量样本数据。所以我们需要讲另外一种聚类方法。

第二种要讲的聚类是叫kmeans聚类,也就是我们常说的k均值聚类

Kmeans聚类的算法步骤:

1.选择数据,初始化中心点

2.将离中心点较近的点划分到相应的类

3.更新类的中心

4.重新将离数据近的点划分到相应的类

5.反复进行上面3,4步骤,直到分类的结果不再变化

图14是该算法一个简单的演示。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图14

首先在我需要分类的数据上随机选5个中心点(即K=5),然后计算观测点与中心点的距离,划分到相应的中心点所属的群里,接着不用第一次设置的中心点,现在重新设置5个中心点的位置,继续计算观测点与现在中心点的位置,基于远近划分到相应的5个不同群中,反复重复这种设置中心点,划分数据这种操作,直到数据的划分情况不再发生变动。

Kmeans聚类的建模流程同层次聚类一样,即

1.预先处理变量的缺失值异常值

2.变量标准化

3.不同维度的变量,相关性尽量低

4.确定合适的分群个数

不过在K值选择上主要推荐轮廓系数(Silhouette Coefficient),并结合以下注意事项:

  • 分群结果的稳定性
  • 重复多次分群,看结果是否稳定
  • 分群结果是否有好解释的商业意义

图15是轮廓系数的公式

样本轮廓系数

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

整体轮廓系数

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图15

其中a(i)表示观测i到同一类内观测点距离的均值,b(i)表示观测点i到不同类内所有点距离的均值的最小值,S(i)表示观测i的轮廓系数,若a(i)小于b(i)则说明该观测点在聚类的类中是合理的,此时a(i)/b(i)的值趋向于0,那么S(i)越接近1,聚类的效果越好;若a(i)大于b(i),说明观测点还不如在别的类中,聚类的效果不好,此时b(i)/a(i)的值趋向于0,从而S(i)趋向于-1,若a(i)=b(i),则不能判断观测点i在哪个类效果中较好,此时S(i)为0,S(i)的值域-1到1,其值越小表示聚类的效果越差,其值越大代表聚类效果好,将所以观测点的轮廓系数值相加求均值,就可以得到整个已聚类数据集的轮廓系数,同样,衡量其聚类好坏的标准与单个观测点的轮廓系数的衡量方式是一致的。

不过这里还需注意一下,Kmeans处理大量样本聚类有优势,但聚类的结果展示上不如层次聚类有好理解和可解释性,所以使用kmeans聚类后,所做的聚类事后分析,往往要借助决策树形图来辅助理解。

5.聚类事后分析

聚类分好后需要拿来给营销相关人员看,这就需要分类的结果可解释性好:里面到底是怎么根据不同维度来将数据分群的,然后跟业务经验得到验证;这里借助决策树的可视化(决策树图)来实现,我们知道决策树有监督的学习方法,这里的处理就是把上面聚类算法得到的类别看成目标y,根据之前的各维度特征来使用决策树算法。如图16是一个先聚类后再用决策树的一个可视化结果展示。

手中无y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚类</a>算法的正确建模方式

图16

怎么看决策树的可视化图呢,从上到下,最上面的叫根节点,其中value是一个含四个元素的列表,意思是分成4类,往下的剪头叫拆分,直到不能再拆分的每个“矩形”叫叶子节点,中间衔接的“矩形”叫决策节点;

那怎么从决策树形图看出分类结果的好坏以及对每个群进行描述达到可解释的目的?

我们看value里是否其中一个元素的数值要远远大于其他的,如在第三层,value=18750远远大于47,1060,29,意思是说有18750个点被划分到了class为2的类里,这一层其他class类的划分情况也是很“干净”的,所以决策树在第三层的时候(划分4类)分类效果就很好了;

那么怎么解读呢,比如class2的用户群特点是:不用柜台(TBM<-0.07)、也不用ATM POS机(ATM POS<=-0.374),那么显然这类客户什么都不用,说明在该银行业务当中,class2这类群体是流失客户,再看看class0这类群体特征:不用柜台,但是用POS机,很可能是这些喜欢方便,取款金额频繁,取款金融少等这些特点的人群,其他两个类同样可以根据这种树形图来解释。

回答第三个问题,对所有的观测值分好类之后,如何对每一个类进行特征描述?

聚类的结果要详细的作描述性统计,甚至作抽样的客户访谈,以了解客户的真实情况,因此让业务人员满足客户管理的目标,是聚类的终极目的。

上述建模流程是聚类的一般性流程,其实就应用角度来说,快速聚类两种运用场景是:

1. 发现异常情况:如果不对数据进行任何形式的转换,只是经过中心标准化或级差标准化就进行快速聚类,会根据数据分布特征得到聚类结果。这种聚类会将极端数据聚为几类。这种方法适用于统计分析之前的异常值剔除,对异常行为的挖掘,比如监控银行账户是否有洗钱行为、监控POS机是有从事套现、监控某个终端是否是电话卡养卡客户等等。

2. 将个案数据做划分:出于客户细分目的的聚类分析一般希望聚类结果为大致平均的几大类,因此需要将数据进行转换,这种方法适用场景包括客户消费行为聚类、客户积分使用行为聚类等等。

文章的最后,我们再来总结一下本文的内容,就算法角度,讲了层次聚类和kmeans聚类,就建模层面来说,通常的流程是:变量归一化=>分布转换=>主成分=>聚类,归一化我们是希望剔除掉不同量纲,范围的影响(因为要计算距离),而分布转换这个步骤是因为我们希望将客户均匀的分为若干类,在变量上,我们希望不同维度下的变量,相关性程度较低,对于多维的数据集来说,可以使用主成分分析来将变量进行降维;而使用聚类算法得到分群数量需要进行事后分析,来跟业务经验进行验证,达到可解释且可进行客户画像的目的。

如果应用需求是发现异常情况下的聚类,其流程为变量归一化=>主成分=>聚类,因为这种需求会根据数据分布特征得到聚类结果,未分布转换情况下,这种聚类会将极端数据聚为几类,从而帮助我们对异常行为进行挖掘。

数据分析咨询请扫描二维码

最新资讯
更多
客服在线
立即咨询