(1)数据类型
在 Mib 中,对不同算法包的调用都要求了一定的输人数据类型。
(2)特征提取
mmllib.feature 中提供了一些常见的特征转化方法,主要用于特征向量化、相关系数计算和数据标准化。
① TF-IDF 算法
TF-IDF(Term Frequency-Inverse Document Frequency)算法是一种将文档转化成特征向量的方法。TF指的是词频,即该词在文档中出现的次数;IDF是逆文档概率,是词在文档集中出现的概率,TF与IDF的乘积可以表示该词在文档中的重要程度。
mllib.feature 中有两个算法可以计算TF-IDF,即 HashingTF 和IDF。HashingTF 从一个文档中计算出给定大小的词频向量,并且通过哈希法排列词向量的顺序,使词与向量能一一对应。IDF则可以计算逆文档频率,需要调用fit()方法获取一个IDFModel,表示语料库的逆文档频率,再通过IDFModel的transform()方法将 TF 向量转换为 IDF 向量。
② Word2Vec 算法 Word2Vec是NLP(自然语言处理)领域的重要算法,它的功能是使用K维的密向量表示每个词,它使用的训练集是语料库,不含标点,以空格断句。通过训练将每个词跌射成K维实数向量(K一般为模型中的超参数),通过词之间的距离(如余弦相似度、欧氏距离等)判断词之间的语义相似度。每一个文档都表示为一个单词序列,因此一个含有 M个单词的文档将由M个K维向量组成。mnllib.feature中包含 Word2Vec 算法包,输人数据要求是 Strimg 类型的可迭代对象。
③ 统计最大值、最小值、均值、方差和相关系数MLlib 的 mllib.stat.Statistics类中提供了几种广泛使用的统计方法,可以直接在 RDD上进行使用。
④ 数据特征处理方法
为避免数据字段的量纲和量级的不同对模型的效果造成不好的影响,经常需要对数据进行数据标准化或归一化。经过数据标准化或归一化后,算法的效果在一定程度上也会变好。Spark提供了3种常见的数据处理的方法,即Normalizer()、StandardScaler()和MinMaxScaler()方法。spark.mllib.feature 类中只有前两种数据处理方法,spark.ml.feature 类中则含有3种。因此,使用spark.ml.feature 类中的方法进行数据特征处理。
Normalizer()、StandardScaler()和 MinMaxScaler()方法处理的均为 Vector 类型的数据因此需要先将数据的类型转换为 Vector 类型。转化一个集合序列为 RDD,再由 RDD 数据创建 DataFrame 数据,最后将 DataFrame 数据的类型转换成 Vector 类型
。
将数据的类型转换成 Vector 类型后,即可使用Normalizer()和 MinMaxScaler()方法进行数据归一化,以及使用 StandardScaler()方法进行数据标准化,这3种数据处理方法的介绍及使用方法如下。
Normalizer()方法本质上是一个转换器,它可以将多行向量输入转化为统一的形式Normalizer()方法的作用范围是每一行,使每一个行向量的范数变换为一个单位范数。参数setP用于指定正则化中使用的p-norm,默认值为2。对代所示的 Vector 类型的dataFrame 数据进行 Normalizer 归一化操作。其中,setInputCol("features"设置了 Normalizer 归一化的输人数据,setOutputCol("normFeatures")设置了 Normalizer 归一化后输出的数据作为 dataFrame 中的 normFeatures列。
StandardScaler()
StandardScaler()方法处理的对象是列,即每一维特征,将特征标准化为单位标准差、0均值或0均值单位标准差。StandardScalerO方法有两个参数可以设置,说明如下withStd:true或 false,默认为 true,该参数表示是否将数据标准化到单位标准差withMean:true或false,默认为false,该参数表示是否变换为0均值,将返回一个密输出,因此不适用于稀疏输人。
进行 StandardScaler 标准化需要获取数据每一维的均值和标准差,并以此缩放每一维特征。
MinMaxScaler()为常用的最小值-最大值归一化方法,这个方法也针对每一维特征进行处理,将每一维特征线性地映射到指定的区间中,通常是[0,1]。MinMaxScaler()方法有两
个参数可以设置,说明如下。
min:默认为 0,指定区间的下限。
max:默认为1,指定区间的上限。