特征提取—scikit-learn019
4.2.4.2. 特征提取特征提取 模块sklearn.feature_extraction sklearn.feature_extraction可用于提取符合机器学习算法支持的特征,比如文本和图片。 NoteNote 特征特征提取与 特征选择 有很大的不同:前者包括将任意数据(如文本或图像)转换为 可用于机器学习的数值特征。后者是将这些特征应用到机器学习中。 4.2.1.4.2.1. 从字典类型加载特征从字典类型加载特征 类DictVectorizer DictVectorizer可用于将标准的 Python 字典(dict)对象列表的要素数组转换为 scikit- learn 估计器使用的 NumPy/SciPy 表示形式。 虽然 Python 的处理速度不是特别快,但 Python 的dict优点是使用方便,稀疏(不需要 存储的特征),并且除了值之外还存储特征名称。 类DictVectorizer DictVectorizer实现了 “one-of-K” 或 “one-hot” 编码,用于分类(也称为标称,离 散)特征。分类功能是 “属性值” 对,其中该值被限制为不排序的可能性的离散列表 (例如主题标识符,对象类型,标签,名称…)。 在下面的例子,”城市” 是一个分类属性,而“温度” 是传统的数字特征: measurements=[ { city : Dubai , temperature :33.}, { city : London , temperature :12.}, { city : San Francisco , temperature :18.}, ] fromfromsklearn.feature_extractionsklearn.feature_extractionimportimportDictVectorizer vec=DictVectorizer() vec.fit_trans(measurements).toarray()array([[ 1., 0., 0., 33.], [ 0., 1., 0., 12.], [ 0., 0., 1., 18.]]) vec.get_feature_names()[ city=Dubai , city=London , city=San Francisco , temperature ] 类DictVectorizer DictVectorizer也是对自然语言处理模型中训练序列分类器的有用的表示变换,通常通过 提取围绕感兴趣的特定的词的特征窗口来工作。 例如,假设我们具有提取我们想要用作训练序列分类器(例如:块)的互补标签的部分语 音(PoS)标签的第一算法。以下 dict 可以是在 “坐在垫子上的猫” 的句子,围绕 “sat” 一词提取的这样一个特征窗口: pos_window=[ { word-2 : the , pos-2 : DT , word- 1 : cat , pos-1 : NN , word+1 : on , pos+1 : PP , }, # in a real application one would extract many such dictionaries ] 该描述可以被矢量化为适合于呈递分类器的稀疏二维矩阵(可能在被管道 text.TfidfTransertext.TfidfTranser进行归一化之后): vec=DictVectorizer() pos_vectorized=vec.fit_trans(pos_window) pos_vectorized pos_vectorized.toarray()array([[ 1., 1., 1., 1., 1., 1.]]) vec.get_feature_names()[ pos+1=PP , pos-1=NN , pos-2=DT , word+1=on , word-1=cat , word-2=the ] 你可以想象,如果一个文本语料库的每一个单词都提取了这样一个上下文,那么所得的矩 阵将会非常宽(许多 one-hot-features),其中大部分通常将会是0。为了使结果数据结 构能够适应内存,该类``DictVectorizer`` 的scipy.sparse默认使用一个矩阵而不是一个 numpy.ndarray。 4.2.2.4.2.2.特征哈希(相当于一种降维技巧)特征哈希(相当于一种降维技巧) 类FeatureHasher FeatureHasher是一种高速,低内存消耗的向量化方法,它使用了`特征散列 feature hashing `_ 技术 ,或可称为 “散列 法” (hashing trick)的技术。代替在构建训练中遇到的特征的哈希表,如向量化所做的 那样FeatureHasher FeatureHasher将哈希函数应用于特征,以便直接在样本矩阵中确定它们的列索引。结 果是以牺牲可检测性为代价,提高速度和减少内存的使用; 哈希表不记得输入特性是什么样 的,没有inverse_trans办法。 由于散列函数可能导致(不相关)特征之间的冲突,因此使用带符号散列函数,并且散列 值的符号确定存储在特征的输出矩阵中的值的符号。这样,碰撞可能会抵消而不是累积错 误,并且任何输出要素的值的预期平均值为零。默认情况下,此机制将使用 alternate_sign=True启用,对于小型哈希表大小(n_features fromfromsklearn.feature_extraction.textsklearn.feature_extraction.textimportimportCountVectorizer 这个模型有很多参数,但参数的默认初始值是相当合理的(请参阅参考文档 了解详细信 息): vectorizer=CountVectorizer() vectorizerCountVectorizer(analyzer=. word , binary=False, decode_error=. strict , dtype=, encoding=. utf-8 , =. content , lowercase=True, max_df=1.0, max_features=None, min_df=1, ngram_range=(1, 1), preprocessor=None, stop_words=None, strip_accents=None, token_pattern=. (?u)\\b\\w\\w+\\b , tokenizer=None, vocabulary=None) 我们用它来对简约的文本语料库进行 tokenize(分词)和统计单词出现频数: corpus=[ This is the first document. , This is the second second document. , And the third one. , Is thi