我有一个相当简单的NLTK和sklearn分类器(我是一个完全菜鸟)。
我照常进口
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
from sklearn.feature_extraction.text import TfidfVectorizer
我加载了数据(我已经清理了)。这是一个非常简单的数据框,具有两列。第一个是'post_clean'
,其中包含已清除的文本,第二个是'uk'
,其为True
或False
data = pd.read_pickle('us_uk_posts.pkl')
然后我使用tfidf进行矢量化并拆分数据集,然后创建模型
tf = TfidfVectorizer()
text_tf = tf.fit_transform(data['post_clean'])
X_train, X_test, y_train, y_test = train_test_split(text_tf, data['uk'], test_size=0.3, random_state=123)
clf = MultinomialNB().fit(X_train, y_train)
predicted = clf.predict(X_test)
print("MultinomialNB Accuracy:" , metrics.accuracy_score(y_test,predicted))
显然,除非我在这里完全错过了某些内容,否则我的准确度为93%
我的两个问题是:
1)我现在如何使用该模型对没有已知UK
值的某些物品进行实际分类?
2)如何使用完全独立的测试集(尚未拆分)测试该模型?
我尝试过
new_data = pd.read_pickle('new_posts.pkl')
new_posts数据的格式相同
new_text_tf = tf.fit_transform(new_data['post_clean'])
predicted = clf.predict(new_X_train)
predicted
和
new_text_tf = tf.fit_transform(new_data['post_clean'])
new_X_train, new_X_test, new_y_train, new_y_test = train_test_split(new_text_tf, new_data['uk'], test_size=1)
predicted = clf.predict(new_text_tf)
predicted
但都返回“ ValueError:尺寸不匹配”
答案 0 :(得分:1)
一旦使用tf.fit_transform()提取了词汇表以生成稀疏矢量,则需要使用tf.transform()而不是fit_transform()。因此测试集的功能应该是
System.Out
当您在测试/新数据上使用tf.fit_transform()时,它将根据测试数据中可能与您的训练数据不同的单词提取新词汇。词汇上的差异会产生维度失配错误。
您还应该将测试数据和训练数据都组合到一个主集中,然后在该主集中运行fit_transform(),以便即使是仅在测试集中的单词也可以在矢量化器中捕获。您的其余代码可以保持不变。如果测试集中的单词不在训练集中,这样做可以提高准确性。