特征工程下有哪些常用处理函数一手资源.pdf
2021/11/1925|
特征工程一览SparkMLlib特征处理函数分类
在上一讲,我们着重讲解了其中的前3个环节,也就是预处理、特征选择和归一化。按照
之前的课程安排,今天这一讲,咱们继续来说说剩下的离散化、Embedding与向量计算。
特征工程是机器学习的重中之重,只要你耐心学下去,必然会不虚此行。这一讲的最后,
我还会对应用了6种不同特征工程的模型性能加以对比,帮你深入理解特征工程中不同环
节的作用与效果。
特征工程
特征工程进度打卡
2/15
2021/11/1925|
在上一讲,我们打卡到了“第三关”:归一化。因此,接下来,我们先从“第四关”:离
散化说起。
离散化:Bucketizer
与归一化一样,离散化也是用来处理数值型字段的。离散化可以把原本连续的数值打散,
从而降低原始数据的多样性(Cardinality)。举例来说,“BedroomAbvGr”字段的含义
是居室数量,在train.csv这份数据样本中,“BedroomAbvGr”包含从1到8的连续整
数。
现在,我们根据居室数量,把房屋粗略地划分为小户型、中户型和大户型。
BedroomAbvGr离散化
不难发现,“BedroomAbvGr”离散化,数据多样性由原来的8降低为现在的3。那
么问题来了,原始的连续数据好好的,为什么要对它做离散化呢?离散化的动机,主要在
于提升特征数据的区分度与内聚性,从而与预测标的产生更强的关联。
就拿“BedroomAbvGr”来说,我们认为一居室和两居室对于房价的影响差别不大,同
样,三居室和四居室之间对于房价的影响,也是微乎其微。
但是,小户型与中户型之间,以及中户型与大户型之间,房价往往会出现跃迁的现象。换
句话说,相比居室数量,户型的差异对于房价的影响更大、区分度更高。因此,
把“BedroomAbvGr”做离散化处理,目的在于提升它与预测标的之间的关联性。
3/15
2021/11/1925|
那么,在SparkMLlib的框架下,离散化具体该怎么做呢?与其他环节一样,Spark
MLlib提供了多个离散化函数,比如Binarizer、Bucketizer和QuantileDiscretizer。我
们不妨以Bucketizer为代表,结合居室数量“BedroomAbvGr”这个字段,来演示离散
化的具体用法。老规矩,还是先上代码为敬。
代码
1//原始字段
2valfieldBedroom:String=BedroomAbvGrInt
3//包含离散化数据的目标字段
4valfieldBedroomDiscret:String=BedroomDiscrete
5//指定离散区间,分别是[负无穷,2]、[3,4]和[5,正无穷]
6valsplits:Array[Doubl]=Array(Doubl.NegativeInfinity,3,5,Doubl.Positi
7
8importorg.apache.spark.ml.feature.Bucketizer
9
10//定义并初始化Bucketizer
11valbucketi