0
点赞
收藏
分享

微信扫一扫

【sklearn】训练集和测试集维度不一致问题(svm调用predict出现ValueError: X.shape should be equal to或者Dimension mismatch等问题

TiaNa_na 2022-04-04 阅读 92
sklearn

【sklearn】训练集和测试集维度不一致问题(调用predict出现Dimension mismatch ValueError: X.shape should be equal to 等

问题记录

在使用TF-IDF 进行文本训练时,首先svm在predict时出现报错:

我暂时注释掉svm模型,使用MultinomialNB模型,仍然在predict出出现

可见并不是单个模型原因,是数据处理出了问题

寻找答案

svm搜索

使用svm报错的关键词搜索,发现使用scikit-learn python的线性SVM时的ValueError
上面链接中给出的解释是

也就是说测试集中包含训练集中没有的数据,建议使用load_svmlight_file读取数据时指定n_feature这个参数。
sklearn.datasets.load_svmlight_file该函数的说明介绍,但是我之前也没有使用这个函数读文件,修改困难,所以寻找其它方法解决问题。

MultinomialNB报错搜索

使用朴素贝叶斯模型的报错搜索问题,发现这个相关回答非常多,找对了。
答案较多,附上其中一个链接sklearn调用朴素贝叶斯.predict()报错dimension mismatch
上面说

需要修改为

翻译一下就是,fit_transorm 又训练又变换了,然后对于测试集的文件只需要使用归一化操作
我仔细检测我自己的文件,果然发现,一开始写的TF-IDF中,对于变量的处理是tf.fit_tranform 函数,然后测试集也直接调用了该函数,所以出错。

但当我修改了该函数发现了新的报错

问题解决

为什么仍然出现维度不对的情况呢,我又搜索了新的报错,发现链接
ValueError: Input has n_features=10 while the model has been trained with n_features=4261
上面给的解答方案没看懂,但他说

CountVectorizer 仍然在被x_test训练,又仔细查看代码发现,CountVectorizer那里漏了一个fit_tranform没修改。因此附上修改后的代码

vectorizer = CountVectorizer(min_df=1e-5) #将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(contents) #计算个词语出现的次数)   
tfidf_test = transformer.transform(vectorizer.transform(content_test))#将词频矩阵X统计成TF-IDF值 
举报

相关推荐

0 条评论