【Spark】特征工程1-Extractors
Spark MLlib中关于特征处理的相关算法,大致分为以下几组:
本文介绍第一组: 特征提取器(Extractors)
1. 特诊提取器
1.1 TF-IDF
词频-逆文本频率 (Term frequency-inverse document frequency, (TF-IDF) 是在文本挖掘中广泛使用的特征向量化方法,以反映术语对语料库中的文档的重要性。 用t表示一个术语,用d表示一个文件,用D表示语料库。词频TF(t,d)是术语t出现在文件d中的次数,而文档频率DF(t,D)是包含术语t的文件数量。 如果我们仅使用词频来衡量重要性,那么过分强调经常出现但很少提供有关文档的信息的术语非常容易,例如: “a”,“the”和“of”。 如果词语在语料库中经常出现,则表示它不包含有关特定文档的特殊信息。 逆向文档频率是词语提供的信息量的数字度量:
其中|D|是语料库中的文档总数。 由于使用了对数log,如果一个术语出现在所有文档中,其IDF值将变为0。请注意,应用平滑词语以避免语料库外的术语除以零。 TF-IDF指标只是TF和IDF的产物:
词频和文档频率的定义有几种变体。 在MLlib中,我们将TF和IDF分开以使其灵活。
TF :HashingTF和CountVectorizer都可用于生成术语频率向量。
IDF :IDF是一个Estimator,它训练数据集并生成IDFModel。 IDFModel采用特征向量(通常从HashingTF或CountVectorizer创建)并缩放每个特征。 直观地,它降低了在语料库中频繁出现的特征。
在下面的代码中(基于Python),Scala和Java的示例还请参照 这里 ;我们从一组句子开始。 我们使用Tokenizer将每个句子分成单词。 对于每个句子,我们使用HashingTF将句子散列为特征向量。 我们使用IDF重新缩放特征向量; 这通常会在使用文本作为功能时提高性能。 然后我们的特征向量可以传递给学习算法。
1 |
# -*- coding: utf-8 -*- |
结果如下:
1 |
+-----+--------------------+ |
1.2 Word2Vec
我们从一组文档开始,每个文档都表示为一系列单词。 对于每个文档,我们将其转换为特征向量。 然后可以将该特征向量传递给学习算法:
1 |
# -*- coding: utf-8 -*- |
结果如下:
1 |
Text: [Hi, I, heard, about, Spark] => |
1.3 CountVectorizer
在拟合过程中,CountVectorizer将选择按语料库中的术语频率排序的顶级词汇量词。可选参数minDF还通过指定词语必须出现在文档中的最小数量(或<1.0)来影响拟合过程。另一个可选的二进制切换参数控制输出向量。如果设置为true,则所有非零计数都设置为1.这对于模拟二进制而非整数计数的离散概率模型尤其有用。
假设我们有以下DataFrame,其中包含列id和文本:
1 |
id | texts |
文本中的每一行都是Array [String]类型的文档。 调用CountVectorizer的拟合会生成带有词汇表(a,b,c)的CountVectorizerModel。 然后转换后的输出列“vector”包含:
1 |
id | texts | vector |
每个向量表示文档在词汇表中的词语计数(id 0: ‘a’, ‘b’, ‘c’各出现一次;id1: ‘a’, ‘b’, ‘c’各出现2, 2, 1次)。
1 |
# -*- coding: utf-8 -*- |
结果如下:
1 |
+---+---------------+-------------------------+ |
1.4 FeatureHasher
特征散列(Feature Hashing)将一组分类或数字特征映射到指定尺寸的特征向量中(通常远小于原始特征空间的特征向量)。这是使用散列技巧将要素映射到特征向量中的索引来完成的。
FeatureHasher转换器在多个特征上运行。每个特征可能是数值特征或分类特征。不同数据类型的处理方法如下:
忽略空(缺失)值(在结果特征向量中隐式为零)。
这里使用的哈希函数也是HashingTF中使用的MurmurHash 3。由于散列值的简单模数用于确定向量索引,因此建议使用2的幂作为numFeatures参数;否则,特征将不会均匀地映射到矢量索引。
假设我们有一个DataFrame,其中包含4个输入列real,bool,stringNum和string。这些不同的数据类型作为输入将说明变换的行为以产生一列特征向量。
1 |
real| bool|stringNum|string |