Machine Learning System Design - Week_6_ part2

Building a Spam Classifier


Prioritizing What to Work On

擁有許多封電子郵件後,我們可以建立一個向量為每個電子郵件。在向量中每個項目代表一個單詞。這個向量包含10000到50000個項目,這些項目是藉由發現我們的信件中最常使用的單詞所組成,其實這些項目也就是我們所說的電子郵件的特徵。如果我們發現某個詞被發現在電子郵件中,我們就會指定該項目為1,如果沒有被發現該項目就被指定0。一旦我們所有x向量準備好後,我們就可以訓練我們的機器學習演算法,我們就可以藉由監督式學習的方式來分類該電子郵件是否為垃圾郵件。


所以我們想過很多方法來改散分類的準確度,方法有下列幾種,但很難去說最有效的方法是哪種:
  1. 蒐集許多資料(例如:honeypot計畫,但不是都會有效)
  2. 發展複雜的特徵(例如:使用電子郵件的標題資料)
  3. 發展演算法去處理你的相同輸入資料但不同表達方式(例如:辨識垃圾郵件中的拼錯字)
--------------------------------------------------------------------------------------------------------------------------

Error Analysis

建議解決機器學習演算法問題的方法如下:

  • 直接選擇執行一個簡單的機器學習演算法,然後快速的執行他,用交叉驗證資料及去測試
  • 畫學習曲線決定是否要使用更多資料、更多的特徵是否會有幫助
  • 手動檢查有誤差的交叉驗證集裡資料,試著去找到造成誤差的原因,再去調整演算法或特徵
舉例來說,假設我們有500封信件且我們的演算法誤分類100封。我們可以手動分析被誤分類100封郵件和分類他們是屬於什麼類型的郵件。我們可以嘗試幫助我們正確分類這100封電子郵件新的線索或特徵。因此如果我們誤分類的電子郵件是那些常是要偷取密碼的釣魚信件,我們就可以發現一些特徵並把他們加到模型中。我們也可以看見根據每個字根分類如何改變我們誤差率。


用一個數值去取得誤差的結果是非常重要的,否則我們是很難去得知機器學習演算法的表現如何。舉例來說,如果我們用字根分析演算法,字根分析演算法是處理一些相似的字彙但不同型(fail/failing/failed)的單字,會把這些類似的字彙視為同一個,有加入字根的誤差為5%而沒有加入則為3%,然後我們應該把它放到我們的模型中。然而,如果我們試著辨識大小寫的字母的差異,我們發現誤差從3.2%變成3%,那我們就避免去使用這樣的新特徵。因此,五們應該嘗試新的想法去取的誤差的數值,基於我們的結果去決定是否要使用新想法的特徵。

--------------------------------------------------------------------------------------------------------------------------

Handling Skewed Data

Error Metrics for Skewed Classes

skewed class 偏斜分類代表某類樣本數量和某類樣本數量差距很大,因此若遇到此類資料如果用分類誤差或分類精確度來評估模型可能會產生下列問題,以下舉例說明。

假設你有一個模型計算出來有99.2%準確度和0.8%的誤差,現在另一個模型則有99.5%準確度和0.5%的誤差,但這樣第二個算法算不算改善模型呢?還是說我們只是把所有模型中的分類全部指定為某一種分類,這樣的狀況是沒有辦法透過分類精確度或分類誤差告訴我們模型是有所改善的。

所以當我們遇到偏斜分類的問題時我們會希望有另一個度量衡的標準來確認模型的能力是否改善,我們會運用兩個方法來precision(查準率)和recall(召回率)來確認模型是否有變得更好。

我們會根據樣本實際的分類和模型預測的分類來進行計算precision和recall。

基本上precision就代表說,預測分類中被預測中的機率有多高,recall則是代表實際分類中被預測中的機率有多高。若為機器學習的演算法變成單一指定某一分類,則他不會有高的查準率和高的召回率,換句話來說,若遇到偏斜分類,同時擁有較高的查準率和較高的召回率則代表他是個更好的模型。在查準率和召回率的定義中,我們把想偵測的類別定義成y=1是非常少的分類時,算法就不能總是透過y=1或y=0這種方法來透過分類誤差或分類精確度來欺騙我們。
--------------------------------------------------------------------------------------------------------------------------
Trading Off Precision and Recall

我們遇到偏斜類問題的時候會運用查準率(precision)和召回率(recall)來做為評估,但在此章節會討論更有效運用查準率和召回率的方式。

我們希望正確的幾測患有癌症的病人,所以想探討在非常確信的情況底下,一個病人得癌症的機率有多大。因此我們需要修改演算法並提高threshold,這方式是在非常確信一個人得癌症的狀況底下才預測病人得到癌症。這狀況底下會有很高的準確率,會有比較低的召回率。

我們希望避免遺漏掉患有癌症的病人,所以我們把threshold值降低,以更加保守的方式來告訴病人他患有癌症。這情況底下會有較高的召回率但會得到較低的準確率。


所以我們希望做出怎樣的模型,完全取決得我們想要問的問題。接著問題來了,怎樣才算是最好的模型呢?!假設我們有三個不同演算法計算出來的模型,他們有著不同的準確率和召回率,所以我們運用F1 score去決定該使用模型。


F1  =  2 * PR * ( 1 / ( P + R ) )

--------------------------------------------------------------------------------------------------------------------------

Using Large Data Sets

Data For Machine Learning

  • 假設特徵X有足夠的資訊可以準確地預測Y,有大量數據是有幫助的。該怎麼知道否特徵有足夠的資訊,先假設這方面的人類專家是否能由這些特徵中有自信去準確預測出Y,若Y可以被這方面任類專家所預測出來,這證明Y可以由特徵值中被預測出來。
  • 假設可以得到很龐大的訓練集,代表我們可以降低過度擬合的問題(只要樣本比特徵值還要多的話,不太可能過度擬合),且訓練出具有很多參數的機器學習算法(ex/ logistic regression/linear regression會有很多特徵值、neural network有很多隱藏層),代表我們可以得到Jtrain(𝚯)和Jtest(𝚯)非常接近的狀況,間接代表說我們的Jtest(𝚯)也會很小,因此我們就可以說在大量數據時,演算法會有很好的表現。

留言

這個網誌中的熱門文章

在jupyter notebook中同時使用pyhton2和python3

Recommender Systems - Week_9_part2