我想使用 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_"属性也很好。
如果上述调用("转换"或"预测")不起作用,是否可以在使用 spark-sklearn 拟合数据后获得"labels_"?我该怎么做?假设我们获得了"labels_",如何将输入实例映射到labels_?他们有相同的顺序吗?
在 KMeans
的情况下,我们可以预测聚类标签,因为 scikit-learn 估计器提供了此功能。
不幸的是,对于其他一些集群器(例如DBSCAN),情况并非如此。
我已经设法获得了"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)