聚类分析的过程和两个常用的聚类算法

聚类分析过程

一般聚类分析的数据源是需要相对干净的,即需要做统一的特征清洗、特征变换过程,即空值、非法值、异常值、类别变量等的处理。主要过程如下:

数据采集:我们可以认为是统一的ETL过程,这里涉及埋点、转发、存储、提取等过程。是典型的数据分析前置过程。

特征变换/特征选择:聚类对异常数据特别敏感,同时原始数据直接进入聚类分析不大现实。特征处理包含行维度、列维度的处理,行维度主要包括:空值、非法值、异常值等方面的处理,而列维度涉及降维处理,冗余的列对聚类影响较大,所以一般聚类分析之前会做一次PCA。

聚类分析、聚类评估:下文将重点举例描述

结果解读:无监督学习,一般没有label,聚类的数量也是未知的,需要结合业务知识进一步解读聚类结果,比如从用户画像维度进一步切分同个分类的数据,从统计维度挖掘特征。

知识发现:解读结果之后,需要落地实现或者输出报告,我们把这个过程称为知识发现的过程。聚类结果产生的label结果,往往可以作为监督学习的来源。

下面举两个经典的聚类分析算法进一步说明。

Kmeans

基于距离聚类的聚类算法

算法步骤:
1、根据设定分类数量,随机生成N个中心点
2、每个点计算与中心点距离,按最近距离合并分类
3、基于2重新计算每个分类的中心点
4、重复2~3,直到中心点收敛

sklearn实现

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)
pred = kmeans.fit_predict(X)

聚类效果

GMM

高斯混合模型是几个高斯分布的叠加,每一个分布代表一个分类

算法步骤:
1、设定分类数量
2、对每一个高斯分布均值、方差随机初始化
3、计算每个样本的在各个高斯分布的概率、权重值,Expectation-step
4、根据最大似然重新估算高斯分布均值、方差,Maximization-step
5、重复3~4直到高斯分布均值和方差收敛

sklearn实现

from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3)
gmm = gmm.fit(X)
pred_gmm = gmm.predict(X)

聚类效果

模型评价

GMM和KMeans分类结果有一定的随机性,可能得到局部优化解,需要多次微调。
GMM是概率分类结果,可以对比topN分类,比如文档聚类;GMM计算代价更大,大数据集是个负担。

评估指标

聚类算法的评估主要衡量两个方面:同类紧密程度、类间分散程度;从不同指标看,同类越紧密、类间越分散,聚类效果越好
基本上为无监督聚类,所以“Rand Index”之类的指标不是太实用,常用EIBOW方法 ,根据SSE评估聚类效果,另外对于聚类结果评估可以采用以下两种方式:

1、Silhouette index

    s = (b-a)/max(a,b)
    ai:同分类内,单点与其他点的平均距离
    bi:分类中的点与最近分类点的平均距离
    a:所有点ai的均值
    b:所有点bi的均值

基于轮廓的衡量方法,可能不适合 Single link、Complete link、DBSCANE等聚类方法。

2、Calinski-Harabasz
CH指标通过“同类”、“类间”协方差矩阵的迹(各个变量的方差)衡量,计算速度较快。

聚类分析的过程和两个常用的聚类算法

机器学习PIPELINE

pipeline这个词,应该来自linux。在linux体系下的各种命令工具的处理,支持pipeline,即管道机制,例如:

cat xxx | awk '{xxxx}' | sort | uniq 

这是一种良好的接口规范,工具的功能有公共的接口规范,就像流水线一样,一步接着一步。机器学习的处理过程,也可以是pipeline。实际上scikit-learn开发了整套的pipeline机制,并封装到 sklearn.pipline命名空间下面。首先,我们看看这个库都有什么:

