使用DBSCAN和spark_sklearn

时间:2017-01-03 09:25:19

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

我想使用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(没有火花)来适应(dbscan_model.fit(temp_data-features))并从模型中获取标签(labels = dbscan_model.labels_)。如果我可以使用spark-sklearn获得'labels_'属性,那也没关系。

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

2 个答案:

答案 0 :(得分:0)

KMeans的情况下,我们可以预测群集标签,因为scikit-learn估算器提供了此功能。

不幸的是,对于其他一些群集来说情况并非如此,例如DBSCAN。

答案 1 :(得分:0)

我设法获得'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)