概述
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复