PySpark如何找到适当数量的集群

Posted

技术标签:

【中文标题】PySpark如何找到适当数量的集群【英文标题】:PySpark how to find appropriate number of clusters 【发布时间】:2019-10-15 17:04:33 【问题描述】:

当我使用 Python 和 sklearn 时,我绘制肘部方法来找到适当数量的 KMean 集群。当我在 PySpark 中工作时,我也想做同样的事情。我知道由于 Spark 的分布式特性,PySpark 的功能有限,但是,有没有办法获得这个数字?

我正在使用下面的代码来绘制肘部使用肘部方法来找到最佳的聚类数 从 sklearn.cluster 导入 KMeans

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

【问题讨论】:

【参考方案1】:

我认为最后一个答案并不完全正确。然而,第一个答案是正确的。看 Pyspark.ml.clustering model.summary.trainingCost 的文档和源代码,就是 Sklearn 在 Pyspark 中的惯性。在link可以找到文字:

这相当于sklearn的惯性。

剪影分数由 pyspark.ml.evaluation 的 ClusteringEvaluator 类给出:见link

Sklearn 的 Davies-Bouldin index 和 Calinski-Harabasz index 尚未在 Pyspark 中实现。但是,它们有一些建议的功能。例如Davies-Bouldin index。

【讨论】:

【参考方案2】:

我以另一种方式做到了。使用 Spark ML 计算特征的成本并将结果存储在 Python 列表中,然后绘制它。

# Calculate cost and plot
cost = np.zeros(10)

for k in range(2,10):
    kmeans = KMeans().setK(k).setSeed(1).setFeaturesCol('features')
    model = kmeans.fit(df)
    cost[k] = model.summary.trainingCost

# Plot the cost
df_cost = pd.DataFrame(cost[2:])
df_cost.columns = ["cost"]
new_col = [2,3,4,5,6,7,8, 9]
df_cost.insert(0, 'cluster', new_col)

import pylab as pl
pl.plot(df_cost.cluster, df_cost.cost)
pl.xlabel('Number of Clusters')
pl.ylabel('Score')
pl.title('Elbow Curve')
pl.show()

【讨论】:

【参考方案3】:

PySpark 不是绘制 eblow 方法的正确工具。要绘制图表,必须将数据收集到 Pandas 数据框中,这在我的情况下是不可能的,因为数据量很大。另一种方法是使用silhouette analysis,如下所示

# Keep changing the number of clusters and re-calculate
kmeans = KMeans().setK(6).setSeed(1)
model = kmeans.fit(dataset.select('features'))
predictions = model.transform(dataset)
silhouette = evaluator.evaluate(predictions)
print("Silhouette with squared euclidean distance = " + str(silhouette))

或者通过计算Within Set Sum of Squared Errors来评估聚类,解释here

【讨论】:

以上是关于PySpark如何找到适当数量的集群的主要内容,如果未能解决你的问题,请参考以下文章

如何访问安装在 hdfs 头节点集群内的 pyspark

如何将pyspark数据帧写入不同的hadoop集群

如何提交依赖于 google dataproc 集群的 pyspark 作业

Hive:通过 Hue 插入表格产生的文件数量与 pyspark 不同

Pyspark:如何在 Yarn 集群上运行作业时对多个文件使用 --files 标签

如何使用 pyspark 管理跨集群的数据帧的物理数据放置?