机器学习入门之【火炉炼AI】机器学习027-项目案例:用聚类算法建立客户细分模型
小标 2018-11-28 来源 : 阅读 1524 评论 0

摘要:本文主要向大家介绍了机器学习入门之【火炉炼AI】机器学习027-项目案例:用聚类算法建立客户细分模型,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之【火炉炼AI】机器学习027-项目案例:用聚类算法建立客户细分模型,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

客户细分是市场营销成功的前提,我们从市场中获取的数据一般都没有标记,要想对这些市场数据进行客户细分,将客户划分簇群,这也是一种典型的无监督学习问题。

本项目拟用各种不同的聚类算法来建立客户细分模型,并比较这些聚类算法在这一问题上的优虐。


1. 准备数据集

本项目案例所使用到的原始数据集来源于: UCI大学数据集,这个数据集来源于一个批发商,一共包含有440个样本数据,每个样本数据包含有8列,但是其中的6列作为features,此处由于是无监督学习,不需要标记,故而只需要其中的六列数据,这些数据的说明如下表所示。


image

对于这6个features,数据集已经告诉我们这6列的min,max mean等信息,我把它们整理成一个表格,如下所示:


image

数据集的加载可以采用pd.read_csv函数来完成,代码可以参考我的github,下面我们随便选择两个feature,将其绘制到二维平面图上,看看这些数据点的分布情况,比如下图:


(X=fresh y=milk)的数据分布图


(X=grocery, y=delicassen)的数据分布图


2. 构建均值漂移聚类模型

本项目用均值漂移算法来构建模型,模型的构建和训练过程和我以前的文章【火炉炼AI】机器学习022-使用均值漂移聚类算法构建模型一样,如下代码,只不过该代码还打印出聚类后簇群的数量,并把每一种簇群的质心点位置打印出来。

# 构建均值漂移聚类模型from sklearn.cluster import MeanShift, estimate_bandwidth
bandwidth=estimate_bandwidth(dataset,quantile=0.8,
                             n_samples=len(dataset))
meanshift=MeanShift(bandwidth=bandwidth,bin_seeding=True)
meanshift.fit(dataset) # 使用评估的带宽构建均值漂移模型,并进行训练labels=meanshift.labels_
cluster_num=len(np.unique(labels))
centroids=meanshift.cluster_centers_# 下面打印出簇群种类,和质心位置信息print('Number of Clusters: {}'.format(cluster_num))
print(' '.join([col_name[:5] for col_name in col_names]))for centroid in centroids:
    print(' '.join(str(int(x)) for x in centroid))

-------------------------------------输---------出--------------------------------

Number of Clusters: 8
Fresh   Milk    Groce   Froze   Deter   Delic
9632    4671    6593    2570    2296    1248
40204   46314   57584   5518    25436   4241
16117   46197   92780   1026    40827   2944
22925   73498   32114   987 20070   903
112151  29627   18148   16745   4948    8550
36847   43950   20170   36534   239 47943
32717   16784   13626   60869   1272    5609
8565    4980    67298   131 38102   1215

--------------------------------------------完-------------------------------------

由此可见,均值漂移算法自动将本项目的数据集划分为8个不同类别,那么怎么查看聚类算法的效果图了?我先自定义了一个显示函数,用于展示各种不同聚类算法在不同数据集上的聚类效果,这个函数有一定的通用性,不仅可以可以用于均值漂移算法,还可以用于其他的各种聚类算法。如下为代码和运行结果。

def visual_cluster_effect(cluster,dataset,title,col_id):
    assert isinstance(col_id,list) and len(col_id)==2,'col_id must be list type and length must be 2'
    
    labels=cluster.labels_ # 每一个样本对应的簇群号码#     print(labels.shape) # (440,) 440个样本
    markers=['.',',','o','v','^','<','>','1','2','3','4','8'
                 ,'s','p','*','h','H','+','x','D','d','|']
    colors=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 
            'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']    
    # 将数据集绘制到图表中
    plt.figure()    for class_id in set(labels):
        one_class=dataset[class_id==labels]
        print('label: {}, smaple_num: {}'.format(class_id,len(one_class)))
        plt.scatter(one_class[:,0],one_class[:,1],marker=markers[class_id%len(markers)],
                    c=colors[class_id%len(colors)],label='class_'+str(class_id))
    plt.legend()        
    # 将中心点绘制到图中
    centroids=meanshift.cluster_centers_#     print(centroids.shape)# eg (8, 6) 8个簇群,6个features
    plt.scatter(centroids[:,col_id[0]],centroids[:,col_id[1]],marker='o',
                s=100,linewidths=2,color='k',zorder=5,facecolors='b')
    plt.title(title) 
    plt.xlabel('feature_0')
    plt.ylabel('feature_1')
    plt.show()

使用这个函数,我们可以看到本聚类算法在数据集上的表现,如下代码中,我们主要查看Fresh vs milk这一类产品的聚类效果。

visual_cluster_effect(meanshift,dataset,'MeanShift-X=fresh,y=milk',[0,1]) # X=fresh, y=milk

-------------------------------------输---------出--------------------------------

label: 0, smaple_num: 428
label: 1, smaple_num: 3
label: 2, smaple_num: 1
label: 3, smaple_num: 1
label: 4, smaple_num: 3
label: 5, smaple_num: 1
label: 6, smaple_num: 1
label: 7, smaple_num: 2

--------------------------------------------完-------------------------------------


均值漂移算法在数据集(X=fresh,y=milk)的表现

visual_cluster_effect(meanshift,dataset,'MeanShift-X=grocery,y=delica',[2,5]) # X=grocery, y=delicassen


均值漂移算法在数据集(X=grocery,y=delica)的表现

从上面的图中我们很难看出模型到底是好还是坏,那我们就用指标来判断吧,前面我们学习过轮廓系数,可以用来评估模型的优虐,如下是评价代码。

# 使用轮廓系数评估模型的优虐from sklearn.metrics import silhouette_score
si_score=silhouette_score(dataset,meanshift.labels_,
                          metric='euclidean',sample_size=len(dataset))
print('si_score: {:.4f}'.format(si_score))

-------------------------------------输---------出--------------------------------

si_score: 0.6548

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,本文的数据集基本上都是已经处理过的,我们只需要加载后即可使用。

2,构建均值漂移算法的模型和训练该模型非常简单,但是里面额quantile参数可能需要进行优化才能得到最佳值。

3,为了查看本聚类算法在数据集上的表现优虐,我们先通过数据可视化,将聚类之后的簇群以及簇群质心绘制到图标中,这是一个多features数据集,故而数据的可视化只能一次取其中的两列来查看。

4,另外,我们还用轮廓系数来评估模型的好坏,此处模型的轮廓系数为0.6548,貌似不是太差,但也不是太好,看来还有优化空间,或者,我们可以采用其他算法来构建模型,比如前面我们学习到的K-means,DBSCAN,凝聚层次聚类等,看看其轮廓系数。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved