Kmeas 特征处理的经验

2,834 阅读4分钟
原文链接: mp.weixin.qq.com

      本文是我同事谢思发同学的文章。Kmeans 聚类算法是数据挖掘十大算法之一。这里总结一些使用 Kmeans 的心得主要是特征的处理方面。

枚举型特征


  根据Kmeans原理,枚举型的特征不适用于 Kmeans 聚类特征是英雄的类型,取值1-5。首先在聚类过程中会对特征取均值,而对枚举特征取均值没有意义。另外 Kmeans根据空间距离的远近数据点进行聚类的。这样,在算法层面上,取值 1 的实例取值 5 的实例更接近取值 2 的实例,但在实际意义中,不同类型的实例间不存在远近的关系。其他算法中,如 LR,会将枚举型特征进行 one-hot 编码,像类型特征会转换成一个长度为 5 的特征向量,根据类型将对应位置的值设为1。但是这种方法不适合Kmeans 聚类在 Kmeans 防止某些大值属性的数据左右样本间的距离特征进行正规化处理,一般会将特征转换到 0-1 中。在归一化处理后,只取值0/1的特征就会变成强特征,对聚类有很大的影响。一个直观的理解,假设只有两特征,其中一个取值0/1。那么归一化处理后,样本的分布会位于两条线段上,大致如下:

对这些数据进行聚类的话,如果初始点分布在两侧,那么两条线段的数据会被分开,只会在两条线段上分别进行聚类。位于不同线段两个,它们间的距离大于等于1,大于线段两两点之间的距离同理在三维中,如果有特征只取值0/1,那么数据是分布在两个正方形聚类也很可能个面内单独进行。所以如果采用one-hot编码,那些0/1特征在很大程度上就决定了聚类结果,其他特征的重要性变很小了。但有时这种枚举型数据又很重要,可以很好地用来刻画实例,那么我们的做法是在聚完类后,将聚类结果和枚举数据做交叉分析。看在每类中,枚举值的分布情况。

长尾特征


我们进行用户行为分析时,会用到和用户行为相关数据做特征,比如登录次数、登录时长和好友数等。这些数据一般会有长尾问题。并且有些特征之间存在线性关系,用户在一个特征上的取值大时,在其他特征上的取值也会较大。比如活跃用户在一个登录时长长,好友数很大可能是比较大的。这时候特征分布如下所示,极端用户影响 kmeans 对普通用户的刻画。

查看图片

可以看到下面分布图中,80%的数据分布在1%的空间内,而剩下的20%的数据分布在99%的空间内。聚类时,分布在1%空间内的大部分数据会被聚为一类,剩下的聚为一类。当不断增加K值时,模型一般是对99%空间内的数据不断进行细分,因为这些数据之间的空间距离比较大。而对分布在1%空间内的数据则很难进一步细分,或者即使细分了,也只是剥离出了外侧少量数据。下图是我们在某个项目中的聚类结果,可以看到有一类用户占了90%以上,而且随着K的增加,这类用户里只有很小一部分数据会被划分出来。

查看图片 

那么为了解决这个问题,一种可行的方法是是对特征取LOG,减轻长尾问题。经过这两种方法处理后,都能较好的对玩家进行分类。下图是上图中的数据点取LOG后得到的分布图。

查看图片

特征值取LOG后,k=4的分类结果。

 

 查看图片

 

取LOG的方法的缺点在于,会使数据变得不直观,不好理解。

总结


  谢同学是单身,你懂的。

查看图片