Spark QuantileDiscretizer 分位数离散器

一、概念算法

接收具备连续特征的列,并输出具备合并分类特征的列。按分位数,对给出的数据列进行离散化分箱处理。
和Bucketizer(分箱处理)同样也是:将连续数值特征转换为离散类别特征。实际上Class QuantileDiscretizer extends Bucketizer


    参数1:不一样的是这里再也不本身定义splits(分类标准),而是定义分几箱(段)就能够了。QuantileDiscretizer本身调用函数计算分位数,并完成离散化。 
    参数2: 另一个参数是精度,若是设置为0,则计算最精确的分位数,这是一个高时间代价的操做。
    另外上下边界将设置为正负无穷,覆盖全部实数范围。
分位数(Quantile),亦称分位点,是指将一个随机变量的几率分布范围分为几个等份的数值点,经常使用的有中位数(即二分位数)、四分位数、百分位数等。

 

二、codesql

package com.home.spark.ml

import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.QuantileDiscretizer
import org.apache.spark.sql.SparkSession

/**
  * @Description: 分位数离散器
  * QuantileDiscretizer接收具备连续特征的列,并输出具备合并分类特征的列。按分位数,对给出的数据列进行离散化分箱处理。
  * 箱数由numBuckets参数设置。
  * 例如,若是输入的不一样值太少而没法建立足够的不一样分位数,则所使用的存储桶的数量可能会小于该值。
  *
  * NaN值:在QuantileDiscretizer拟合过程当中,将从柱中除去NaN值。这将产生一个Bucketizer模型进行预测。
  * 在转换期间,Bucketizer在数据集中找到NaN值时将引起错误,可是用户也能够经过设置handleInvalid选择保留仍是删除数据集中的NaN值。
  * 若是用户选择保留NaN值,则将对其进行特殊处理并将其放入本身的存储桶中,
  * 例如,若是使用4个存储桶,则将非NaN数据放入存储桶[0-3]中,但NaN将被存储放在一个特殊的桶中[4]。
  *
  * 算法:分箱范围是使用近似算法选择的(有关详细说明,请参见aboutQuantile的文档)。
  * 可使用relativeError参数控制近似精度。设置为零时,将计算精确的分位数(注意:计算精确的分位数是一项昂贵的操做)。
  * 分箱的上下边界将是-Infinity和+ Infinity,覆盖全部实数值。
  *
  **/
object Ex_QuantileDiscretizer {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
    val spark = SparkSession.builder().config(conf).getOrCreate()

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

    val discretizer = new QuantileDiscretizer()
      .setInputCol("hour")
      .setOutputCol("result")
      .setNumBuckets(3)

    val result = discretizer.fit(df).transform(df)
    result.show(false)

    spark.stop()
  }
}+---+----+------+|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   |+---+----+------+
相关文章
相关标签/搜索