Spark:特征处理之数据离散化
二元转换Binarizer
Binarizer是将连续型变量根据某个阈值,转换成二元的分类变量。
小于该阈值的转换为0,大于该阈值的转换为1。
要求输入列必须是double,int都会报错。
如下:输入的是0.1
,0.8
,0.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个区间。