特徵處理之數據離散化

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

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

打印結果:code

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

多了一個新的列,它就是轉換後產生的新的特徵。blog

何時會用到二元轉換?
好比使用樸素貝葉斯作分類預測的時候,輸入的特徵必須是類別型的,若是在原始的特徵數據集中存在連續型的特徵變量,就須要將它轉換成二元的類別變量。索引

多元轉換(分桶Bucketizer)
一樣是連續型變量,若是分紅兩類還不夠,一樣也能夠分紅多類。it

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

好比有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個區間。

相關文章
相關標籤/搜索