【问题标题】:Clustering data using DBSCAN and spark_sklearn使用 DBSCAN 和 spark_sklearn 对数据进行聚类
【发布时间】:2017-05-17 08:22:16
【问题描述】:

我想使用 DBSCAN 和 spark_sklearn 对我的输入数据进行聚类。我想在聚类后获取每个输入实例的标签。可能吗?

阅读http://pythonhosted.org/spark-sklearn 上的文档后,我尝试了以下方法:

temp_data = Spark DataFrame containing 'key' and 'features' columns, 
            where 'features' is a Vector.

ke = KeyedEstimator(sklearnEstimator=DBSCAN(), estimatorType="clusterer")
print ke.getOrDefault("estimatorType") --> "clusterer"

ke.fit_pedict(temp_data) --> ERROR: 'KeyedEstimator' object has no attribute 'fit_predict'

k_model = ke.fit(temp_data)
print k_model.getOrDefault("estimatorType") --> "clusterer"

k_model.fit_pedict(temp_data) --> ERROR: 'KeyedModel' object has no attribute 'fit_predict'

k_model.predict(temp_data) --> ERROR: 'KeyedModel' object has no attribute 'predict'

k_model.transform(temp_data) --> ERROR: estimatorType assumed to be a clusterer, but sklearnEstimator is missing fit_predict() 
(NOTE: sklearn.cluster.DBSCAN actually have fit_predict() method)

我通常使用 sklearn(没有 spark)做的是拟合(dbscan_model.fit(temp_data-features))并从模型中获取标签(labels = dbscan_model.labels_)。如果我可以使用 spark-sklearn 获取 'labels_' 属性也很好。

如果上述调用('transform' 或 'predict')不起作用,是否可以在使用 spark-sklearn 拟合数据后获取 'labels_'?我怎样才能做到这一点?假设我们获得了'labels_',我如何将输入实例映射到labels_?他们有相同的顺序吗?

【问题讨论】:

  • 避免使用包裹包裹软件的软件......将层堆叠到层会降低性能(并且 pyspark 已经以缓慢而闻名),并且您不再获得所有功能。

标签: apache-spark scikit-learn pyspark cluster-analysis dbscan


【解决方案1】:

这只是在KMeans 的情况下是可能的,我们可以预测集群标签,因为 scikit-learn 估计器提供了这个功能。

很遗憾,其他一些集群器(例如 DBSCAN)并非如此。

【讨论】:

  • 对于 DBSCAN,有没有办法获取输入实例的集群? sckit-learn 允许访问 'labels_' 属性。
  • @user2737636 是的,DBSCAN 有一个和 KMeans 一样的 labels_ 属性
【解决方案2】:

我已经设法获得了 'labels_' 属性;但是我仍然不知道结果标签的顺序是否与输入实例相同。

temp_data = Spark DataFrame containing 'key' and 'features' columns, 
        where 'features' is a Vector.

ke = KeyedEstimator(sklearnEstimator=DBSCAN())
k_model = ke.fit(temp_data)

def getLabels(model):
    return model.estimator.labels_

labels_udf = udf(lambda x: getLabels(x).tolist(), ArrayType(IntegerType()))("estimator").alias("labels")
res_df = km_dbscan.keyedModels.select("key", labels_udf)

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2014-07-24
    • 2016-05-01
    • 2020-08-24
    • 2021-10-19
    • 2014-01-18
    • 2014-10-02
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多