Spark中QuantileDiscretizer和Bucketizer之间的区别

Nim*_*m J 5 apache-spark pyspark

这可能是一个新手问题,但是我无法理解使用QuantileDiscretizeroverBucketizer在spark 2.1?

我知道这QuantileDiscretizer是一个估算器,可以处理NAN值,而Bucketizer如果数据具有NAN值,是一个转换器并会引发错误。

从spark 文档中,下面的代码产生类似的输出

from pyspark.ml.feature import QuantileDiscretizer
from pyspark.ml.feature import Bucketizer

data = [(0, 18.0), (1, 19.0), (2, 8.0), (3, 5.0), (4, 2.2)]
df = spark.createDataFrame(data, ["id", "hour"])

result_discretizer = QuantileDiscretizer(numBuckets=3, inputCol="hour",outputCol="result").fit(df).transform(df)
result_discretizer.show()

splits = [-float("inf"),3, 10,float("inf")]
result_bucketizer = Bucketizer(splits=splits, inputCol="hour",outputCol="result").transform(df)
result_bucketizer.show()
Run Code Online (Sandbox Code Playgroud)

输出:

+---+----+------+
| id|hour|result|
+---+----+------+
|  0|18.0|   2.0|
|  1|19.0|   2.0|
|  2| 8.0|   1.0|
|  3| 5.0|   1.0|
|  4| 2.2|   0.0|
+---+----+------+

+---+----+------+
| id|hour|result|
+---+----+------+
|  0|18.0|   2.0|
|  1|19.0|   2.0|
|  2| 8.0|   1.0|
|  3| 5.0|   1.0|
|  4| 2.2|   0.0|
+---+----+------+
Run Code Online (Sandbox Code Playgroud)

请让我知道一个相对于另一个是否有明显优势吗?

ImD*_*enG 7

QuantileDiscretizer 根据数据确定存储分区。

Bucketizer将数据放入您通过指定的存储桶中splits

因此,Bucketizer在知道所需的存储桶时使用,并QuantileDiscretizer为您估计分割数。

该示例中的输出相似是由于人为设计的数据和splits选择的结果。在其他情况下,结果可能会有很大差异。

  • @Khan:没有任何基准测试,我猜“QuantileDiscretizer”比“Bucketizer”更广泛。正如@ImDarrenG 所说,前者是一个两步过程,首先根据分布确定分位数(例如中值、75% 等),然后将其用作“Bucketizer”的桶边界,而后者只是一个步骤基于您输入的边界。 (3认同)