# 5.7 Discrete Features ## binary features 在一些應用裡,我們的 attributes(即 features)為 discrete,為 $n$ 種不同的值中的其中一種。 舉例來說,某種 attribute 可能會是: - $\text{color} \in \{\text{red, blue, green, black}\}$ - $\text{pixel} \in \{\text{on, off}\}$ 我們來假設一個 attribute $x_j$ 是 binary(Bernoulli)的情形: > 關於 binary(Bernoulli)distribution 的簡單介紹,可參考筆記「[A.3.1 Bernoulli Distribution](https://hackmd.io/@pipibear/rkGGbs9VA)」。 並且,我們令 $x_j=1$ 的 probability density conditioned on $C_i$ 以 $p_{ij}$ 表示,如下: ![image](https://hackmd.io/_uploads/BkQu5lz9A.png) 如果我們再進一步假設 $x_j$:independent,我們會發現根據定義,其實這樣等同在說我們的 model 是 naive Bayes model: > 關於 naive Bayes model,可參考筆記「[5.5 Multivariate Classification](https://hackmd.io/@pipibear/ByBQVbqKR)」中,「estimate discriminant function 裡的 parameters」$\Rightarrow$ 「shared, axis-aligned: Naive Bayes Model」小節的內容。 ![image](https://hackmd.io/_uploads/rk4xjefq0.png) 並且,把 conditional density $p(\vec{x}|C_i)$ 的式子代入 discriminant function,就會得到下圖的結果: ![image](https://hackmd.io/_uploads/SJeQnez90.png) 我們發現為了要去利用 $g_i(\vec{x})$ 來判斷 $\vec{x}$ 是否屬於 class $i$,我們需要去估計這個式子裡 $p_{ij}$ 的值。 因此,又回到前面 estimate paramters 的方式,我們的 estimator for $p_{ij}$ 以 ==$\hat{p}_{ij}$== 表示,計算方式如下: ![image](https://hackmd.io/_uploads/B16Unez5C.png) ## document categorization 上述這樣的做法到底可以運用在哪裡呢? 什麼樣的情境下我們的 input features 之間彼此獨立,且每個 feature 的值只會是零或一? 其中一種答案是 <font color = "snake">document categorization</font>,也就是我們想要把新聞報導分到好幾種分類裡,比如說政治、體育、流行⋯⋯。 ### Bag of Words (BoW) 在自然語言處理裡面,有一種 model 叫做 <font color = "snake">bag of words (BoW)</font>,這種方法可以用很簡單的方式將一段文字轉換成用向量表示。做法是: 首先我們挑出一個包含 $d$ 個 words 的集合,我們相信這 $d$ 個 words 能夠提供我們關於 class 的資訊。 舉例來說,在分類新聞的時候像是「導彈」、「運動員」、「時裝」⋯⋯,這樣的字就很適合,但一些模糊的字像是 "runway"(我們沒辦法分辨是在說時裝秀在走的那條路,還是飛機的跑道)就不適合。 這樣一來,我們就能夠把我們的每一份文件轉換成一個 $d$-dimensional 的 binary vector,其中如果一開始選好的第 $j$ 個 word 有出現在這份文件裡,那這個 binary vector 中的 attribute $x_j=1$。 > 其實課本這種方法只是 BoW 的一種形式 > > $\rightarrow$ 也有做法是將整個 dataset 裡有出現過的 unique words ,每個作為向量中的一個 dimension。不過這種做法會產生的問題是:當每個 text document 被轉換成向量時,大部分的 text 都變成了 sparse vector(很多 dimensions 為零),這樣就會導致 ++overfit++。 > > $\rightarrow$ 課本在這裡用的是 binary 版的 BoW,但更常見的做法是將 $x_j$ 代表 $j$th word 出現在一份文件裡的++次數++(而非只分有出現/沒出現,雖然這種作法在某些情境下也有它的用途。) 按照課本的定義,看個例子就很清楚了: ![image](https://hackmd.io/_uploads/ry-LxWz9C.png) > 不過從這個例子也看不出來是否為 binary 的,畢竟每個 word 在每一行 text 中確實只出現一次,不過 binary BoW 本來就比較少用,圖比較難找,就免強用這個 XD 如果不是 binary 的版本,而是讓 $x_j$ 代表在一份文件裡的出現次數,就會變成像下圖這樣: ![image](https://hackmd.io/_uploads/rkxe4x7qA.png) - Note:不管是上面哪一種方式,BoW 都會++失去 ordering++ 的資訊,因為在轉為透過向量表示以後,每個 dimension 只會表示對應的 word 是否存在我們的文章中(或出現幾次),並不會記錄出現的順序和位置,這也是為什麼我們稱作 "bag" of words。 如同我們前面講到的,為了去形成我們的 model,對未知的 parameter $p_{ij}$,我們有一個 $p_{ij}$ 的 estimator $\hat{p}_{ij}$;放到現在的例子裡,我們想要藉由 training 來得到的 $\hat{p}_{ij}$,代表的意義就是去++估計 word $j$ 出現在 document $i$ 中的機率++。 $\rightarrow$ 如果有一個 word,它出現在不同的 classes 中的機率都差不多,這樣的話這個 word 就沒辦法帶給我們什麼有用的訊息;我們想找的 word 是它出現在某個(或某些) class 中的機率遠高於出現在其他 classes 中的機率。為了挑選出這樣的 words,我們就會去做 <font color = "snake">feature selection</font>,這部分會在之後的第六章說明。 > 前面我們說另一種 BoW 的方式會將整個 dataset 中的 unique words 都視為一個 dimension,使得每個 text 都是 sparse vector,這種情況下我們也可以利用 feature selection 來降低過多的維度。 >[!Note] 關於 BoW 有一點點補充,我會放在這篇筆記的最後面。 ### spam filtering 另外一個 document categorization 的應用叫作 <font color = "snake">spam filtering</font>,也就是字面上的意思,我們將 email 歸類到兩個 classes,分別是 spam 和 legitimate。 課本就講到這 XD 但大概的流程如下圖: ![image](https://hackmd.io/_uploads/rJcHpxm9C.png) 從左邊開始看: 1. 首先我們對 email 先做 preprocessing,通常是去掉空格、標點符號、"and, the..." 等等無用的資訊,然後把整份文字拆成一個個 word。 2. 接著在 feature extraction 的步驟,我們會用像是剛剛說到的 BoW,把 text 轉換成每一個 word 出現與否或出現次數的 vector;或者其他方式像是 Word2vec,可以將 words map 到一個 continuous vector space,使得意思相近的 words 有比較近的距離。除了這兩種以外還有許多方法,但總體來說,這個階段就是將 email 轉換成向量(變成 vector expression)。因為以數值表示以後,我們才能進一步去做 training / testing。 3. 被拿來做 training set 的部分 email,會先被 label 是否為 spam,然後拿來訓練並形成我們的 model。隨著 data 的數量越多,model 就能越被 improve,藉由找出 feature 的 patterns 來區分是否為 spam,使得最後 classifier 能夠透過這個 model 來讓我們能夠在未來去預測新的、沒看過的 email。 ## general case: multinomial features 前面我們假設每個 feature $x_j$ 為 binary 的,但是拓展到 general case,我們令 $x_j$ 為 multinomial,也就是說: \begin{equation} x_j \in \{v_1,v_2,...,v_{n_j}\} \end{equation} > 為什麼我們說 binary 的 general case 會是 multinomial? > > Recall: > - binary distribution 代表的意義是當我們的 outcome 只有兩種時,執行一次 experiment,outcome 分佈的情形。 > - binomial distribution 代表的意義是如果一樣,我們的 outcome 只有兩種,但是 experiment 執行 $N$ 次,產生的 $N$ 個 outcomes 的分佈情形。 > - multinomial distribution 代表的意義是再去拓展我們的可能性,變成 outcome 可以有 $K$ 種的情況下,experiment 執行 $N$ 次,outcomes 分佈的情形。 > > $\rightarrow$ 因此如果我們令可能的 outcome 數為 $K$,experiment 執行的次數為 $N$,那麼 binary 就是當 $K=2, N=1$、binomial 是當 $K=2, N>1$、multinomial 是當 $K>2, N>1$。 因為現在 $x_j$ 的值有多種(共 $n_j$ 種)可能,所以我們另外令一個 dummy variable 來表示 $x_j$ 到底是這 $n_j$ 個裡的哪一個: ![image](https://hackmd.io/_uploads/Syc0EbX9A.png) 前面我們有 $p_{ij}$ 來表示屬於 class $i$ 的情況下,feature $j$ 為一的機率;而現在我們也想要再令一個 parameter 來表示屬於 class $i$ 的情況下,feature $j$ 為 $v_k$ 的機率: ![image](https://hackmd.io/_uploads/rkJuSWX5R.png) 訂完 $p_{ijk}$,我們就能用它來表示 $p(\vec{x}|C_i)$,來讓我們在下一步能夠去表示 discriminant function。我們一樣假設這些 attributes 為 independent: ![image](https://hackmd.io/_uploads/S1-HtWQ9A.png) 其實 discriminant function 也和上面的作法一樣,把剛剛求完的 $p(\vec{x}|C_i)$ 代入,然後因為我們取了 $\log$ 來簡化計算,所以指數可以搬下來,乘法全部轉換成加法,只是符號太多看起來比較雜亂而已: ![image](https://hackmd.io/_uploads/ryRo2ZQq0.png) 最後一樣,我們要來求 $p_{ijk}$ 的 MLE(maximum likelihood estimator)==$\hat{p}_{ijk}$==: ![image](https://hackmd.io/_uploads/SyRCezm9A.png) 有了 $\hat{p}_{ijk}$ 以後,我們就能代入 discriminant function $g_i(\vec{x})$ 來預測新的 input 了! ## 補充:BoW >[!Note] 這部分的內容完全出自一篇文章,連結則放在最後的參考資料! BoW 是一種用來 model text data 的 feature extraction 技術,更精準的來說,它是一種對一個 text document 裡面所有已知的 words 的 unstructured 分類,而這個分類不考慮單字出現的順序或脈絡,單純只由它們出現的頻率定義。 在 BoW approach 裡,每個 individual word 變成向量空間裡的一個獨立的 dimension(或是 axis),因此如果我們的 text 有 $n$ 個 words,那會 map 到的向量空間就是 $n$ 維的,每一個維度都是 text set 中的一個 unique word。 接著,我們的 model 將每個 text document 標為這個 $n$ 維向量空間中的一個點。這個點沿著某個軸的位置,代表這份 text document 中,這個軸對應的 word 出現幾次。 舉例來說,假設我們的 text set 裡面有兩個 documents: ![image](https://hackmd.io/_uploads/Sk2DW7XqA.png) 因為三維以上的空間比較難用圖像來想像,所以我們就取一個 set 為: \begin{equation} \{\text{red, rose, violet}\} \end{equation} 這三個 words 分別為我們的三維向量空間中的一個軸: ![image](https://hackmd.io/_uploads/ByfeMQXqC.png) 在 document $1$ 中,red, rose, violet 分別出現一次,所以它的座標為這個三維空間中的點 $\{\text{red, rose, violet}\} = \{1,1,1\}$。 在 document $2$ 中,red 出現兩次、rose 出現一次、violet 沒出現,所以它的座標為 $\{\text{red, rose, violet}\} = \{2,1,0\}$。 ![image](https://hackmd.io/_uploads/r1j2zmXqA.png) ### limitations of BoW 關於 BoW 的 limitations,除了上面我們有稍微提到的當轉換出來的 vector 是 sparse 時,會造成 overfitting 的問題,另一個和我們之前學過的概念相關的是 BoW 並沒有將 ++words 之間的 correlation++ 考慮進去。 我們可以回想前面不管是 binary 或是更 general 的 multinomial 的情況,我們在推導 $p(\vec{x}|C_i)$ 時,之所以可以直接把 $p_{ij} / p_{ijk}$ 之間直接相乘,都是因為我們假設 features $x_j$:independent。在 BoW 的情境裡,每個 feature 是一個 word,所以假設 features independent,就等同於在說一個 text document 裡,一個字的出現並不會影響另個字出現的機率。 但是我們知道,BoW 這種假設一個 document 裡面 word 和 word 之間彼此互相獨立的 model,其實和我們的現實狀況不相符。比如說,假設我們在一篇新聞報導裡面看到「選舉」,我們會預期在同一篇新聞裡,出現「總統」的機率應該要比出現「詩人」來得高。 既然 BoW 並不會去考慮文字使用上 word 和 word 之間的 correlations,只是將每個 word 只被視為一個獨立的 feature,而這個 word 出現的次數作為它的 weight,那麼這就會導致的是我們之前有稍微提過的 ++multicollinearity++ 的問題。 什麼意思呢? 舉例來說,假設一樣是要去為新聞報導分類的情境,我們知道「選舉」、「總統」、「選民」這些 words 有著很高的 correlation,有其中一個字出現的情況下,另外兩個字出現的機率也會很高。 在這樣的情況下,如果我們還是讓我們的 features 同時包含這三個 words,也就是它們在我們的向量空間裡佔了三個 dimension,可以想像當和政治有關的報導被轉換成向量時,它在這個向量空間中的座標就會同時傾向這三個維度的方向。 這會導致的問題是一來我們的 model 在做出 prediction 時,如果一則報導被歸類到政治,我們很難去說到底是因為「選舉」這個字的出現,還是因為有「總統」出現在文章裡;二來是既然這些 features 帶來的是類似的資訊,產生出來的 model 就會變的不必要的複雜。 最後就是像我們前面幾節在講 regression 時所提到的,multicollinearity 會使我們的 model ++unstable++,只要 data 有一點改變,就會造成 model 的係數大幅變動,進而使得我們的 estimates unreliable。 --- 除了上述這些 limitations,下面參考資料的文章也有提到一些其他的問題,也有針對這些 limitations 可以去做的 modification 介紹,還有很多其他的相關內容,文章寫得很簡單,推薦去看看!就能對 BoW 有基本的認識! 因為課本也沒多講,那麼我就結束在這裡。 # 參考資料 - [IBM: What is bag of words?](https://www.ibm.com/topics/bag-of-words)