我是靠谱客的博主 甜美大山,最近开发中收集的这篇文章主要介绍TfidfVectorizer - Vocabulary wasn't fitted,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

tfidf_train = TfidfTransformer().fit_transform(X_new)
test_data = TfidfVectorizer().transform(val_test)

这是因为在计算训练数据的tfidf之前进行卡方检验筛出了一部分的特征值(即特征词),那么返回的tfidf_train的二维矩阵每一行维度就会比原始数据矩阵维度小,因为筛出了一部分词,例如卡方前原始数据:

array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 5.4,  3.9,  1.7,  0.4],
       [ 4.6,  3.4,  1.4,  0.3],
卡方后的:

array([[ 1.4,  0.2],
       [ 1.4,  0.2],
       [ 1.3,  0.2],
       [ 1.5,  0.2],
       [ 1.4,  0.2],
       [ 1.7,  0.4],
       [ 1.4,  0.3],

那在对test_data进行transform时,没有设定TfidfVectorizer()的vocabulary_参数(vocabulary_:只使用特定的词汇),没有设定的话,对val_test列表transform时会使每一行维度与卡方后的特征数不相等,

 

解决方法:添加vocabulary,并且要用fit_transform方法,因为要先拟合数据格式,对训练数据降维,只选取卡方后的特征进行计算,然后再是tranform标准化,不能直接不拟合就标准化

那么vocabulary如何添加,我们来看看vocabulary的定义:

vocabulary : Mapping or iterable, optional

Map:也是一个映射(Map)(例如,字典),其中键是词条而值是在特征矩阵中索引 形式为{'你':0,‘好’:1,‘吗’:2}

在映射中索引不能有重复,并且不能在0到最大索引值之间不能有间断,数字值应是连续的

iterable:词条中迭代器。可迭代的数据类型如string list array等python可迭代的类型即可

如果没有给出,词汇表被确定来自输入文件

 

那么我们从map和iterable两种下手,我一开始尝试了map形式,即生成选择完卡方的特征的词典,但是代码更复杂并且没有达到效果,因为字典键值对中的value是特征矩阵的索引,例如上面举例的数组,卡方完成后保留了后两个特征变为两列,那么索引应该是(2,3)(从0开始),但是又要求索引要从0开始到最大值不间断,若要根据这条规则转换value值,那么索引便就不对了,就变成了(0,1),这样便找不到相应特征了

故用Iterable方式,选取list列表形式的即可,代码如下

def fit_feature(feature_names,indics):
    rel_voc = []
    for i in indics:
        rel_voc.append(feature_names[i])
    return rel_voc
couting = CountVectorizer()
val_count = couting.fit_transform(val_train)
feature_names = couting.get_feature_names()
feature_dict =  SelectKBest(chi2, k=8)
X_new = feature_dict.fit_transform(val_count, target_train)
#获取卡方选取的特征索引值
indics = feature_dict.get_support(indices=True)

get_feature_names()可以得到计算词频时生成的特征值列表 例如  [‘你好’,‘金融’,‘经济’]  这样的列表

get_support(indices=True)可以得到卡方选取的特征在原来特征列表的索引,indices等于true时,返回的是int型的整数(从0开始)

最后调用函数即可

rel_voc = fit_feature(feature_names,indics)
test_data = TfidfVectorizer(vocabulary=rel_voc).fit_transform(val_test)

 

最后

以上就是甜美大山为你收集整理的TfidfVectorizer - Vocabulary wasn't fitted的全部内容,希望文章能够帮你解决TfidfVectorizer - Vocabulary wasn't fitted所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部