首先,如何构建一个完整的机器学习项目呢? 主要有以下几个步骤:
个人认为这里最重要的是第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没有其他数字) 例如有如下两个文档:
①引入词频: 顾名思义,这是文本的词袋表示向量不再是普通的 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基于这样一个朴素的思想: 某个词的重要性与它在文件中出现的次数呈正比,与它在语料库中出现的次数呈反比。
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模型 举例来说,对于一句话
其对应的词袋模型为:
对应的2-gram模型为:
其他的话本质上还是和词袋模型相同:N-gram模型的缺点是会造成更高的时空开销,维度也更加稀疏了。 关于N-gram在语言模型上的知识以后再表。 其他方法亦可另见《python自然语言处理实战:核心技术与算法》P85:tf-idf算法、TextRank算法、LSA/LSI/LDA算法
文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。文本向量化是文本表示的一种重要方式。文本向量化就是讲文本表示成一系列能够表达文本语义的向量。
当前阶段,对文本向量化的大部分研究都是通过词向量化来实现的。与此同时,也有相当一部分研究者将文章或者句子作为文本基本处理单元,提出了doc2vec和ste2vec技术。 基于embedding的词表示,其核心思想是: 上下文相似的词,其语义也相似。 这就是著名的 词空间模型(word space model) ,词向量通常使用神经网络模型训练得到,神经网络模型就是根据上下文与目标词之间的关系进行建模。 word2vec glove fasttext word2vec改进→doc2vec:word2vec丢失了文本的语序信息,而文本的语序包含了重要信息。 doc2vec 主要有两个模型: DM和DBOW 模型,DM和CBOW模型相对应,可以根据上下文词向量和段向量预测目标词的概率分布;DBOW与Skip-gram相对应,只输入段向量,预测从段落中随机抽取的词组概率分布。总体而言,doc2vec是word2vec的升级,不仅提取了文本的语义信息,而且提取了文本的语序信息。
关于word2vec篇幅有点大,我们不在这里讲了,移步 此处
cnn rnn NN的好处在于能end2end实现模型的训练和测试,利用模型的非线性和众多参数来学习特征,而不需要手工提取特征。CNN善于捕捉文本中关键的局部信息,而RNN则善于捕捉文本的上下文信息(考虑语序信息),并且有一定的记忆能力。