Кластеризация данных с использованием DBSCAN и spark_sklearn

Я хочу сгруппировать свои входные данные с помощью 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_). Также нормально, если я могу получить атрибут «labels_» с помощью spark-sklearn.

Если вышеупомянутые вызовы ('преобразование' или 'прогнозирование') не работают, можно ли получить метки_ после подбора данных с помощью spark-sklearn? Как я могу это сделать? Предполагая, что мы получили метки_, как я могу сопоставить входные экземпляры с метками_? У них такой же порядок?


person user2737636    schedule 03.01.2017    source источник
comment
Избегайте использования программного обеспечения, которое обертывает программное обеспечение, которое обертывает программное обеспечение ... наложение слоя на слой убивает производительность (а pyspark уже имеет репутацию медленного), и вы больше не получаете всю функциональность.   -  person Has QUIT--Anony-Mousse    schedule 06.01.2017


Ответы (2)


Это возможно в случае KMeans, в котором мы можем предсказать метки кластера, поскольку оценщик scikit-learn предоставляет эту функцию.

К сожалению, это не относится к некоторым другим кластерам, таким как DBSCAN.

person eliasah    schedule 03.01.2017
comment
Для DBSCAN есть ли способ получить кластеры экземпляров ввода? sckit-learn позволяет получить атрибут "labels_". - person user2737636; 03.01.2017
comment
@ user2737636 Да, DBSCAN имеет такой же атрибут label_, что и KMeans. - person agcala; 27.02.2020

Мне удалось получить атрибут «label_»; однако я до сих пор не знаю, соответствует ли порядок результирующих меток входным экземплярам или нет.

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)
person user2737636    schedule 03.01.2017