scikit-learn文本文档的分类ValueError:X和y具有不兼容的形状

时间:2014-05-29 15:20:57

标签: python machine-learning artificial-intelligence scikit-learn

我正在尝试按类别对文档进行分类。我想训练几类数据,然后给它一些文字,让它告诉我该文本属于哪个类别。对于培训,我使用的是20个新闻组。我收到这个错误 " ValueError:X和y具有不兼容的形状X有5个样本,但y有4" at classifier.fit(X_train,Y)。

有谁能告诉我X怎么来有5个样本,X来自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 :(得分:0)

问题出在这里:

X_train = data_train
y_train = data_train.target_names

你的data_train是一个对象,而不是一个样本数组,所以你要将这个对象存储在X_train中,而你只需要输入参数(可能在.data字段{{1} }})。此外,“target_names”是标签的名称,而不是实际标签(如果我记得错误,则存储在data_train中)

应该是

.target

同样适用于“data_test”。