Spark:特征處理之數據離散化


二元轉換Binarizer

Binarizer是將連續型變量根據某個閾值,轉換成二元的分類變量。
小於該閾值的轉換為0,大於該閾值的轉換為1。

要求輸入列必須是double,int都會報錯。
如下:輸入的是0.10.80.2連續型變量,要以0.5為閾值來轉換成二元變量(0,1)。

打印結果:

Binarizer output with Threshold = 0.5
+---+-------+-----------------+
| id|feature|binarized_feature|
+---+-------+-----------------+
|  0|    0.1|              0.0|
|  1|    0.8|              1.0|
|  2|    0.2|              0.0|
+---+-------+-----------------+

多了一個新的列,它就是轉換后產生的新的特征。

什么時候會用到二元轉換?
比如使用朴素貝葉斯做分類預測的時候,輸入的特征必須是類別型的,如果在原始的特征數據集中存在連續型的特征變量,就需要將它轉換成二元的類別變量。

多元轉換(分桶Bucketizer)

同樣是連續型變量,如果分成兩類還不夠,同樣也可以分成多類。

二元轉換的時候需要給出一個閾值,在多元換轉換中,如果要分成n類,就要給出n+1個閾值組成的array,任意一個數都可以被放在某兩個閾值的區間內,就像把它放進屬於它的桶中,故稱為分桶策略。

比如有x,y兩個閾值,那么他們組成的區間是[x,y)的前開后閉區間;
對於最后一個區間是前閉后閉區間。

給出的這個閾值array,里面的元素必須是遞增的。

如果在轉換的過程中有一個數沒有被包含在區間內,那么就會當成錯誤值(對錯誤值的處理可以通過參數配置)。如果不確定特征值的最小與最大值,那么就添加Double.NegativeInfinity(負無窮)和Double.PositiveInfinity(正無窮)到array的兩側。

打印結果:

Bucketizer output with 4 buckets
+--------+----------------+
|features|bucketedFeatures|
+--------+----------------+
|  -999.9|             0.0|
|    -0.5|             1.0|
|    -0.3|             1.0|
|     0.0|             2.0|
|     0.2|             2.0|
|   999.9|             3.0|
+--------+----------------+

第一列為原始的連續型特征,第二列為轉換后的分類索引。

分位數離散化QuantileDiscretizer

與上面兩個方法一樣,QuantileDiscretizer(分位數離散化)也是將一列連續型的數據轉成分類型數據。
通過指定要分為多少類,然后取一個樣本數據進行fit,並將其分為每個類別的元素個數大致相等,來得到一個固定閾值array的Bucketizer,其閾值array的下限為-Infinity(負無重大) ,上限為+Infinity(正無重大)。

分級的數量由numBuckets參數決定。
分級的范圍有漸進算法決定。
漸進的精度由relativeError參數決定。當relativeError設置為0時,將會計算精確的分位點(計算代價較高)。

但如果樣本數據只划分了3個區間,此時設置numBuckets為4,則仍只划分為3個區間。


免責聲明!

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



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