学习 Spark MLlib 特征工程(三):Bucketizer 和 QuantileDiscretizer

Bucketizer

根据用户指定的分桶,将连续的特征转化为特征分桶。

定义分桶的条件:

  • 分桶最小值必须小于 DataFrame 中的最小值;
  • 分桶最大值必须大于 DataFrame 中的最大值;
  • 分桶必须至少三个;
  • 分桶必须严格递增。

举🌰

样例分桶:

val splits = Array(Double.NegativeInfinity, -0.5, 0.0, 0.5, Double.PositiveInfinity)  

定义了三个分桶:[Double.NegativeInfinity, -0.5)、[-0.5, 0.0)、[0.0, 0.5) 和 [0.5, Double.PositiveInfinity]

样例数据:

-999.9, -0.5, -0.3, 0.0, 0.2, 999.9

样例代码:

new Bucketizer()  
    .setInputCol("features")
    .setOutputCol("bucket")
    .setSplits(splits)

分桶结果:

0.0,1.0,1.0,2.0,2.0,3.0  

QuantileDiscretizer

根据用户指定的箱数,将连续特征转化为装箱的分类特征。

箱范围使用了 Greenwald-Khanna 算法变种实现近似分位数,参考 org.apache.spark.sql.DataFrameStatFunctions.approxQuantile

参数 relativeError 指定近似分位数的精度,取值范围为 [0,1],取 0 值代表完全准确。

举🌰

样例数据:

18.0, 19.0, 8.0, 5.0, 2.2  

样例代码:

new QuantileDiscretizer()  
    .setInputCol("features")
    .setOutputCol("bucket")
    .setNumBuckets(3)

分桶结果:

2.0, 2.0, 1.0, 1.0, 0.0