Cha*_*ton 5 python nlp nltk scikit-learn
我有一个相当简单的 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
Run Code Online (Sandbox Code Playgroud)
我加载数据(我已经清理过它)。这是一个非常简单的数据框,有两列。第一个是包含清理后的'post_clean'文本,第二个是'uk'或者TrueFalse
data = pd.read_pickle('us_uk_posts.pkl')
Run Code Online (Sandbox Code Playgroud)
然后我使用 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))
Run Code Online (Sandbox Code Playgroud)
显然,除非我完全遗漏了一些东西,否则我的准确度为 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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
但两者都返回“ValueError:尺寸不匹配”
在使用 tf.fit_transform() 训练期间提取词汇以生成稀疏向量后,您需要使用 tf.transform() 而不是 fit_transform()。所以测试集的特征应该是
new_text_tf = tf.transform(new_data['post_clean'])
Run Code Online (Sandbox Code Playgroud)
当您在测试/新数据上使用 tf.fit_transform() 时,它会根据测试数据中的单词提取新词汇,这些单词可能与训练数据不同。词汇表的差异会产生维度不匹配误差。
您还应该将测试数据和训练数据合并到一个主集中,然后在该主集中运行 fit_transform() ,以便即使仅在测试集中的单词也能在矢量化器中捕获。其余代码可以保持不变。如果测试集中有训练集中没有的单词,这样做可以提高您的准确性。
| 归档时间: |
|
| 查看次数: |
5578 次 |
| 最近记录: |