一、概念算法
接收具備連續特徵的列,並輸出具備合併分類特徵的列。按分位數,對給出的數據列進行離散化分箱處理。
和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 |+---+----+------+