資料分析概念大全 - TF, IDF, TF-IDF, Text Classification 樣樣來
一句話解釋TF-IDF『用來從一段文字/一個語料庫中,給越重要的字詞/文檔,越高的加權分數』
TF-IDF
你看,TF - IDF ,前面的TF是Term Frequency的縮寫,後面的IDF是Inverse Document Frequency的縮寫,合在一起則說明了它如何計算出誰是相對比較重要的字詞。
TF-IDF
有點像是互相牽制的感覺,前面的TF是Term Frequency的縮寫,後面的IDF是Inverse Document Frequency的縮寫。- 綜合兩個公式值相乘,便得到我們今天介紹的TF-IDF值
字詞的重要性隨著 在文本出現的頻率越高則越高(TF);在不同文本檔案間出現的次數越高則反而降低(DF)。
更白話一點
:一個單字在一篇文章中出現的次數越多,那麼這個單字就越重要,但是如果這個單字在其他文章中也出現很多次,那麼這個單字就越不重要。
Term Frequency (tf)
上圖取自:【資料分析概念大全|認識文本分析】對文本重點字詞加權的TF-IDF方法
我們先把拆解出來的每個詞在各檔案出現的次數,一一列出,組成矩陣。
- 是詞t在文件d中出現的次數
『詞1』在『文件1』的TF值算出來時
『詞1在文件1出現的次數』除以『文件1中所有詞出現次數的總和(可說是總字數)』
= 這個單字數量
在文件1中所有的文字
,所佔的比例。
可不可以把 TF 當作 Weight 來看呢?
- 當然可以,那我們還是仍要取 log 來避免極端值影響太大。
Inverse Document Frequency (IDF)
上圖取自:【資料分析概念大全|認識文本分析】對文本重點字詞加權的TF-IDF方法
如果經過TF的計算,此時發現有兩個單詞a, b兩個都在文件1中出現了相同的次數,我們該如何知道哪個單詞更重要呢?
- 其實,這時候就要用到IDF的概念了。
- 我們還要考慮到 a, b 兩個單詞在其他文件中出現的次數。
- 假設,檔案1 有兩個單字 “and” 跟 “company A” 兩個單字非常頻繁的在檔案1中出現,tf 值都相同。
- 但是 “and” 不僅僅在 檔案 1 出現,基本上其他檔案都出現他的身影,所以 “and” 就不是一個重要的單字
- 而 “company A” 只在檔案1中出現,所以 “company A” 儘管與 “and” 數量相同,但是 “company A” 更為獨特,因為只出現在檔案1中。
如下圖:可以發現 calpurnia 這個單字指出現在某個特定檔案,所以代表他很特別,所以他的 IDF 值會很高。
IDF 有點像是代表性的感覺
由『文章數總和(D)』除以『該字詞出現過的文章篇數(dt)』後,取log值
= 這個單字在這個檔案中的獨特性,因為其他檔案很少出現
Note: 實際應用中為了避免分母=0,因此通常分母會是dt+1。
IDF之所以取log的原因?
取log是為了不讓極端值影響太大,如果今天文章總和數D很大,而某個詞指出現在一篇文章中,那麼這個詞的IDF值就會很大,這樣的情況下,取log可以讓這個值變得更小,避免極端值影響太大。
Text Classification (TC)
文本分類的目標是通過學習算法,基於訓練數據中的特徵
和標籤
,構建一個能夠自動將新文檔正確分類
的模型。
有些分類具階層性,有些可能屬多個分類 這在信息檢索、情感分析、垃圾郵件過濾等眾多應用中具有廣泛的應用價值。分類的方式主要可以分為:
- 人工分類 Manual Classification:靠專家分類會很準,但是當資料量大的時候人工判斷會有主觀不同的問題。
- 規則式分類 Rule-Based Systems:使用布林條件,例如 (文化創意 | 文創) → 歸於文化類
- 統計機率式 Statistical/Probabilistic Methods:使用機率模型,例如 Naive Bayes、SVM、KNN、Decision Tree、Random Forest、XGBoost、LightGBM、CatBoost 等等。
接下來我們會針對幾個常見的統計機率式方法來進行介紹。
Naive Bayes
我覺得直接看例子比較快,以下是一個簡單的例子:
- 假設我們想要把垃圾郵件和非垃圾郵件分類
- 我們先收集垃圾郵件 跟 非垃圾 郵件的所有拆好的單字
- 然後我們要計算 每個單字 分別在 垃圾郵件 跟 非垃圾郵件 出現的機率
從下圖可以看到,先計算每個單字在非垃圾郵件的機率 P(Dear | N)
Dear 是出現的文字,N 是非垃圾郵件中,所有單字的總數。
- Dear 在非垃圾郵件中所有的單字裡面,出現了 8 次,表示
P(Dear | N) = 8/20 = 0.4
然後我們就可以獲得,每個單字,分別在垃圾郵件和非垃圾郵件中的機率。
那現在我們收到一個新的郵件,我們要判斷這個郵件是垃圾郵件還是非垃圾郵件。
- 新郵件的內容是
Dear Friend
- 我們先計算這個郵件是非垃圾郵件的機率
P(Normal | Dear Friend)
跟P(Spam | Dear Friend)
這邊我們就可以使用貝氏定理來計算P(Normal | Dear Friend)
,我們看到Dear Friend
的信件他是非垃圾
郵件的機率是多少?
P(N) = 8 / 12 = 0.67
P(Normal | Dear Friend) = P(Dear | N) * P(Friend | N) * P(N) = 0.47 * 0.29 * 0.67 = 0.09
用同樣的方式,這邊我們也可以使用貝氏定理來計算P(Spam | Dear Friend)
,我們看到Dear Friend 的信件他是垃圾郵件
的機率是多少?
P(S) = 4 / 12 = 0.33
P(Spam | Dear Friend) = P(Dear | S) * P(Friend | S) * P(S) = 0.29 * 0.14 * 0.33 = 0.013
最後我們可以比較 P(Normal | Dear Friend)
跟 P(Spam | Dear Friend)
,看哪個機率比較高,就可以判斷這封信是垃圾郵件還是非垃圾郵件。這裡的例子中,P(Normal | Dear Friend)
比 P(Spam | Dear Friend)
高,所以這封信是非垃圾郵件。
注意事項
但是如果我們今天看到另一個例子Lunch Money Money Money Money
這封信是垃圾郵件還是非垃圾郵件?
用一樣的方式計算的話會發現,因為 P(Lunch|S)
是 0 所以會導致 P(Spam | Lunch Money Money Money Money)
也是 0
為了解決這個問題,我們至少要把每個單字的機率設定一個最小值,這樣就不會出現 0 的情況。
然後重新計算每個單詞在不同類別時的機率。
優缺點
使用 Naive Based 有什麼樣的問題?為什麼稱它為 Naive?
- 單字的組成順序不影響結果,從下面例子可以看到 Dear Friend 跟 Friend Dear 他們的機率是一樣的。
- 這導致在處理一些需要文法規則的語言時,效果不佳。
- 因為 Naive Bayes 對待每個單字就像是獨立的一樣,就是一個 a bag full of words 的概念。
- 稱它為 Naive 是因為他太過於簡單,對於一些複雜的問題,效果不佳。
但是Naive Bayes 也並非如此 Naive
- Naive Bayes 在某些競賽中獲勝(例如,KDD-CUP 97)
- 對非相關特徵的魯棒性強於一些更複雜的學習方法:Naive Bayes 能夠有效處理包含大量非相關特徵的數據集,這在某些情況下比更複雜的算法更具優勢。
- 對概念漂移(隨時間變化的類別定義)更具魯棒性:Naive Bayes 對於隨時間變化的數據(如類別定義變化)的適應能力較強,這使得它在動態環境中也能保持良好的性能。
- Naive Bayes 對於具有多個同等重要特徵的數據集,比如決策樹這類方法更具優勢。
- 對於文本分類來說,是一個可靠的基線(但不是最好的)
- Naive Bayes 假設特徵之間是獨立的,如果這個假設成立,則 Naive Bayes 算法是最優的。雖然這個假設在文本分類中通常不成立,但在其他一些領域中是成立的
- Naive Bayes 算法學習過程非常高效,只需要一次遍歷數據即可完成。測試過程中的計算量與屬性數量和文檔集合大小呈線性關係,這使得它在大數據集上也能快速運行。
- Naive Bayes 算法需要的存儲空間很少,這在資源有限的環境中是一個很大的優勢。
Gaussian Naive Bayes
是 Naive Bayes 的一個變種,主要是用在連續型的資料上,例如身高、體重等等。
以下面的例子來說,我們有兩個全體的資料,一個是喜歡Troll,一個是不喜歡Troll。
- 我們把喜歡Trolls的人,他們也喜歡Popcorn, Soda, Candy 的分佈畫出來 (下圖綠色的部分)
- 再來把不喜歡Trolls的人,他們也喜歡Popcorn, Soda, Candy 的分佈畫出來 (下圖紅色的部分)
例子
接下來有一個人,他吃了 20g 的Popcorn, 500ml 的Soda, 25g 的Candy,我們要判斷他是喜歡Trolls還是不喜歡Trolls。我們先假設這個人是喜歡Trolls,我們可以計算他的機率
P(Like Troll2 | Popcorn, Soda, Candy) = P(Popcorn | Like Troll2) * P(Soda | Like Troll2) * P(Candy | Like Troll2) * P(Like Troll2)
。P(Like Troll2) = 8 / 16 = 0.5
(下圖1)- 然後把 Popcorn, Soda, Candy 的機率帶入,但是因為 Candy 的機率非常非常小,小到會變成 0,所以我們要使用 log 來避免Underflow。
我們先假設這個人是不喜歡Trolls,我們可以計算他的機率
P(Unlike Troll2 | Popcorn, Soda, Candy) = P(Popcorn | Unlike Troll2) * P(Soda | Unlike Troll2) * P(Candy | Unlike Troll2) * P(Unlike Troll2)
。P(Unlike Troll2) = 8 / 16 = 0.5
(下圖1)- 然後把 Popcorn, Soda, Candy 的機率帶入,但是因為 Candy 的機率非常非常小,小到會變成 0,所以我們要使用 log 來避免Underflow。
NB 與 Gaussian NB 差異
特性 | Naive Bayes | Gaussian Naive Bayes |
---|---|---|
一般性 | 通用的分類器,適用於不同類型的特徵 | Naive Bayes 的特例,專門用於連續型特徵 |
特徵類型 | 離散特徵或連續特徵 | 連續特徵 |
分佈假設 | 可以使用不同的概率分佈模型(如多項式、伯努利) | 假設特徵值服從高斯分佈 |
常見應用 | 文本分類、垃圾郵件過濾等 | 根據連續特徵(如身高和體重)進行分類 |
K Nearest Neighbors (KNN)
簡單來說就是,挑最近的 k 個鄰居出來統計 (投票),看最多人屬哪一類,自己標成那一類
特性 | 描述 |
---|---|
類型 | kNN 是一種向量空間分類方法。 |
簡單性 | 它非常簡單且易於實現。 |
準確性 | 在大多數情況下,kNN 比 Naive Bayes 和其他方法更準確。 |
迅速性 | 如果你需要在短時間內得到一個相當準確的分類器…… |
效率 | ……並且不太在乎效率的話可以使用kNN…… |
時間複雜度 | |
測試時間 | kNN 的測試時間與訓練集的大小成正比。訓練集越大,分類測試文檔所需的時間越長。 |
效率 | kNN 對於非常大的訓練集來說效率低下。 |
訓練需求 | 無需訓練。 |
預處理 | 但文檔的線性預處理與訓練 Naive Bayes 同樣昂貴。 |
訓練時間 | 我們總是對訓練集進行預處理,所以實際上 kNN 的訓練時間是線性的。 |
訓練集大小與準確性 | 如果訓練集很大,kNN 非常準確。如果訓練集很小,kNN 可能非常不準確。 |
概率轉換 | kNN 的分數很難轉換為概率。 |
更穩健的替代方法 | 更穩健的替代方法是找到 k 個最相似的示例,並返回這些 k 個示例中的多數類別。k 的值通常取奇數以避免平局;3 和 5 是最常見的。 |
Support Vector Machine (SVM)
- Ref: 支援向量機(Support Vector Machine)
SVM的目標是找到一個最佳的超平面(在二維空間中就是一條直線),將不同類別的數據分開。這條超平面應該使得兩個不同類別的數據點距離超平面的間隔最大化,這些距離稱為邊界(margin),如下圖。