首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scikit文本分类-输入形状错误

Scikit文本分类-输入形状错误
EN

Stack Overflow用户
提问于 2017-09-03 19:17:34
回答 1查看 879关注 0票数 2

我已经修改了本教程(data.html),以便在路透社语料库上构建文本分类器。但是,我得到了一个错误的输入形状:

编辑:由于@Vivek Kumar的帮助,我已经解决了不良输入形状问题。但是,现在我得到了一个AttributeError:较低的未找到。经过一些研究,我认为这可能与路透社的语料库没有正确的形式有关。有什么办法能解决这个问题吗?

这是我的守则:

代码语言:javascript
复制
from sklearn.datasets import fetch_rcv1 #import reuters corpus
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

rcv1 = fetch_rcv1()


reuters_train = fetch_rcv1(subset='train', shuffle=True, random_state=42)
reuters_train.target_names

count_vect = CountVectorizer()

train_counts = count_vect.fit_transform(reuters_train.data)
train_counts.shape
count_vect.vocabulary_.get(u'alogrithm')

tf_transformer = TfidfTransformer(use_idf=False).fit(train_counts)
train_tf = tf_transformer.transform(train_counts)
train_tf.shape
tfidf_transformer = TfidfTransformer()
train_tfidf = tfidf_transformer.fit_transform(train_counts)
train_tfidf.shape

clf = MultinomialNB().fit(train_tfidf, reuters_train.target)

text_clf = Pipeline([('vect', CountVectorizer()),
                     ('tfidf', TfidfTransformer()),
                     ('clf', MultinomialNB()),])

text_clf.fit(reuters_train.data, reuters_train.target)
Pipeline(...)

import numpy as np

reuters_testset = fetch_rcv1(subset='test', shuffle=True, random_state=42)

reuters_test = reuters_testset.data

predicted = text_clf.predict(reuters_test)

np.mean(predicted == reuters_test.target)

我是一个编程和NLP的真正初学者,所以我真的不太了解所有的东西(目前)。谢谢你的建议和帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-04 05:55:26

这是因为您没有使用CountVectorizer中的实际数据。您使用的是reuters_train,而应该使用reuters_train.data

更改:

代码语言:javascript
复制
train_counts = count_vect.fit_transform(reuters_train)

至:

代码语言:javascript
复制
train_counts = count_vect.fit_transform(reuters_train.data)

也是CountVectorizer + TfidfTransformer = TfidfVectorizer。因此,我建议使用两个对象的替换。

在进一步阅读这里的RCV1数据集的描述时,考虑到.data包含:

非零值包含余弦归一化,日志TF-以色列国防军向量.

因此,没有必要实际对数据执行CountVectorizer和TfidfTransformer,您可以这样直接使用它:

代码语言:javascript
复制
clf = MultinomialNB().fit(reuters_train.data, reuters_train.target)

但是您将再次遇到一个错误,这一次由于目标数据的形状。您可以看到,MultinomialNB().fit()只适用于一维目标(可能是多类或二进制),而不适用于多标签或多输出数据。

TLDR;,所以您需要从代码中删除CountVectorizer和TfidfTransformer,因为它已经在数据中完成了,并且需要将分类器MultinomialNB更改为在目标y中支持2-d的任何其他类型,比如DecisionTreeClassifier或其他。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46027033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档