我们将简要介绍一些常用的特征提取方法:
一,字典加载特征
用python中的字典存储特征是一种常用的做法,其优点是容易理解。但是sklearn的输入特征必须是numpy或scipy数组。可以用DictVectorizer从字典中加载特征转换成numpy数组,并且对分类特征会采用独热编码(one-hot)。
二,文本特征提取
词库模型(Bag-of-words model)是文字模型化最常用方法,它为每个单词设值一个特征值。依据是用类似单词的文章意思也差不多。
CountVectorizer 类会将文档全部转换成小写。然后把句子分割成词块(token)或有意义的字母序列,并统计它们出现的次数。词块大多是单词,但是他们也可能是一些短语,字母长度小于2的词块(如 I, a)被略去。
可以用stop_words选项排除一些常用但没有太多意义的助词(如is,are,in)。
对于对中文文本进行词频特征提取,可以先用jieba进行分词。
单词频率对文档意思有重要作用,但是在对比长度不同的文档时,长度较长的文档的单词频率将明显倾向于更大。因此将单词频率正则化为权重是个好主意。
此外,如果一些词在需要分析的文集中的所有文档中都出现,那么可以认为这些词是文集中的常用词,对区分文集中的文档帮助不大。因此,可以把单词在文集中出现的频率考虑进来作为修正。
Tf-idf即是考虑到这两方面因素设计的一个优化的词频权重指标。在搜索和数据挖掘中经常使用。
TfidfTransformer可以把普通的词频向量转换成Tf-idf权重向量。
类TfidfVectorizer则将 CountVectorizer 和 TfidfTransformer 的功能集成在了一起。
词袋模型的方法很好用,也很直接,但在有些场景下很难使用,比如分词后的词汇字典表非常大,达到100万+,此时如果直接使用词频向量或Tf-idf权重向量的方法,将对应的样本对应特征矩阵载入内存,有可能将内存撑爆,在这种情况下我们该怎么办呢?
我们可以应用哈希技巧进行降维。
Hash函数可以将一个任意长度的字符串映射到一个固定长度的散列数字中去。Hash函数是一种典型的多对一映射。
目前流行的Hash函数包括MD4,MD5,SHA等。
利用HashingVectorizer的n_features设置可以将特征数量降至任意我们想要的范围。但是由于碰撞可能发生,有些特征的值会由于碰撞累加得过高产生偏差。HashingVectorizer通过使用有符号哈希函数巧妙地解决了这个问题。
三,图片特征提取
图片特征提取的最常用方法是获取图片的像素矩阵,并将其拼接成一个向量。