pipeline.FeatureUnion(transformer_list[, …])    Concatenates results of multiple transformer objects.
pipeline.Pipeline(steps[, memory])  Pipeline of transforms with a final estimator.
pipeline.make_pipeline(*steps, **kwargs)    Construct a Pipeline from the given estimators.
pipeline.make_union(*transformers, **kwargs)    Construct a FeatureUnion from the given trans

可以看出,最关键的是 FeatureUnion、Pipeline,我们继续看看这2个对象都可以实现什么功能。

Pipeline

sklearn中把机器学习处理过程抽象为estimator,其中estimator都有fit方法,表示“喂”数据进行初始化or训练。
estimator有2种:
1、特征变换(transformer)
可以理解为特征工程,即:特征标准化、特征正则化、特征离散化、特征平滑、onehot编码等
该类型统一由一个transform方法,用于fit数据之后,输入新的数据,进行特征变换。

2、预测器(predictor)
即各种模型,所有模型fit进行训练之后,都要经过测试集进行predict所有,有一个predict的公共方法

上面的抽象的好处即可实现机器学习的pipeline,显然特征变换是可能并行的(FeatureUnion)可以实现,变换在训练集、测试集之间都需要统一,所以pipeline可以达到模块化的目的。举个NLP处理的例子:

# 生成训练数据、测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y)

# pipeline定义
pipeline = Pipeline([
        ('vect', CountVectorizer()),
        ('tfidf', TfidfTransformer()),
        ('clf', RandomForestClassifier())
])

# train classifier
pipeline.fit(X_train, y_train)

# predict on test data
y_pred = pipeline.predict(X_test)

显然,看起来pipeline训练过程只需要fit和predict,其实在pipeline内部传输过程,自动调用了fit\transform

FeatureUnion

上面看到特征变换往往需要并行化处理,即FeatureUnion所实现的功能。直接看例子:

pipeline = Pipeline([
('features', FeatureUnion([
    ('text_pipeline', Pipeline([
        ('vect', CountVectorizer(tokenizer=tokenize)),
        ('tfidf', TfidfTransformer())
    ])),
    ('findName', FineNameExtractor())
])),

('clf', RandomForestClassifier())
])

看起来,pipeline还可以嵌套pipeline,整个机器学习处理流程就像流水工人一样。上面自定义了一个pipeline处理对象FineNameExtractor,该对象是transformer,实际上自定义个transformer是很简单的,创建一个对象,继承自BaseEstimator, TransformerMixin即可,直接上代码:

from sklearn.base import BaseEstimator, TransformerMixin
class FineNameExtractor(BaseEstimator, TransformerMixin):

    def find_name(self, text):
        return True

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        X_tagged = pd.Series(X).apply(self.find_name)
        return pd.DataFrame(X_tagged)

执行一个PIPELINE,可能还少了点什么,再加上自动调参就完美了,是的,sklearn的调参通过GridSearchCV实现,pipeline+gridsearch简直是绝配。GridSearchCV实际上也有fit、predict方法,所以,你会发现,整个sklearn的机器学习是高效抽象的,代码可以写的很简洁。

机器学习PIPELINE

Cross-Industry standard process for data mining.

数据挖掘方法论,答曰:CRISP-DM

大概分为以下六个步骤:
1、业务知识/ Business understanding
2、指标含义/ Data understanding
3、数据准备/ Data preparation
4、建模训练/ Modeling
5、模型评估/ Evaluation
6、模型部署/ Deployment

对于开发人员,往往直接从3开始,而忽略1、2,其中2是苦力活。从模型评估看,一般模型优化方法会重新返回2进行调整。重点提下“数据准备”大概包含:
0、特征列挑选
1、列空值处理、行空值处理(直接删除、采用统计量替换、线性预测)
2、分类变量处理,one-hot编码
3、归一化处理
4、连续变量分段(比如年龄、收入)
...

crisp

从实用性角度出发,可能并非一定要5、6,模型结果可以直接通过用户分群,通过运营系统或者报告阐述的方式输出结果。

Cross-Industry standard process for data mining.