Scikit 文本分类——错误的输入形状错误
Scikit Text Classification – Bad input shape error
我修改了本教程 (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html) 以在路透社语料库上构建文本分类器。但是,我收到错误的输入形状错误:
编辑:感谢@Vivek Kumar 的帮助,我解决了 Bad input shape 问题。但是,现在我得到一个 AttributeError: lower not found。经过一些研究,我认为这可能与路透社语料库没有正确的形式有关。有什么办法可以解决这个问题吗?
这是我的代码:
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 的真正初学者,所以我真的不太了解所有这些东西(目前)。
感谢您的任何建议和帮助!
那是因为您没有使用 CountVectorizer 中的实际数据。您正在使用 reuters_train
而您应该使用 reuters_train.data
。
变化:
train_counts = count_vect.fit_transform(reuters_train)
至:
train_counts = count_vect.fit_transform(reuters_train.data)
还有 CountVectorizer + TfidfTransformer = TfidfVectorizer。所以我建议使用两个对象的替代。
进一步阅读 RCV1 dataset here 的描述后,假设 .data
包含:
Non-zero values contains cosine-normalized, log TF-IDF vectors.
所以实际上不需要对数据做CountVectorizer和TfidfTransformer,可以直接这样使用:
clf = MultinomialNB().fit(reuters_train.data, reuters_train.target)
但是你会再次遇到错误,这次是由于目标数据的形状。您会看到 MultinomialNB().fit()
仅适用于单一维度目标(可能是多 class 或二进制),但不适用于多标签或多输出数据。
TLDR; 所以您需要从代码中删除 CountVectorizer 和 TfidfTransformer,因为它已经在数据中完成,您需要将 classifier MultinomialNB 更改为任何其他支持目标 y
中的二维,例如 DecisionTreeClassifier 或其他。
我修改了本教程 (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html) 以在路透社语料库上构建文本分类器。但是,我收到错误的输入形状错误:
编辑:感谢@Vivek Kumar 的帮助,我解决了 Bad input shape 问题。但是,现在我得到一个 AttributeError: lower not found。经过一些研究,我认为这可能与路透社语料库没有正确的形式有关。有什么办法可以解决这个问题吗?
这是我的代码:
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 的真正初学者,所以我真的不太了解所有这些东西(目前)。 感谢您的任何建议和帮助!
那是因为您没有使用 CountVectorizer 中的实际数据。您正在使用 reuters_train
而您应该使用 reuters_train.data
。
变化:
train_counts = count_vect.fit_transform(reuters_train)
至:
train_counts = count_vect.fit_transform(reuters_train.data)
还有 CountVectorizer + TfidfTransformer = TfidfVectorizer。所以我建议使用两个对象的替代。
进一步阅读 RCV1 dataset here 的描述后,假设 .data
包含:
Non-zero values contains cosine-normalized, log TF-IDF vectors.
所以实际上不需要对数据做CountVectorizer和TfidfTransformer,可以直接这样使用:
clf = MultinomialNB().fit(reuters_train.data, reuters_train.target)
但是你会再次遇到错误,这次是由于目标数据的形状。您会看到 MultinomialNB().fit()
仅适用于单一维度目标(可能是多 class 或二进制),但不适用于多标签或多输出数据。
TLDR; 所以您需要从代码中删除 CountVectorizer 和 TfidfTransformer,因为它已经在数据中完成,您需要将 classifier MultinomialNB 更改为任何其他支持目标 y
中的二维,例如 DecisionTreeClassifier 或其他。