2017-06-23 24 views
0

我正在做一個簡單的二進制分類,我給你一個我有問題的例子:可以說我們有n文檔(Doc 1,Doc 2, ...,Doc n。)我們將使用TF-IDF作爲特徵值來訓練一個二進制分類器,使用bag-of-words。我們有m我們的培訓文件的功能(從技術上來說,這是我們在清理和預處理之後在所有這n個文件中具有的唯一令牌的數量)。使用TF-IDF的不同功能數量的測試和培訓組合

現在,讓我們說我們有一個訓練有素的模型,我們要預測一個新文檔的標籤。我們應該首先按照我們培訓文檔的方式預處理測試文檔。然後,我們應該使用TF-IDF爲我們的測試文檔構建一個特徵向量。這裏有兩個問題:

  • 對於培訓和測試集,功能數量將不會相同。我已經閱讀了一些解決方案,但是,從科學的角度來看,我不能滿足!
  • 對於只有一個測試文檔甚至其中幾個測試文檔計算TF-IDF沒有意義。因爲我們在訓練和測試集中使用的令牌字典不一定相同,即使我們具有相同數量的這兩個特徵,也不一定意味着這些特徵是相同的。

因此,現在我只是想弄清楚我們如何使用我們使用bag-of-words模型和TF-IDF值進行訓練的模型來標記新文檔。特別是,我正在尋找對上述兩個具體問題的合理答案。我們可以計算模型的準確性(例如使用交叉驗證),但我不知道我們應該如何爲標記新文檔做些什麼。

P.S.我正在使用scikit-learn和python。

更新:我可以找到我的問題的答案。在這種情況下,我們可以簡單地使用我們用來訓練分類器的相同的TfidfVectorizer。因此,現在每次我培訓一個新的分類器並使用tfidfVectorizer構建我的特徵向量時,我將我的矢量化器保存在一個文件中,使用pickle,並且在創建測試集特徵向量時使用此矢量化器。

+0

想想你將如何在現實世界的場景中繼續前進,在這種場景中,您已經使用所有可用數據進行了訓練,但仍然會在預測時出現新的文本數據。 –

回答

-3

我不能科學地支持這一行動,但你可以嘗試使用功能字典和計算TF-IDF得分上測試集這些功能。這將爲每個測試文檔創建一個與列車矢量大小相同的矢量,並與訓練模型時使用的相同特徵相關聯。你必須用訓練集中沒有出現在測試集中的單詞來解決問題。

請問爲什麼你使用TF-IDF而不是樸素貝葉斯或隨機森林?

+0

「訓練集中沒有出現在測試集中的單詞」這正是我正在尋找答案的問題!據我所知,隨機森林和樸素貝葉斯是我們使用特徵向量後使用的算法。問題在於使用TF-IDF創建用於訓練和測試集的特徵向量。特別是,我認爲不管我們使用什麼算法,我們都應該首先創建特徵向量。 – Pedram

0

您應該在培訓過程中找出所有可能的功能及其IDF權重;在測試時使用基於訓練數據集找到的特徵和權重。不要在測試文檔上計算IDF。

1)當使用袋裝詞法時,常用的方法是丟棄訓練期間看不到的單詞。如果您在訓練過程中沒有看到任何單詞,則您的信息爲零,因此它不會影響預測結果。

2)是的,在預測時間建立詞彙表並計算IDF權重是沒有意義的。使用訓練階段發現的特徵和權重。

scikit-learn提供了一個涵蓋此的tutorial

將tf * idf放在比訓練數據集更大的數據集上,以獲得訓練數據中的單詞的更精確的IDF估計值是有意義的,但我不確定人們多久這樣做。