我有以下带有数据的数据帧:
index field1 field2 field3
1079 COMPUTER long text.... 3
字段1是一个类别,字段2是一个描述,字段3只是字段1的整数表示。
我使用以下代码来学习sklearn的field2到类别映射:
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
X_train, X_test, y_train, y_test = train_test_split(df['Text'], df['category_id'], random_state = 0)
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
clf = MultinomialNB().fit(X_train_tfidf, y_train)
在我训练了模型之后,我可以用它来预测一个类别,而且效果很好。但是,我想使用测试集来评估模型。
X_test_counts = count_vect.fit_transform(X_test)
X_test_tfidf = tfidf_transformer.fit_transform(X_test_counts)
clf.score(X_test_tfidf, y_test)
它抛出以下错误:
ValueError: dimension mismatch
有没有办法测试模型并用这样的数据集获得分数或准确性?
更新:向测试集添加类似的转换。
MultinomialNB
分类器适用于具有离散特征的分类(例如,用于文本分类的字数(。多项式分布通常需要整数特征计数。CCD_ 2变换将文档编码为连续值特征。然而,在实践中,分数计数(如tf idf(也可能起作用[参考]。
要解决您的问题,请将您的代码更改为以下内容:
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(df['Text'].values.tolist())
X_train, X_test, y_train, y_test = train_test_split(X_train_counts, df['category_id'], random_state = 0)
clf = MultinomialNB().fit(X_train, y_train)
clf.predict(X_test)
要增强您的代码,请使用Pipeline:
from sklearn.pipeline import Pipeline
X_train, X_test, y_train, y_test = train_test_split(df['Text'], df['category_id'], random_state = 0)
text_clf = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', MultinomialNB())])
text_clf.fit(X_train, y_train)
text_clf.predict(X_test)
从您提供的代码来看,您可能忘记了像使用X_train
那样转换/转换X_test
。
更新:
关于问题中现在显示的新错误:
ValueError: dimension mismatch
由于变压器已经安装到训练集,您只需在测试集上调用.transform()
:
tfidf_transformer.transform(X_test_counts)
点击此处了解更多信息。
您应该只转换测试数据。不适合转换(_T(。适合转换训练数据,而只转换测试数据(_T(。因此,如果删除测试数据上的"fit_",它应该会起作用。
最好使用将进行转换的管道,然后进行训练/评分/预测。例如
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
model = Pipeline(steps = [
('word_vec', CountVectorizer()),
('word_tdf', TfidfTransformer()),
('mnb',MultinomialNB()),
])
simple_model.fit(X_train,y_train)
simple_model.score(X_test,y_test)
这使您可以获得更简单的代码,并且不太可能拟合转换测试数据。