Spark QuantileDiscretizer 分位數離散器


1、概念

接收具有連續特征的列,並輸出具有合並分類特征的列。按分位數,對給出的數據列進行離散化分箱處理。
和Bucketizer(分箱處理)一樣也是:將連續數值特征轉換為離散類別特征。實際上Class QuantileDiscretizer extends Bucketizer


    參數1:不同的是這里不再自己定義splits(分類標准),而是定義分幾箱(段)就可以了。QuantileDiscretizer自己調用函數計算分位數,並完成離散化。 
    參數2: 另外一個參數是精度,如果設置為0,則計算最精確的分位數,這是一個高時間代價的操作。
    另外上下邊界將設置為正負無窮,覆蓋所有實數范圍。
分位數(Quantile),亦稱分位點,是指將一個隨機變量的概率分布范圍分為幾個等份的數值點,常用的有中位數(即二分位數)、四分位數、百分位數等。

 

2、code

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM