-
写在最前
首先,如何构建一个完整的机器学习项目呢?
主要有以下几个步骤:
- 项目概述。
- 获取数据。
- 可视化数据,发现规律
- 数据清洗
- 特征工程(提取特征)
- 调用分类器,进行训练
- 微调模型,得到最优参数
- 给出解决方案。
- 部署、监控、维护系统
个人认为这里最重要的是第5步,特征工程。
何为特征工程呢?顾名思义,就是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。
本质上讲,特征工程是一个表示和展现数据的过程;实际工作中,特征工程的目的是去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。
好的特征工程可以①降低模型复杂度,减小过拟合;②提升模型泛化性能;③加快模型训练和预测速度。
为什么必须要进行特征工程呢?在实际任务中,我们接收到的数据往往是高维,非线性,高噪声的,比如一张256*256像素*3(RGB通道数)的图片,如果我们不*特征提取,那么就需要把这196608个特征都使用上,对于分类器来讲,这是必然会造成过拟合的。事实上对于一张图片来说,它关键的信息也就那么几个部位,同时你完全可以采用一种压缩的方法把它们用更小的图像展示出来,输入到训练网络中。本质上来讲,图像压缩也就是一种特征工程。
-
文本分类
对于文本这样的非结构化数据来讲呢(图片、音频、文本、视频都是非结构化数据)?
文本分类的核心都是如何从文本中抽取出能够体现文本特点的关键特征,抓取特征到类别之间的映射。所以特征工程很重要,可以由四部分组成:
基于向量空间模型(词袋模型)的特征表示
文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。文本向量化是文本表示的一种重要方式。文本向量化就是讲文本表示成一系列能够表达文本语义的向量。
词袋模型是最早的以词语为基本处理单元的文本向量化方法。
词袋法(Bag Of Words,BOW)基于这样一个朴素的思想:对训练集词库中的每一个词构建唯一的独热向量(One-hot)表示,每个单词用00000...0100..00000表示,向量的长度为词库的长度,对于每个词表示出的one-hot向量,只有一个特定位置是1,其余都是0。
对于一篇文本而言,同样用一个1*dim(dim表示词数量)向量来表示,其中每个元素表示词典中相关元素在文档中出现的次数。(也有的词袋模型中只要出现该词就置1,否则置0,除了0和1没有其他数字)
例如有如下两个文档:
1:Bob likes to play basketball, Jim likes too.
2:Bob also likes to play football games.
对于这两个句子,我们要用词袋模型把它转化为向量表示,这两个句子形成的词表(不去停用词)为:
[‘also’, ‘football’, ‘games’, ‘john’, ‘likes’, ‘mary’, ‘movies’, ‘to’, ‘too’, ‘watch’]
因此,它们的向量表示为:
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]
- 优点:词袋模型思想相当朴素,可以进行文本表示,算是初阶的文本特征表示方法。它通常能学习出一些关键词和类别之间的映射关系。
-
缺点:①词袋模型本质上只是将文本用向量的形式表示了出来,貌似并没有做什么特征提取和特征降维操作。
②同时呢以词为单位的one-hot表示动辄是数万甚至十数万维度(词太多了),这会造成很严重的维度稀疏问题,这会造成维数灾难,消耗巨额的时间和空间资源。
③在词袋模型中,所有词的权重是相同的,比如basketball和to,很明显后者只是一个普通的介词,甚至可以当停用词来处理掉的,但是它和basketball权重相同,这很不科学。
④词袋模型没有考虑到语言的语序关系,比如:我打篮球与篮球打我这是截然不同的概念(笑,但是在词袋模型中并没有反映出来这种先后关系。
⑤语义鸿沟:最后呢,词袋模型存在语义鸿沟问题:一般来说词语是表达语义的基本单元,因为词袋模型本质上只是将词语符号化,是包含任何语义信息的。 - 改进:针对词袋法的优点以及其缺陷,有人从多个角度对它进行了改进。
①引入词频:顾名思义,这是文本的词袋表示向量不再是普通的 00102100...了,相应位置上的词权重不再是该文本中某个词的数量,而是该词语在整个语料库上的词频。改进后的文本词袋表示如 0 0 67 0 187 43 0 0...
②引入tf-idf:这是较常见的做法:Tf-Idf,即词频-逆文档频率。
TF-IDF有两层意思,一层是"词频"(Term Frequency,缩写为TF),另一层是"逆文档频率"(Inverse Document Frequency,缩写为IDF)。是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。
TF-IDF基于这样一个朴素的思想:某个词的重要性与它在文件中出现的次数呈正比,与它在语料库中出现的次数呈反比。
TF的常用计算公式如公式(2),其中n ij表示词i在文档j中出现的频次。但是只用频次来定义词频的话,长文本中某个词出现频次更高的可能性更大,这一点会影响到不同文档之间相同关键词的权值比较。所以我们一般会对其进行归一化,即分母部分就是统计文档中每个词出现次数的总和。
IDF的常用计算公式如下图
这里D为语料库中总文档数,D(i)为语料库中出现词i的文档数量,注意这里分母+1,这是采用了拉普拉斯平滑,避免有部分新的词没有在语料库中出现过从而导致分母为0的情况出现。此外,注意这里用到了log函数,即对idf的值取了对数。
至于为什么tf和idf是相乘而不是相加,idf为什么要取对数,拉普拉斯平滑方法的选择,这些都是经过大量理论推导和实验研究的,具体细节此处不表。
最后,需要注意的是,同一个词,在同一语料库下的不同文档中,它的tf-idf值是不同的:准确的来讲,是idf值相同,但tf值不同,因为词频的计算是依据特定文档的。
③引入N-gram
针对词袋模型无法表达语序这样的缺陷,有人提出了N-gram模型。本质上来讲,N-gram是一种语言模型,我们这里只是借用了它的思想,即为了解决词袋模型不考虑语序关系的问题,我们构建了一个大小为N的词滑动窗口进行新的表征。其实词袋模型就是一个1-Gram模型举例来说,对于一句话
The brown fox jump up the rog.
其对应的词袋模型为:
(The, brown, fox, jump, up, the, rog)
对应的2-gram模型为:
((The, brown), (brown, fox), (fox, jump), (jump, up), (up, the), (the, rog))
其他的话本质上还是和词袋模型相同:N-gram模型的缺点是会造成更高的时空开销,维度也更加稀疏了。
关于N-gram在语言模型上的知识以后再表。
其他方法亦可另见《python自然语言处理实战:核心技术与算法》P85:tf-idf算法、TextRank算法、LSA/LSI/LDA算法
基于embedding的特征表示
文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。文本向量化是文本表示的一种重要方式。文本向量化就是讲文本表示成一系列能够表达文本语义的向量。
当前阶段,对文本向量化的大部分研究都是通过词向量化来实现的。与此同时,也有相当一部分研究者将文章或者句子作为文本基本处理单元,提出了doc2vec和ste2vec技术。
基于embedding的词表示,其核心思想是:上下文相似的词,其语义也相似。这就是著名的词空间模型(word space model),词向量通常使用神经网络模型训练得到,神经网络模型就是根据上下文与目标词之间的关系进行建模。
word2vec glove fasttext
word2vec改进→doc2vec:word2vec丢失了文本的语序信息,而文本的语序包含了重要信息。doc2vec主要有两个模型:DM和DBOW模型,DM和CBOW模型相对应,可以根据上下文词向量和段向量预测目标词的概率分布;DBOW与Skip-gram相对应,只输入段向量,预测从段落中随机抽取的词组概率分布。总体而言,doc2vec是word2vec的升级,不仅提取了文本的语义信息,而且提取了文本的语序信息。
关于word2vec篇幅有点大,我们不在这里讲了,移步此处
基于神经网络(NN)的特征表示
cnn rnn
NN的好处在于能end2end实现模型的训练和测试,利用模型的非线性和众多参数来学习特征,而不需要手工提取特征。CNN善于捕捉文本中关键的局部信息,而RNN则善于捕捉文本的上下文信息(考虑语序信息),并且有一定的记忆能力。
网友评论