Spark中的QuantileDiscretizer和Bucketizer之间的区别

时间:2017-04-13 07:34:51

标签: apache-spark pyspark

这可能是一个新手问题,但是我无法理解在火花2.1中使用QuantileDiscretizer而不是Bucketizer是否有任何特定优势?

我理解QuantileDiscretizer是一个估算器并处理NAN值,而Bucketizer是变换器,如果数据具有NAN值,则会引发错误。

来自spark documentation

,下面的代码产生类似的输出

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()

输出:

+---+----+------+
| 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|
+---+----+------+

请告诉我一个人是否有明显的优势?

2 个答案:

答案 0 :(得分:4)

QuantileDiscretizer根据数据确定存储桶拆分。

Bucketizer将数据放入您通过splits指定的存储区。

因此,当您知道所需的存储桶时,请使用Bucketizer,并QuantileDiscretizer为您估算拆分。

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

答案 1 :(得分:0)

QuantileDiscretizer https://spark.apache.org/docs/latest/ml-features.html#quantilediscretizer)接受具有连续特征的列,并输出具有分类类别特征的列。箱数由numBuckets参数设置。例如,如果输入的不同值太少而无法创建足够的不同分位数,则所使用的存储桶的数量可能会小于该值。

Bucketizer https://spark.apache.org/docs/latest/ml-features.html#bucketizer)将一列连续要素转换为要素桶列,用户在其中存储桶。

您可以像这样同时使用两者:

from pyspark.ml.feature import QuantileDiscretizer, Bucketizer

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

+---+----+
| id|hour|
+---+----+
|  0|18.0|
|  1|19.0|
|  2| 8.0|
|  3| 5.0|
|  4| 2.2|
+---+----+

qds = QuantileDiscretizer(numBuckets=5, inputCol="hour", outputCol="buckets", relativeError=0.01, handleInvalid="error")
bucketizer = qds.fit(df)
bucketizer.setHandleInvalid("skip").transform(df).show()

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