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个区间。

posted @ 2019-01-04 17:25  xuejianbest  阅读(1233)  评论(0编辑  收藏  举报