scikit-learn 文本分类 ValueError:X 和 y 维度不匹配

0 投票
1 回答
839 浏览
提问于 2025-04-18 07:57

我正在尝试根据类别对文档进行分类。我想训练几个不同的类别,然后给它一些文本,让它告诉我这段文本属于哪个类别。为了训练,我使用的是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”。

撰写回答