特征提取作为模式识别系统的重要模块,其本质是对原始特征数据进行某种变换以降维,下面介绍7种有关特征提取与转换的算法,并对算法的具体使用进行说明。
1.词频-逆文档转换(TD-IDF)
词频-逆文档频率(TF-IDF)是一个在文本挖掘中广泛应用的特征向量化方法,它能反映出语料库中某篇文档中某个词的重要性。假定t表示一个词,d表示一篇文档,则词频TF(t,d)是某个词t在文档d中的出现次数,而文档频率DF(t,D)是包含词t的文档d的数目。
如果我们仅使用词频来衡量重要性,则很容易过分强调那些出现非常频繁但携带很少与文档相关信息量的词,比如英语中的“a”、“the”和“of”。如果一个词在在语料库中出现非常频繁,意味着它更不能携带特定文档的特定信息。逆文档频率就是一个用于度量一个词能提供多少信息量的数值:
在这里,|D|是语料库中文档总数。由于使用对数,如果一个词在所有文档中都出现,则其IDF的值变为0。请注意,一个平滑值添加到公式中,目的是避免出现一个词不在语料库而导致零除问题。而词频-逆文档频率(TF-IDF)是TF和IDF简单相乘:
TFIDF(t,d,D)=TF(t,d)⋅IDF(t,D)
当然,存在其他用于衡量词频和文档频率的变体。在MLlib中,为了更好的扩展性,将TF和IDF分开实现。
我们使用散列技巧来实现词频。运用一个哈希函数将原始特征映射到一个特征索引值,然后基于映射索引值来计算词频。这种方法避免计算全局“词-索引”映射,而在超大语料中计算全局“词-索引”的代价非常高,而这种方法代价是会出现潜在的哈希值冲突——即不同原始特征被映射到同一个哈希值,从而变成同一个词。为了降低这种冲突概率,我们增加了目标特征的维数,即在哈希表中增加散列桶的数量。默认的特征维数是220=1,048,576。
词频(TF)和逆文档频率(IDF)在HashingTF和IDF中实现。HashingTF接收一个RDD[Iterable[_]]实例作为输入。每个记录都是一个可遍历的String或其他类型。
【例4-67】TF与IDF实现模型示例。
在这里,|D|是语料库中文档总数。由于使用对数,如果一个词在所有文档中都出现,则其IDF的值变为0。请注意,一个平滑值添加到公式中,目的是避免出现一个词不在语料库而导致零除问题。而词频-逆文档频率(TF-IDF)是TF和IDF简单相乘:
TFIDF(t,d,D)=TF(t,d)⋅IDF(t,D)
当然,存在其他用于衡量词频和文档频率的变体。在MLlib中,为了更好的扩展性,将TF和IDF分开实现。
我们使用散列技巧来实现词频。运用一个哈希函数将原始特征映射到一个特征索引值,然后基于映射索引值来计算词频。这种方法避免计算全局“词-索引”映射,而在超大语料中计算全局“词-索引”的代价非常高,而这种方法代价是会出现潜在的哈希值冲突——即不同原始特征被映射到同一个哈希值,从而变成同一个词。为了降低这种冲突概率,我们增加了目标特征的维数,即在哈希表中增加散列桶的数量。默认的特征维数是220=1,048,576。
词频(TF)和逆文档频率(IDF)在HashingTF和IDF中实现。HashingTF接收一个RDD[Iterable[_]]实例作为输入。每个记录都是一个可遍历的String或其他类型。
【例4-67】TF与IDF实现模型示例。
然而,应用HashingTF只需要遍历一次数据,而应用IDF则需要遍历两次:第一次用于计算IDF向量,第二次使用IDF来调整词频。
2.词向量化工具(Word2Vec)
Word2Vec用于将词转换为分布式词向量格式(distributed vector representation of words)。分布式词向量格式的主要优点在于在向量空间中相似词转化的向量运算,使得更易生成novel模式以及使模型评估更加健壮。分布式词向量格式在很多自然语言分析应用中很有用,如实体识别、消歧、解析、打标签和机器翻译。
(1)模型
可以使用skip-gram模型来实现Word2Vec。在skip-gram模型中,训练目标是学习到同一句子中最能预测其环境的词向量表示。从数学角度上来说,给定一系列词w1,w2,…,wT,skip-gram模型最大化对数似然均值为:
然而,应用HashingTF只需要遍历一次数据,而应用IDF则需要遍历两次:第一次用于计算IDF向量,第二次使用IDF来调整词频。
2.词向量化工具(Word2Vec)
Word2Vec用于将词转换为分布式词向量格式(distributed vector representation of words)。分布式词向量格式的主要优点在于在向量空间中相似词转化的向量运算,使得更易生成novel模式以及使模型评估更加健壮。分布式词向量格式在很多自然语言分析应用中很有用,如实体识别、消歧、解析、打标签和机器翻译。
(1)模型
可以使用skip-gram模型来实现Word2Vec。在skip-gram模型中,训练目标是学习到同一句子中最能预测其环境的词向量表示。从数学角度上来说,给定一系列词w1,w2,…,wT,skip-gram模型最大化对数似然均值为:
在这里,K是训练窗口大小。在skip-gram模型中,每个词W都与两个向量uw和vw相关,uw和vw表示词W自身及其上下文。在Softmax模型中,给定词wj,正确预测词wi的概率由下式决定:
在这里,K是训练窗口大小。在skip-gram模型中,每个词W都与两个向量uw和vw相关,uw和vw表示词W自身及其上下文。在Softmax模型中,给定词wj,正确预测词wi的概率由下式决定:
在这里,V是词量大小。在skip-gram模型中使用softmax的代价很高,因为logp(wi|wj)的计算量随着V线性增长,而V很容易就达到百万级。为了提高训练Word2Vec的速度,可以使用分softmax技术,该方法可以将计算logp(wi|wj)的复杂度降低到O(log(V))。
(2)示例程序
【例4-68】演示了怎样加载文本数据,将其解析为一个格式为Seq[String]的RDD,构建一个实例Word2Vec,然后将输入数据匹配为一个Word2VecModel模型,最后展示了与给定词最同义的40个词。为了运行该示例,首先需要下载text8数据并解压到目标目录。在这里,假定解压text8到运行spark-shell的目录。
【例4-68】Word2Vec示例。
在这里,V是词量大小。在skip-gram模型中使用softmax的代价很高,因为logp(wi|wj)的计算量随着V线性增长,而V很容易就达到百万级。为了提高训练Word2Vec的速度,可以使用分softmax技术,该方法可以将计算logp(wi|wj)的复杂度降低到O(log(V))。
(2)示例程序
【例4-68】演示了怎样加载文本数据,将其解析为一个格式为Seq[String]的RDD,构建一个实例Word2Vec,然后将输入数据匹配为一个Word2VecModel模型,最后展示了与给定词最同义的40个词。为了运行该示例,首先需要下载text8数据并解压到目标目录。在这里,假定解压text8到运行spark-shell的目录。
【例4-68】Word2Vec示例。
3.标准化
特征标准化是在训练集上对每列使用统计分析技术,将数据调整为标准差的倍数以及去均值。这是一种非常通用的预处理步骤。比如,支持向量机中的径向基函数[6](Radial Basis Function,RBF)内核或L1/L2正则化线性模型就在特征具有单位变化以及零均值时效果 更好。特征标准化能够在优化过程中加快收敛速度,也能够让特征免于被训练时发生超大值剧烈影响。
(1)模型适配
StandardScaler的构建函数具有如下参数。
● withMean,默认值为false。在调整前将数据中心化处理。它的输出是密集的,不能工作于稀疏输入。
● withStd,默认值为true。将数据调整为标准差。StandardScaler提供一个fit方法,它接受RDD[Vector]格式的输入,进行统计分析,然后输出一个标准差的倍数以及去均值化的模型,模型结果依赖于如何配置StandardScaler。模型输出一个StandardScaler模型,它能够将一个Vector标准化,也能够将一个RDD[Vector]标准化。
(2)示例程序
【例4-69】演示了如何加载一个LIBSVM格式的数据集,其将特征标准化,转换后的新特征为标准差,且有单位方差及0均值。
【例4-69】特征标准化应用模型示例。
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.feature.StandardScaler
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_libsvm_data.txt")
val scaler1=new StandardScaler().fit(data.map(x=>x.features))
val scaler2=new StandardScaler(withMean=true,withStd=true).fit(data.map(x=>x.features))
//scaler3和scaler2相同的模型,而且产生相同的转换
val scaler3=new StandardScalerModel(scaler2.std,scaler2.mean)
val data1=data.map(x=>(x.label,scaler1.transform(x.features)))
val data2=data.map(x=>(x.label,scaler2.transform(Vectors.dense(x.features.toArray))))
4.范数化
范数化(Normalizer)将独立的样本调整为具有Lp范数。这是在文本分类或聚类中广泛应用的一个操作。比如,两个L2化的TF-IDF向量,其点积就是向量间的余弦相似度。
Normalizer的构建函数具有参数P,P在Lp空间中泛化,p默认等于2
在Normalizer中,提供transform方法,它能够将一个Vector范数化,也能够将一个RDD[Vector]范数化。
注意:若输入的范数(norm)是0,它将返回原值。
【例4-70】演示了如何加载一个LIBSVM格式的数据集,将其分别以L2范数和L∞范数范数化。
【例4-70】范数化应用模型示例。
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.feature.Normalizer
import org.apache.spark.mllib.linalg.Vectors(www.xing528.com)
import org.apache.spark.mllib.util.MLUtils
val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_libsvm_data.txt")
val normalizer1=new Normalizer()
val normalizer2=new Normalizer(p=Double.PositiveInfinity)
val data1=data.map(x=>(x.label,normalizer1.transform(x.features)))
val data2=data.map(x=>(x.label,normalizer2.transform(x.features)))
5.特征选择
特征选择允许选择最相关的特征用于模型建设。特征选择降低向量空间的大小,反过来,降低任何后续向量操作的复杂性。特征选择的数量可以使用验证集调整。ChiSqSelector代表卡方特征选择,它使用分类特征操作标记数据。【例4-71】显示了ChiSqSelector的基本使用示例。
【例4-71】ChiSqSelector使用示例。
3.标准化
特征标准化是在训练集上对每列使用统计分析技术,将数据调整为标准差的倍数以及去均值。这是一种非常通用的预处理步骤。比如,支持向量机中的径向基函数[6](Radial Basis Function,RBF)内核或L1/L2正则化线性模型就在特征具有单位变化以及零均值时效果 更好。特征标准化能够在优化过程中加快收敛速度,也能够让特征免于被训练时发生超大值剧烈影响。
(1)模型适配
StandardScaler的构建函数具有如下参数。
● withMean,默认值为false。在调整前将数据中心化处理。它的输出是密集的,不能工作于稀疏输入。
● withStd,默认值为true。将数据调整为标准差。StandardScaler提供一个fit方法,它接受RDD[Vector]格式的输入,进行统计分析,然后输出一个标准差的倍数以及去均值化的模型,模型结果依赖于如何配置StandardScaler。模型输出一个StandardScaler模型,它能够将一个Vector标准化,也能够将一个RDD[Vector]标准化。
(2)示例程序
【例4-69】演示了如何加载一个LIBSVM格式的数据集,其将特征标准化,转换后的新特征为标准差,且有单位方差及0均值。
【例4-69】特征标准化应用模型示例。
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.feature.StandardScaler
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_libsvm_data.txt")
val scaler1=new StandardScaler().fit(data.map(x=>x.features))
val scaler2=new StandardScaler(withMean=true,withStd=true).fit(data.map(x=>x.features))
//scaler3和scaler2相同的模型,而且产生相同的转换
val scaler3=new StandardScalerModel(scaler2.std,scaler2.mean)
val data1=data.map(x=>(x.label,scaler1.transform(x.features)))
val data2=data.map(x=>(x.label,scaler2.transform(Vectors.dense(x.features.toArray))))
4.范数化
范数化(Normalizer)将独立的样本调整为具有Lp范数。这是在文本分类或聚类中广泛应用的一个操作。比如,两个L2化的TF-IDF向量,其点积就是向量间的余弦相似度。
Normalizer的构建函数具有参数P,P在Lp空间中泛化,p默认等于2
在Normalizer中,提供transform方法,它能够将一个Vector范数化,也能够将一个RDD[Vector]范数化。
注意:若输入的范数(norm)是0,它将返回原值。
【例4-70】演示了如何加载一个LIBSVM格式的数据集,将其分别以L2范数和L∞范数范数化。
【例4-70】范数化应用模型示例。
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.feature.Normalizer
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_libsvm_data.txt")
val normalizer1=new Normalizer()
val normalizer2=new Normalizer(p=Double.PositiveInfinity)
val data1=data.map(x=>(x.label,normalizer1.transform(x.features)))
val data2=data.map(x=>(x.label,normalizer2.transform(x.features)))
5.特征选择
特征选择允许选择最相关的特征用于模型建设。特征选择降低向量空间的大小,反过来,降低任何后续向量操作的复杂性。特征选择的数量可以使用验证集调整。ChiSqSelector代表卡方特征选择,它使用分类特征操作标记数据。【例4-71】显示了ChiSqSelector的基本使用示例。
【例4-71】ChiSqSelector使用示例。
6.元素的积(ElementwiseProduct)
元素的积使用一个“权重”向量与输入的向量相乘。换句话说,它会用标量的数对数据集的每一列进行缩放。这代表了输入向量之间的Hadamar乘积,输入向量v和转换向量w产生结果向量。
6.元素的积(ElementwiseProduct)
元素的积使用一个“权重”向量与输入的向量相乘。换句话说,它会用标量的数对数据集的每一列进行缩放。这代表了输入向量之间的Hadamar乘积,输入向量v和转换向量w产生结果向量。
ElementwiseProduct算法在构造器中有参数w,w:转换向量。
ElementwiseProduct实现了VectorTransformer,VectorTransformer可应用加权向量产生转换向量或由一个RDD[Vector]得到改变的RDD[Vector]。下面的【例4-72】演示了如何使用一个转换向量的值变换向量。
【例4-72】ElementwiseProduct使用示例。
ElementwiseProduct算法在构造器中有参数w,w:转换向量。
ElementwiseProduct实现了VectorTransformer,VectorTransformer可应用加权向量产生转换向量或由一个RDD[Vector]得到改变的RDD[Vector]。下面的【例4-72】演示了如何使用一个转换向量的值变换向量。
【例4-72】ElementwiseProduct使用示例。
7.PCA
可以利用PCA算法将向量的维数降低,从而实现特征转换,具体原理可以参考第4.4.7的降维章节,下面将直接介绍如何调用MLlib中的PCA算法进行特征转换。下面的【例4-73】演示了如何计算主成分向量并实现向量降维,同时保持标签计算线性回归。
【例4-73】PCA使用示例。
7.PCA
可以利用PCA算法将向量的维数降低,从而实现特征转换,具体原理可以参考第4.4.7的降维章节,下面将直接介绍如何调用MLlib中的PCA算法进行特征转换。下面的【例4-73】演示了如何计算主成分向量并实现向量降维,同时保持标签计算线性回归。
【例4-73】PCA使用示例。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。