本文以設(shè)計(jì)一個(gè)垃圾郵件過濾系統(tǒng)為例浪感,談?wù)勅绾卧O(shè)計(jì)一個(gè)機(jī)器學(xué)習(xí)系統(tǒng)更卒。同時(shí)介紹查準(zhǔn)率,召回率以及 F1Score 來評(píng)價(jià)算法的性能洛口。
構(gòu)建垃圾郵件過濾系統(tǒng)
特征選擇
在實(shí)踐中矫付,可以遍歷所有的訓(xùn)練數(shù)據(jù)集,即所有的垃圾郵件和所有的非垃圾郵件第焰,找出出現(xiàn)頻率最高的 10,000 - 50,000 個(gè)單詞作為特征买优,假設(shè)特征數(shù)量記為 n。這樣一封郵件就可以用一個(gè) n 維向量來表示挺举,即 n 個(gè)特征單詞是否出現(xiàn)在郵件里杀赢,如果出現(xiàn)記為 1 不出現(xiàn)記為 0 。
構(gòu)建步驟
- 收集盡量多的數(shù)據(jù)湘纵,如 honeypot 項(xiàng)目
- 從郵件路由信息中提取出有效的特征來區(qū)分垃圾郵件脂崔,路由信息放在郵件頭部
- 從郵件的內(nèi)容中提取復(fù)雜特征
- 開發(fā)一套算法來檢查拼寫錯(cuò)誤。因?yàn)楹芏嗨惴◤泥]件內(nèi)容中通過關(guān)鍵字為特征來區(qū)分垃圾郵件梧喷,垃圾郵件系統(tǒng)為了跳過這個(gè)檢查砌左,故意把一些敏感詞拼錯(cuò),這樣規(guī)避垃圾郵件檢查機(jī)制
至于哪個(gè)方法是最有效的铺敌,需要頭腦風(fēng)暴或者事先詳細(xì)研究才能得出結(jié)論汇歹。當(dāng)然,在算法通過檢驗(yàn)之前偿凭,很難事先判斷哪個(gè)特征是最有效的产弹。
錯(cuò)誤分析
用機(jī)器學(xué)習(xí)算法解決問題時(shí),可以償試如下的策略
- 從簡(jiǎn)單的算法開始弯囊,先實(shí)現(xiàn)出來痰哨,然后使用交叉驗(yàn)證數(shù)據(jù)來驗(yàn)證結(jié)果。
- 畫出學(xué)習(xí)曲線常挚,診斷算法的問題和優(yōu)化方向作谭,是需要去獲取更多訓(xùn)練數(shù)據(jù)還是要增加特征等稽物。
- 錯(cuò)誤分析:針對(duì)交叉驗(yàn)證數(shù)據(jù)的錯(cuò)誤項(xiàng)進(jìn)行手動(dòng)分析奄毡,試圖從這些錯(cuò)誤結(jié)果里找出更多線索和特征。
錯(cuò)誤分析實(shí)例
假設(shè)我們實(shí)現(xiàn)的垃圾郵件過濾算法贝或,針對(duì) 500 封交叉驗(yàn)證數(shù)據(jù)里有 100 封被錯(cuò)誤分類了吼过,那么我們可以進(jìn)行
- 手動(dòng)檢查這些被錯(cuò)誤分類的郵件類型,比如釣魚郵件咪奖,賣藥的郵件等等盗忱,通過手動(dòng)分析總結(jié)出哪種類型的郵件被錯(cuò)誤地分類數(shù)量最多,然后先把精力花在這種類型的郵件上面羊赵。
- 有哪些線索或特征有助于算法正確鑒別這些郵件趟佃。比如通過分析扇谣,我們發(fā)現(xiàn)異常路由的郵件數(shù)量有多少,錯(cuò)誤拼寫的郵件有多少闲昭,異常標(biāo)點(diǎn)符號(hào)的郵件有多少罐寨。通過總結(jié)這些特征,決定我們應(yīng)該要把時(shí)間花在哪方面來改善算法性能序矩。
比如鸯绿,我們?cè)趯?shí)現(xiàn)垃圾郵件鑒別算法時(shí),我們需要決定 Dicount/Discounts/Discounted/Discouting 等單詞視為同一個(gè)單詞還是不同的單詞簸淀。如果要視為相同的單詞瓶蝴,可以使用詞干提取法 (Porter Stemmer) ,但使用詞干提取法一樣會(huì)帶來問題租幕,比如會(huì)錯(cuò)誤地把 universe/university 歸類為同一個(gè)單詞舷手。這個(gè)時(shí)候如何決策呢?
一個(gè)可行的辦法是分別計(jì)算使用了詞干提取法和不使用時(shí)候的交叉驗(yàn)證數(shù)據(jù)集成本 $J_{cv}(\theta)$ 和測(cè)試數(shù)據(jù)集成本 $J_{test}(\theta)$ 劲绪,這樣來判斷到底是使用更好還是不使用性能更好聚霜。
實(shí)際上,優(yōu)化算法過程中的很多償試都可以使用這個(gè)方法來判斷是否是有效的優(yōu)化策略珠叔。
處理有傾向性的數(shù)據(jù)
比如針對(duì)癌癥篩查算法蝎宇,根據(jù)統(tǒng)計(jì),普通腫瘤中癌癥的概率是 0.5% 祷安。我們有個(gè)機(jī)器學(xué)習(xí)算法姥芥,在交叉驗(yàn)證數(shù)據(jù)時(shí)得出的準(zhǔn)確率是 99.2%,錯(cuò)誤率是 0.8% 汇鞭。這個(gè)算法到底是好還是壞呢凉唐?如果努力改進(jìn)算法,最終在交叉驗(yàn)證數(shù)據(jù)集上得出的準(zhǔn)確率是 99.5%霍骄,錯(cuò)誤率是 0.5% 到底算法性能是提高了還是降低了呢台囱?
坦白講,如果單純從交叉驗(yàn)證數(shù)據(jù)集上測(cè)試準(zhǔn)確率的方法很難進(jìn)行判斷到底算法是變好了還是變壞了读整。因?yàn)檫@個(gè)事情的先驗(yàn)概率太低了簿训,假如我們寫了一個(gè)超級(jí)簡(jiǎn)單的預(yù)測(cè)函數(shù),總是返回 0米间,即總是認(rèn)為不會(huì)得癌癥强品,那么我們這個(gè)超級(jí)簡(jiǎn)單的預(yù)測(cè)函數(shù)在交叉驗(yàn)證數(shù)據(jù)集上得到的準(zhǔn)確率是 99.5%,錯(cuò)誤率是 0.5% 屈糊。因?yàn)榭傮w而言的榛,只有那 0.5% 真正得癌癥的可憐蟲被我們誤判了。
那么我們?cè)趺礃觼砗饬糠诸悊栴}的準(zhǔn)確性能呢逻锐?我們引入了另外兩個(gè)概念夫晌,查準(zhǔn)率 (Precision) 和 召回率 (Recall)雕薪。還是以癌癥篩查為例:
預(yù)測(cè)數(shù)據(jù)/實(shí)際數(shù)據(jù) | 實(shí)際惡性腫瘤 | 實(shí)際良性腫瘤 |
---|---|---|
預(yù)測(cè)惡性腫瘤 | TruePositive | FalsePositive |
預(yù)測(cè)良性腫瘤 | FalseNegative | TrueNegative |
在處理先驗(yàn)概率低的問題時(shí),我們總是把概率較低的事件定義為 1 晓淀,并且總是把 $y=1$ 作為 Positive 的預(yù)測(cè)結(jié)果蹦哼。有了這個(gè)公式,如果一個(gè)簡(jiǎn)單地返回 0 的預(yù)測(cè)函數(shù)要糊,那么它的查準(zhǔn)率和召回率都為 0纲熏。這顯然不是個(gè)好的預(yù)測(cè)模型。
TIPS
如何理解 True/False
和 Positive/Negative
锄俄?True/False
表示預(yù)測(cè)結(jié)果是否正確局劲,而 Positive/Negative
表示預(yù)測(cè)結(jié)果是 1 (惡性腫瘤) 或 0 (良性腫瘤)。故奶赠,TruePositive 表示正確地預(yù)測(cè)出惡性腫瘤的數(shù)量鱼填;FalsePositive 表示錯(cuò)誤地預(yù)測(cè)出惡性腫瘤的數(shù)量;FalseNegative 表示錯(cuò)誤地預(yù)測(cè)出良性腫瘤的數(shù)量毅戈。
在查準(zhǔn)率和召回率之間權(quán)衡
假設(shè)我們想提高癌癥的查準(zhǔn)率苹丸,即只有在很有把握的情況下才預(yù)測(cè)為癌癥∥回憶我們?cè)谶壿嫽貧w算法里赘理,當(dāng) $h_\theta(x) >= 0.5$ 時(shí),我們就預(yù)測(cè) $y = 1$ 扇单,為了提高查準(zhǔn)率商模,可以把門限值從 0.5 提高到 0.8 之類的。這樣就提高了查準(zhǔn)率蜘澜,但這樣會(huì)降低召回率施流。同樣的道理,我們?nèi)绻胩岣哒倩芈时尚牛梢越档烷T限值瞪醋,從 0.5 降到 0.3 。這樣召回率就會(huì)提高装诡,但查準(zhǔn)率就會(huì)降低银受。所以在實(shí)際問題時(shí),可以要接實(shí)際問題慎王,去判斷是查準(zhǔn)率重要還是召回率重要蚓土,根據(jù)重要性去調(diào)整門限值宏侍。
如何評(píng)價(jià)算法的好壞
由于我們現(xiàn)在有兩個(gè)指標(biāo)赖淤,查準(zhǔn)率和如回率,如果有一個(gè)算法的查準(zhǔn)率是 0.5, 召回率是 0.4谅河;另外一個(gè)算法查準(zhǔn)率是 0.02, 召回率是 1.0咱旱;那么兩個(gè)算法到底哪個(gè)好呢确丢?
為了解決這個(gè)問題,我們引入了 $F_1Score$ 的概念
其中 P 是查準(zhǔn)率吐限,R 是召回率鲜侥。這樣就可以用一個(gè)數(shù)值直接判斷哪個(gè)算法性能更好。典型地诸典,如果查準(zhǔn)率或召回率有一個(gè)為 0描函,那么 $F_1Score$ 將會(huì)為 0。而理想的情況下狐粱,查準(zhǔn)率和召回率都為 1 舀寓,則算出來的 $F_1Score$ 為 1。這是最理想的情況肌蜻。
自動(dòng)選擇門限值
前文介紹過互墓,門限值可以調(diào)節(jié)查準(zhǔn)率和召回率的高低。那么如何自動(dòng)選擇門限值以便讓算法的性能最優(yōu)呢蒋搜?我們可以使用交叉驗(yàn)證數(shù)據(jù)篡撵,算出使 $F_1Score$ 最大的門限值。這個(gè)值就是我們自動(dòng)選擇出來的最優(yōu)的門限值豆挽。
使用大量的數(shù)據(jù)集
Michele Banko and Eric Brill 在 2011 年用四種算法進(jìn)行了一個(gè)自然語言的機(jī)器學(xué)習(xí)訓(xùn)練育谬,結(jié)果發(fā)現(xiàn),數(shù)據(jù)量越大帮哈,訓(xùn)練出來的算法準(zhǔn)確性越高斑司。他們得出了下圖的結(jié)論。
然后這個(gè)結(jié)論是些前提:有足夠的特征進(jìn)行機(jī)器學(xué)習(xí)但汞。怎么樣判斷是否有足夠的特征呢宿刮?我們可以讓這個(gè)領(lǐng)域的專家來人工預(yù)測(cè)。比如給出一個(gè)房子的面積私蕾,讓房產(chǎn)經(jīng)紀(jì)人預(yù)測(cè)其房?jī)r(jià)僵缺,他肯定無法正確地預(yù)測(cè)。因?yàn)樘卣鞑蛔悴劝龋茈y只根據(jù)房子的面積推算出房子的價(jià)格磕潮。
怎么樣從理論上證明這個(gè)結(jié)論呢?我們知道容贝,如果我們有足夠的特征來進(jìn)行預(yù)測(cè)自脯,意味著我們可以構(gòu)建足夠復(fù)雜的模型(比如神經(jīng)網(wǎng)絡(luò))來讓我們的預(yù)測(cè)函數(shù)有比較低的偏差 (Low Bais),即讓訓(xùn)練數(shù)據(jù)集成本 $J_{train}(\theta)$ 的值很小斤富。如果我們有足夠多的數(shù)據(jù)膏潮,就可以確保我們可以訓(xùn)練出一個(gè)低方差 (Low Variance) 的算法,即我們可以讓交叉驗(yàn)證數(shù)據(jù)集成本 $J_{cv}(\theta)$ 接近訓(xùn)練數(shù)據(jù)集成本 $J_{train}(\theta)$ 满力。這樣最終我們的測(cè)試數(shù)據(jù)集成本 $J_{test}(\theta)$ 也會(huì)靠近訓(xùn)練數(shù)據(jù)集成本 $J_{train}(\theta)$ 焕参。