scikit-learn 文本分类 ValueError:X 和 y 维度不匹配
我正在尝试根据类别对文档进行分类。我想训练几个不同的类别,然后给它一些文本,让它告诉我这段文本属于哪个类别。为了训练,我使用的是20个新闻组的数据。但是我遇到了一个错误:“ValueError: X和y的形状不兼容,X有5个样本,但y有4个。”这个错误出现在classifier.fit(X_train, Y)这行代码上。
有没有人能告诉我,为什么X有5个样本,而X是从data_train加载的,data_train只包含4个类别?另外,我也非常希望能得到一些建议,让我能更好地完成这个任务。
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn import preprocessing
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.multiclass import OneVsRestClassifier
remove = ()
categories = [ 'alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space']
categories_test = ['sci.space' ]
print("Loading newsgroups dataset for categories:")
data_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42, remove=remove)
data_test = fetch_20newsgroups(subset='test', categories=categories_test, shuffle=True, random_state=42, remove=remove)
X_test = data_test
X_train = data_train
y_train = data_train.target_names
lb = preprocessing.LabelBinarizer()
Y = lb.fit_transform(y_train)
classifier = Pipeline([
('vectorizer', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])
classifier.fit(X_train, Y)
predicted = classifier.predict(X_test)
all_labels = lb.inverse_transform(predicted)
for item, labels in zip(X_test.target_names, all_labels):
print '%s => %s' % (item, ', '.join(labels))
1 个回答
0
问题出在这里:
X_train = data_train
y_train = data_train.target_names
你的 data_train
是一个对象,而不是一个样本数组,所以你把这个对象存储在 X_train
里,但你其实只想要输入参数(这些参数可能在 data_train
的 .data
字段里)。另外,“target_names”是标签的名称,而不是实际的标签(如果我没记错的话,实际的标签存储在 .target
里)。
应该是这样的:
X_train = data_train.data
y_train = data_train.target
同样的情况也适用于“data_test”。