# 【火炉炼AI】机器学习027-项目案例：用聚类算法建立客户细分模型

## 【火炉炼AI】机器学习027-项目案例：用聚类算法建立客户细分模型

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

## 1. 准备数据集

image

image

（X=fresh y=milk）的数据分布图
(X=grocery, y=delicassen)的数据分布图

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

``````# 构建均值漂移聚类模型
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('\t'.join([col_name[:5] for col_name in col_names]))
for centroid in centroids:
print('\t'.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

——————————————–完————————————-

``````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()
``````

``````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

——————————————–完————————————-

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

``````# 使用轮廓系数评估模型的优虐
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，凝聚层次聚类等，看看其轮廓系数。

#################################################################

1, Python机器学习经典实例，Prateek Joshi著，陶俊杰，陈小莉译

原文作者：炼丹老顽童
原文地址: https://www.jianshu.com/p/314dc64be1c0
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。