一.概述
Binarizer二值化器是将数字特征阈值化为二进制(0/1)特征的过程。Binarizer采用通用参数inputCol和outputCol,以及threshold【默认值0.0】 用于二值化。
对于二值化器而言,最好前面承接的是包含正负数的数据,因为对于二值化器而言,只要是大于0.0【当然可以使用setThreshold重置阈值】的数据都会被转换为1.0,因此这对于全是正数或全是负数的数据来说是没有意义的。重置阈值可以改变判断规则,进而可以承接像归一化之类的数据,二值化器主要应用于把离散数据转换为分类数据,进而作为分类算法的前置数据,对于多分类数据,可以多次使用二值化器进行逐次拆分,生成多分类数据。
二.代码实现
object BinarizerAnalyse { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder().appName(s"${this.getClass.getSimpleName}") .master("local[2]") .getOrCreate() val data = Array((0, 0.1), (1, 0.8), (2, 1.2), (3, 13.14)) val dataFrame = spark.createDataFrame(data).toDF("id", "feature") val binarizer : Binarizer = new Binarizer() .setInputCol("feature") .setOutputCol("binarized") val binarizedDataFrame = binarizer.transform(dataFrame) println(s"默认阈值 :${binarizer.getThreshold}") binarizedDataFrame.show() /** * 重置阈值 */ val binarizer2 : Binarizer = new Binarizer() .setInputCol("feature") .setOutputCol("binarized") .setThreshold(0.8) val binarizedDataFrame2 = binarizer2.transform(dataFrame) println(s"新阈值 :${binarizer2.getThreshold}") binarizedDataFrame2.show() }}
三.执行结果
四.源码剖析
从源码中可以看出,threshold默认设置为0.0,大于阈值的特征值将转化为1.0;等于或小于阈值的值将转化为0.0。使用setThreshold(value)和getThreshold()函数分别设置和获取阈值。
Binarizer支持支持Vector和Double类型数据。根据类型的不同分别定义binarizerDouble和binarizerVector两个自定义函数,函数的逻辑比较简单,最后使用模式匹配实现类型转换。