公開課地址:https://class.coursera.org/ml-003/class/index
授課老師:Andrew Ng
1、prioritizing what to work on:spam classification example(垃圾郵件分類系統)
前面學到的都是一些理論知識外加實踐過程中的診斷方法,這一講是針對一個實際問題進行分析-垃圾郵件分類系統。相信大部分用過email的人都知道什麼是垃圾郵件,對垃圾郵件也深惡痛覺,如果不知道什麼是垃圾郵件的請看下面:
左邊很明顯是一個垃圾郵件,先看發送郵箱詭異的名字,再看發送內容中各種拼字錯誤的單詞,估計就知道這肯定不是人寫的而是電腦產生的了。相比之下右邊的郵件就是非垃圾郵件。為了區別出垃圾郵件,首先要做的應該是尋找一些可以標記什麼是垃圾郵件的特徵,找到這些特徵以後,再進行有監督的分類就能把垃圾郵件找出來了。
至於特徵,我們可以從單詞入手:
如上所示,可以選擇出現頻率最高的100個單詞作為候選集,得到一個100維的向量,然後從垃圾郵件中查看是否出現這些單詞,如果出現就把對應位置標記為1,這樣每一封垃圾郵件都能對應一個100維的向量。不過如果要更精確一些,100個單詞顯然是不夠的。為了提高準確率,可以採用下面幾種方法:
翻譯過來是:
收集大量資料,顯然的
從郵件路由資訊著手建立較為複雜的特徵,諸如發件者郵箱
對郵件內文建立複雜精確的特徵庫,例如是否應把discount和discounts視作同一個詞等
建立演算法檢查拼字錯誤,例如針對med1cine這樣拼字錯誤的詞
2、error analysis(錯誤分析)
既然知道了該怎麼做,那接下來就是行動了。這裡Andrew Ng教授給出了他自己的見解:
翻譯過來如下:
儘可能快的實現一個簡單的演算法,無論是羅吉斯迴歸還是線性迴歸也好,先利用簡單的特徵,然後在驗證資料集上進行測試;
利用畫學習曲線的方法去研究是增加資料還是增加特徵對系統更有利
錯誤分析:人工去查看是哪些資料造成了錯誤的產生,錯誤的產生和樣本之間是否存在一種趨勢?
在進行簡單的演算法實現和驗證後,我們對模型做錯誤分析可以把垃圾郵件再分為四類(Pharma,Replica/fake,Steal passwords,Other):
現在可以考慮針對一些詞的不同形式是不是該看成一樣的,這裡不應該主觀的去想當然,而是通過比較錯誤率來確定,例如下面就是針對discount這個詞的各種變形判斷是不是應該看成是一個詞:
3、error metrics for skewed classes(傾斜類誤差度量)
什麼是Skewed Classes呢?一個分類問題,如果結果僅有兩類y=0和y=1,而且其中一類樣本非常多,另一類非常少,我們稱這種分類問題中的類為Skewed Classes. 可以舉個例子,如果要判斷病人是否患癌症,假設採用羅吉斯迴歸的方法,誤差率是1%(也就是預測1%的患者得癌症),但實際情況只有0.5%的患者得癌症,相比之下,預測沒有人得癌症的誤差率只不過才0.5%而已。
可以說,單純從分類誤差率來看,比我們之前的羅吉斯迴歸要強,可事實上我們清楚這種方法只是耍技巧罷了,不能用作實際使用。因此,我們引入誤差度量矩陣這個概念:
考慮一個二分問題,即將執行個體分成正類(positive)或負類(negative)。對一個二分問題來說,會出現四種情況。如果一個執行個體是正類並且也被預測成正類,即為真正類(True positive),如果執行個體是負類被預測成正類,稱之為假正類(False positive)。相應地,如果執行個體是負類被預測成負類,稱之為真負類(True negative),正類被預測成負類則為假負類(false negative),總結如下:
TP:正確肯定的數目;
FN:漏報,沒有正確找到的匹配的數目;
FP:誤判,給出的匹配是不正確的;
TN:正確拒絕的非匹配對數;
於是就能得到左側的那個矩陣,並且可以定義準確率(precision)和召回率(recall).
precision:正確預測正樣本/所有預測為正樣本的;
recall:正確預測正樣本/真實值為正樣本的;
關於這兩個值的更多介紹可以看這裡:http://en.wikipedia.org/wiki/Precision_and_recall
4、trading off precision and recall(權衡準確率與召回率)
有了前面準確率和召回率的定義後,下面在進行判斷的時候就可以以這兩個值作為標準。還是考慮前面的癌症診斷問題,這裡存在一個閾值的選擇問題,當機率大於多少時我們才能判斷為癌症呢?如果閾值設定的很大,比如99%,準確率很高,但是召回率很低,相反則是準確率很低,召回率很高。我們的目的是讓這兩者都儘可能的大,於是出現了權衡。
也可以這樣分析:如果我們希望在很確信的情況下才告訴病人有癌症,也就是說不要給病人太多驚嚇,我告訴你有癌症,你肯定有癌症;我告訴你沒癌症,你也有可能有癌症,那麼該情況下有:高閾值,高精度,低召回率。如果我們不希望讓病人錯過提前治療,與上例相反,就有:低閾值,低精度,高召回率。
既然要在兩個值中權衡,那到底是怎麼個權衡方法呢?讓兩者的均值最大?
在上面三個演算法中,如果用均值來計算,則演算法3勝出,其實演算法3針對所有情況都預測為真,顯然是不對的,為此引入F1-Score值,可以發現當P和R值都盡量大的時候才會保證F1score儘可能大,一個大一個小的情況並不能保證F1score最大。可以說,在選擇演算法時,只需要找到一個讓F1score值最大的演算法即可。
5、data for machine learning(機器學習資料)
在機器學習中,對於預測問題,可以選用很多方法,一般來說,當資料量越大時準確率會越高:
當然事實並不總是這樣,前面已經提到過在一些情況下增加訓練樣本對預測準確性沒有任何提高。這裡暫時不考慮這一情況,我們需要考慮的是是否有足夠的資料能讓模型做預測,如果連足夠的資料都沒有,甚至連人類專家都無法做出預測,那我們憑什麼指望機器能給出準確預測呢?
可以總結:想要保證偏差小,就要保證有足夠多的特徵;想要保證方差小,就要保證不產生過擬合,那麼就需要很多訓練集。這裡需要J(train)和J(CV)都很小,才能使J(test)相對小。
-------------------------------------------------弱弱的分割線----------------------------------------------------
這一講介紹了如何針對一個具體的垃圾郵件分類系統進行設計,同時引入了誤差度量矩陣這個重要概念,在衡量一個演算法好壞時,我們不應該只看誤差,而應該要綜合考慮準確率和召回率兩個值的大小,這是一個權衡問題。不過為了方便,我們把這兩個值糅到一起得到了F1score這個值,以後評價演算法好壞只需要判斷F1score即可。