如何使用scikit-learn评估基于文本的模型



我有以下带有数据的数据帧:

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)

这使您可以获得更简单的代码,并且不太可能拟合转换测试数据。

最新更新