[特征工程]Chap4. 特征缩放:TF-IDF

本章通过BOW 到tf-idf的变化,讨论 feature scaling 的效果.

TF-IDF: BOW的变种

tf-idf可以说就是BOW基础上的变种, 全称: term frequency- inverse document frequency ,中文: 词频-逆文件频率.

BOW记录文件中的词频, 明显的问题就是会强调一些没意义的词, 如英文中的 'the' 'and' 'it' 等等词频会很高, 而一些带有关键信息的词却没有被强调出来. 而逆文件频率就很好的解决了这一问题, 这个算法有意思的就是在于以一种高效自动的方式给 各种词的重要性 赋权重.

基础公式如下:

bow(w,b) = #times word w appears in document d

tf-idf(w,d) = bow(w,d) * N/ (#documents in which word w appears)

其中 N 是数据集中文档的数量,  N/(#documents in which word w appears) 就是IDF, 逆文档频率. 若 idf 接近1, 意味着这个词w出现在大部分文档中; 若词w仅出现在几个文档中, idf 就会很高.

当然, log transform 是更好的选择:

tf-idf(w,d) = bow(w,d) * log N/ (#documents in which word w appears)

总结一下: tf-idf makes rare words more prominent and effectively ignores common words. 这类似上一章讲的手工取除高频词, 但是在数学比人工设定个阈值要精致的多. 

验证tf-idf的效果

直觉上理解起来tf-idf的效果应该比BOW要好的多, 但是, 实践出真知. 所以简单的方式是拿一个数据集用BOW, BOW的正则化, tf-idf 做一个文本分类来对比一下效果

简单说一下步骤吧, 这里时间原因略写.

  1. 选择, 划分数据集
  2. 提取特征:  BOW        BOW+l2 norm         tf-idf
  3. 特征缩放 (tf-idf本质上就是BOW的特征缩放)这里有几点值得一提: 我们是使用训练集的概率统计来对测试集的数据进行缩放, 这会是结果有些不好看. Min-max scaling的时候测试集不会被映射到0到1间. 对于测试集中新出现的词, 没有对应的文档频率统计, 通常方法是直接不要了, 或者像上一章解决rare word时将这种低频词全都映射进一个专门的'garbage'词类中.
  4. 简单的LR分类+ regularization
  5. 调参, 要对几种方式分别调参到最有结果再进行模型比较

直接看结果吧:


事实证明, tf-idf的分类准确率仅稍微高一点点, 难道特征缩放不比普通的BOW好吗? 那为什么还有加个权重呢...接下来就深入分析一下

深入分析

首先, BOW这类的特征形式一个稀疏的, 每个文档对应的'fixed-length flat vector' 定长扁平向量中, 大部分都是0(因为大部分文档只含有全部可能词的很小的子集). 数据集因此构成了 [document , term] 的 稀疏矩阵.

其次, 特征缩放本质上是对数据矩阵的列变换, tf-idf 和 l2 normalization 都是对列向量乘以常数.

下面来一点线性代数的知识了.先看一下我们的data matrix, size是 [n = #documents, m = #features], 显而易见, 不同词的数量肯定是多余文档数量的, 一般来说有n<m. 那我们的矩阵就是一个 宽而扁的长方形. 

这就导致了 rank deficiencyWhat is rank deficiency, and how to deal with it? (这也是维度灾难的表现吗?)

首先, n(n<m)个数据点肯定是无法描绘m维的向量空间的, 而且在n个数据点中还存在类似/重复的点(线性相关性), 这些都导致了rank deficiency. 其次, 数据的中心化和标准化可以帮助减少rank deficiency的问题(如对一个full rank 矩阵全部entries加1e12, 矩阵就变奇异了,待深入).

也就是这个原因影响了模型的效果, 那么特征缩放能不能帮助解决rank deficiency呢?

特征缩放不会改变列空间的rank, 也不会改变null space 的rank. 但是, 但标量为0时, 一整列的entries都变0,相当于变相减少了列空间维度. 而这正是tf-idf的关键, 通过将这些接近为0的列剪去, 能让模型找重心转向特征空间的其他方向 而找到更好的解. 但是,准确率不会提升明显,  因为剪去的列向量不会有什么噪音.


总结

正确的特征缩放可以

  1. 提升分类水平
  2. 强调有含义的词, 轻视常见的词
  3. 改善一下维度灾难的影响

猜你喜欢

转载自blog.csdn.net/nemoyy/article/details/80189345
今日推荐