python k-means聚类分析_011-10-读书笔记:聚类分析

python k-means聚类分析_011-10-读书笔记:聚类分析_第1张图片

原文:《Python 数据分析与数据化运营》第4章:跳过运营数据分析和挖掘的“大坑”

  1. 聚类是数据挖掘和计算的基本任务,是将大量数据集中具有“相似”特征的数据点或样本划分为一个类别。
  2. 聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索分析,也适用于样本量较大情况下的数据预处理工作。
  3. 常用的聚类算法分为基于划分、层次、密度、网格、统计学、模型等类型的算法,典型算法包括K均值、DBSCAN、两步聚类、BIRCH、谱聚类等
  4. 聚类分析能解决的问题包括:数据集可以分为几类、每个类别有多少样本量、不同类别中各个变量的强弱关系如何、不同类别的典型特征是什么等。但是聚类无法提供明确的行动指向,聚类结果更多是为后期挖掘和分析工作提供预处理和参考。

聚类分析算法选择:

  1. 高维数据选择谱聚类,是子空间划分的一种。
  2. 数据量为中小规模(100万条以内),K均值是比较好的选择;超过100万条,可以使用Mini Batch KMeans。
  3. 数据集有噪点(离群点),使用基于DBSCAN可以有效应对该问题。
  4. 追求更高的分类准确度,选择谱聚类比K均值更好。

代码示例:

import 

python k-means聚类分析_011-10-读书笔记:聚类分析_第2张图片
#训练模型
n_clusters = 3
model_kmeans = KMeans(n_clusters=n_clusters, random_state=0)
model_kmeans.fit(X)
y_pre = model_kmeans.predict(X)

#模型效果指标评估
n_samples, n_features = X.shape
inertias = model_kmeans.inertia_ #样本距离最近的聚类中心的总和
adjusted_rand_s = metrics.adjusted_rand_score(y_true, y_pre) #调整后的兰德指数
mutual_info_s = metrics.mutual_info_score(y_true, y_pre) #互信息
adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y_true, y_pre) #调整后的互信息
homogeneity_s = metrics.homogeneity_score(y_true, y_pre) #同质化得分
completeness_s = metrics.completeness_score(y_true, y_pre) #完整性得分
v_measure_s = metrics.v_measure_score(y_true, y_pre) #V-measure得分
silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean') #平均轮廓系数
calinski_harabaz_s = metrics.calinski_harabaz_score(X, y_pre) #Calinski和Harabaz得分

print('samples: %d t features: %d' % (n_samples, n_features))
print(70 * '-')
print('inetARItMItAMIthomotcomptv_mtsilhtc&h') #打印输出指标标题
print('%dt%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%d' % (inertias, adjusted_rand_s, mutual_info_s, adjusted_mutual_info_s, 
                                                           homogeneity_s, completeness_s, v_measure_s, silhouette_s, calinski_harabaz_s))
print(70 * '-')
print('short name t full name') #缩写和全名
print('ine t inertias')
print('ARI t adjusted_rand_s')
print('MI t mutual_info_s')
print('AMI t adjusted_mutual_info_s')
print('homo t homogeneity_s')
print('comp t completeness_s')
print('v_m t v_measure_s')
print('silh t silhouette_s')
print('c&h t calinski_harabaz_s')

python k-means聚类分析_011-10-读书笔记:聚类分析_第3张图片
#模型效果可视化
centers = model_kmeans.cluster_centers_ #各类别中心
colors = ['#4EACC5', '#FF9C34', '#4E9A06']
plt.figure()
for i in range(n_clusters):
    index_sets = np.where(y_pre==i) #找到相同类的索引集合
    cluster = X[index_sets] #将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.') #展示聚类子集内的样本点
    plt.plot(centers[i][0], centers[i][1], 'o', markerfacecolor=colors[i], markeredgecolor='k', markersize=6) #设置各聚类子集的中心
plt.show()

python k-means聚类分析_011-10-读书笔记:聚类分析_第4张图片
#模型应用
new_X = np.array([1, 3.6]).reshape([1, -1]) #注意这个地方预测数据重组的形状
cluster_label = model_kmeans.predict(new_X)
print('cluster of new data point is: %d' % cluster_label)

ce77e36d3eca9311e0b57556af8c33b1.png

其他:

在SKlearn中,几乎所有的算法类库都使用相同的模式做算法训练:

  1. 通过算法函数建立算法模型对象
  2. 对模型对象使用fit方法做模型训练
  3. 对模型对应应用predict方法做模型预测
  4. 此外还有其他score、getparams、set_parames等方法

Sklearn中的算法效果评估一共有3种方式:

  1. 算法模型对象的score方法,在创建的算法对象中可直接使用该方法,例如:model_tree.socre(X_test, y_test)
  2. 使用交叉验证的模型评估工具的评分参数,例如使用 sklearn.model_selection.cross_val_score() 方法返回的得分为交叉检验得分数组
  3. metrics 库的评估指标,可用来对模型选择、分类算法、聚类算法、回归算法、多标签学习、双聚类、配对算法等主题进行评估。

注意事项:

K均值算法的关键问题之一是:如何在不确定样本分类数的前提下定义K值。

聚类结果评估主要考虑三个方面:

  • 1.对于没有任何聚类真实结果指标的,由于无法使用真实数据作对比,只能使用聚类距离指标做评估;、
  • 2.对于有分类真实结果可做对照的,可以使用真实标签与预测标签的相似、重复、完整性等度量计算,需要注意的是,聚类结果的标签值与其真实类别的标签值没有关系,结果只关注是否属于同一类,而对于类的标签值是1还是3则不关注;
  • 3.业务类的评估,包括不同类别间的特征是否有显著差异,类内部是否具有能代表类别的显著性特征,不同类别内的样本量分布是否相对均匀等。另外,也可以通过可视化的形式,从聚类结果中发现是否存在异常的类别点等。

你可能感兴趣的:(python,k-means聚类分析)