簡體   English   中英

如何在新數據上使用 sklearn TfidfVectorizer

[英]How to use sklearn TfidfVectorizer on new data

我有一個相當簡單的 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' ,它是TrueFalse

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:維度不匹配”

在訓練期間使用 tf.fit_transform() 提取詞匯以生成稀疏向量后,您需要使用 tf.transform() 而不是 fit_transform()。 所以測試集的特征應該是

new_text_tf = tf.transform(new_data['post_clean'])

當您在測試/新數據上使用 tf.fit_transform() 時,它會根據測試數據中可能與訓練數據不同的單詞提取新詞匯表。 詞匯表的差異會產生維度不匹配錯誤。

您還應該將測試數據和訓練數據合並為一個主集,然后在該主集上運行 fit_transform() 以便即使是僅在測試集中的單詞也能在您的矢量化器中捕獲。 其余代碼可以保持不變。 如果測試集中的單詞不在訓練集中,這樣做可以提高您的准確性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM