---
# System prepended metadata

title: 5.7 Discrete Features
tags: [ML]

---

# 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)