【发布时间】:2018-04-18 05:22:13
【问题描述】:
我已经建立了一个 KMeansModel。我的结果存储在一个名为
transformed。
(a) 如何解读transformed的内容?
(b) 如何从 transformed 创建一个或多个 Pandas DataFrame,以显示 14 个集群中每个集群的 13 个特征中的每一个的摘要统计信息?
from pyspark.ml.clustering import KMeans
# Trains a k-means model.
kmeans = KMeans().setK(14).setSeed(1)
model = kmeans.fit(X_spark_scaled) # Fits a model to the input dataset with optional parameters.
transformed = model.transform(X_spark_scaled).select("features", "prediction") # X_spark_scaled is my PySpark DataFrame consisting of 13 features
transformed.show(5, truncate = False)
+------------------------------------------------------------------------------------------------------------------------------------+----------+
|features |prediction|
+------------------------------------------------------------------------------------------------------------------------------------+----------+
|(14,[4,5,7,8,9,13],[1.0,1.0,485014.0,0.25,2.0,1.0]) |12 |
|(14,[2,7,8,9,12,13],[1.0,2401233.0,1.0,1.0,1.0,1.0]) |2 |
|(14,[2,4,5,7,8,9,13],[0.3333333333333333,0.6666666666666666,0.6666666666666666,2429111.0,0.9166666666666666,1.3333333333333333,3.0])|2 |
|(14,[4,5,7,8,9,12,13],[1.0,1.0,2054748.0,0.15384615384615385,11.0,1.0,1.0]) |11 |
|(14,[2,7,8,9,13],[1.0,43921.0,1.0,1.0,1.0]) |1 |
+------------------------------------------------------------------------------------------------------------------------------------+----------+
only showing top 5 rows
顺便说一句,我从另一个 SO 帖子中发现,我可以将这些功能映射到它们的名称,如下所示。在一个或多个 Pandas 数据帧中为每个集群的每个特征提供汇总统计信息(平均值、中值、标准、最小值、最大值)会很好。
attr_list = [attr for attr in chain(*transformed.schema['features'].metadata['ml_attr']['attrs'].values())]
attr_list
根据 cmets 中的请求,这里是由 2 条数据记录组成的快照(不想提供太多记录——这里是专有信息)
+---------------------+------------------------+-----------------------+----------------------+----------------------+------------------------------+---------------------------------+------------+-------------------+--------------------+------------------------------------+--------------------------+-------------------------------+-----------------+--------------------+--------------------+
|device_type_robot_pct|device_type_smart_tv_pct|device_type_desktop_pct|device_type_tablet_pct|device_type_mobile_pct|device_type_mobile_persist_pct|visitors_seen_with_anonymiser_pct|ip_time_span| ip_weight|mean_ips_per_visitor|visitors_seen_with_multi_country_pct|international_visitors_pct|visitors_seen_with_multi_ua_pct|count_tuids_on_ip| features| scaledFeatures|
+---------------------+------------------------+-----------------------+----------------------+----------------------+------------------------------+---------------------------------+------------+-------------------+--------------------+------------------------------------+--------------------------+-------------------------------+-----------------+--------------------+--------------------+
| 0.0| 0.0| 0.0| 0.0| 1.0| 1.0| 0.0| 485014.0| 0.25| 2.0| 0.0| 0.0| 0.0| 1.0|(14,[4,5,7,8,9,13...|(14,[4,5,7,8,9,13...|
| 0.0| 0.0| 1.0| 0.0| 0.0| 0.0| 0.0| 2401233.0| 1.0| 1.0| 0.0| 0.0| 1.0| 1.0|(14,[2,7,8,9,12,1...|(14,[2,7,8,9,12,1...|
【问题讨论】:
-
能否也提供一个初始数据样本
X_spark_scaled? -
我宁愿使用 sklearn 而不是 pyspark。运行基准测试,哪个更快?哪个更容易使用?哪个发现更好的集群?
-
@Anony-Mousse 我实际上尝试过 sklearn,但我有大约 6000 亿条记录,这对于 sklearn 来说太多了,无法记忆
-
@desertnaut 今天晚些时候会做
-
这不仅仅是您的问题的“切线”:pyspark 比 sklearn 更受限制,如果您使用 sklearn 而不是 pyspark(不是原生 Python),那么问题会很多更容易回答。
标签: machine-learning pyspark cluster-analysis k-means apache-spark-ml