QuantileDiscretizer
class pyspark.ml.feature.QuantileDiscretizer(numBuckets=2*, inputCol=None, outputCol=None, relativeError=0.001, handleInvalid=‘error’)
QuantileDiscretizer 采用具有连续特征的列,并输出具有分箱分类特征的列。可以使用 numBuckets 参数设置分箱的桶数。使用的桶数可能会小于此值,例如,如果输入的不同值太少而无法创建足够的不同分位数。
NaN 处理:另请注意,当 QuantileDiscretizer 在数据集中找到 NaN 值时会引发错误,但用户也可以通过设置 handleInvalid 参数来选择保留或删除数据集中的 NaN 值。如果用户选择保留 NaN 值,会进行特殊处理,放入自己的 bucket,例如,如果使用 4 个 bucket,那么 non-NaN 数据将被放入 bucket[0-3],但 NaN 会被计数在一个特殊的桶中[4]。
算法:使用近似算法选择分箱范围(有关详细说明,请参阅 approxQuantile() 的文档)。近似的精度可以通过 relativeError 参数来控制。 bin 的下限和上限将为 -Infinity 和 Infinity,涵盖所有实数值。
setHandleInvalid(value):设置handleInvalid 的值。
handleInvalid = Param(parent=‘undefined’, name=‘handleInvalid’, doc=‘如何处理无效条目。选项有skip(过滤掉具有无效值的行)、error(抛出错误)或keep(保留无效值)在一个特殊的附加桶中)。’)
01.创建数据
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("QuantileDiscretizer").master("local[*]").getOrCreate()
#%%
values = [(0.1,), (0.4,), (1.2,), (1.5,), (float("nan"),), (float("nan"),)]
df = spark.createDataFrame(values, ["values"])
df.show()
输出结果:
+------+
|values|
+------+
| 0.1|
| 0.4|
| 1.2|
| 1.5|
| NaN|
| NaN|
+------+
02.进行分箱
from pyspark.ml.feature import QuantileDiscretizer
qds = QuantileDiscretizer(numBuckets=2,\
inputCol="values", outputCol="buckets", relativeError=0.01, handleInvalid="error")
model = qds.fit(df)
model.transform(df).count()
输出结果:6
03.更改参数,查看结果
qds.setHandleInvalid("skip").fit(df).transform(df).count()
输出结果:4
04.查看值
splits = model.getSplits()
splits[0]
输出结果:-inf