【sklearn第五讲】特征提取(上)

机器学习训练营——机器学习爱好者的自由交流空间(qq 群号:696721295)

sklearn.feature_extraction模块用来以一种机器学习算法支持的格式提取数据集的特征。实际上,特征提取就是将任意类型的数据,比如说文本或图像,变换为可供机器学习算法使用的数值向量。

加载特征

DictVectorizer类能够用来将字典对象列表表示的特征数据转换为NumPy/SciPy表示形式。Python的字典对象虽然处理速度较慢,但也有一些优势,例如,使用方便,除了存储值以外还可以存储特征的名字。对于类别特征,DictVectorizer类执行one-of-K或one-hot编码规则。类别变量是“属性-值”成对形式,在这里,值被限制到一个无序的离散值列表上。例如,对象类型、标签、名字等等。下面的例子里,city是一个类别属性,而temperature是一个数值特征。

measurements = [
     {'city': 'Dubai', 'temperature': 33.},
     {'city': 'London', 'temperature': 12.},
     {'city': 'San Francisco', 'temperature': 18.},
]
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
vec.fit_transform(measurements).toarray()

这里写图片描述

vec.get_feature_names()

这里写图片描述

文本特征提取

Bag of Words 表示法

文本分析是机器学习算法的一个主要应用领域。然而原始数据通常是一个符号标识序列,不能直接提供给算法,因为这些算法要求具有固定大小的数值型特征向量,而不是原始文档。为了解决这个问题,scikit-learn提供了一组从文本内容里提取数值向量的通用工具。

  • 标记字符串,对每一个可能的记号给予一个整数id, 例如,使用空格或其它标点符号作为记号的分隔符。

  • 计数记号在每个文档里的出现次数。

  • 归一化、加权出现在大多数样本/文档里的重要记号。

在这套方案里,特征和样本定义如下:

  • 每一个记号出现的频数被定义为一个特征。

  • 对一个给定的文档,所有记号频数组成的向量被定义为多维样本。

这样一来,全部文档就可以用一个矩阵表示,其中每个文档对应矩阵的一行,出现在全部文档里的每个记号(例如单词)对应矩阵的一列。我们称将一个文档集转换为一个数值特征向量的过程为向量化(vectorization). 这其中的特殊策略(打记号、计数、归一化)称为Bag of Words表示。文档由词出现频数表示,而完全忽略了词在文档里的相对位置信息。

稀疏性

由于大部分文档典型地只使用了全部词汇中的少数词,这导致结果矩阵有很多特征的值是0(典型的超过99%的特征)。例如,10,000个短文本(例如e-mails)合集将使用一张包括10万个单词的词汇表,而每个文档仅使用100到1000个不同的词。为了实现既能在内存中存储这样的矩阵,又能加快矩阵/向量的代数运算,我们将使用一种稀疏化的矩阵表示,详见scipy.sparse包里可利用的操作。

常见的向量化方法

CountVectorizer类能够执行打标记和出现次数统计。

from sklearn.feature_extraction.text import CountVectorizer

该模型有很多参数,而且参数的默认值对一般情况是合理的。

vectorizer = CountVectorizer()
vectorizer

这里写图片描述

现在,让我们使用它对一个文档示例打记号和统计词的出现频数。

corpus = [
     'This is the first document.',
     'This is the second second document.',
     'And the third one.',
     'Is this the first document?',
]
X = vectorizer.fit_transform(corpus)
X

这里写图片描述

默认的配置通过提取至少有2个字母的词,给字符串打记号。执行这一步的特别函数可以被明确地要求。

analyze = vectorizer.build_analyzer()
analyze("This is a text document to analyze.") == (
        ['this', 'is', 'text', 'document', 'to', 'analyze'])

这里写图片描述

在拟合的过程里,analyzer找到的每一项都被分配一个唯一的整数index, 对应结果矩阵的一列。按下面的方式查看矩阵列的解释说明:
对应结果矩阵的一列。按下面的方式查看矩阵列的解释说明:

vectorizer.get_feature_names() == (
        ['and', 'document', 'first', 'is', 'one',
         'second', 'the', 'third', 'this'])
X.toarray()         

这里写图片描述

这里写图片描述

相反,由特征名映射到列index, 存储在vectorizer的vocabulary_属性里。

vectorizer.vocabulary_.get('document')

这里写图片描述

因此,没有出现在训练集的词将在调用transform方法时完全忽略。

vectorizer.transform(['Something completely new.']).toarray()

这里写图片描述

阅读更多精彩内容,请关注微信公众号:统计学习与大数据

猜你喜欢

转载自blog.csdn.net/wong2016/article/details/80633591