構建一個垃圾郵件分類器
對於垃圾郵件,我們可以人為的挑選若干個關鍵詞作為識別垃圾郵件判斷的特征,而在實際應用中,我們應該遍歷整個訓練集,在訓練集中找出出現次數最多的n個單詞,n介於10,000和50,000之間,將這些單詞作為所選用的特征。根據所找到的特征集合,我們可以為每一個郵件構建一個向量,如果在電子郵件中找到一個字,我們將分配其相應的項1,否則這一項將為0,即向量的每一項表示一個單詞。一旦我們准備好所有的x向量,我們就會訓練我們的算法,最后, 我們可以使用它來分類郵件是否是垃圾郵件。
- 收集更多地數據(例如“honepot”項目,但這並不一定有效)
- 發現更具有代表性的特征(例如:垃圾郵件發送中的題目-header)
- 開發一種算法實現輸入的不同方式(垃圾郵件中的拼寫錯位)
很難講,以上的措施哪一個更有效。。。從而引出接下來的error analysis
誤差分析
解決一個新的機器學習問題的推薦方法是:
- 從一個簡單的算法開始,盡快的實現它,並通過交叉驗證集測試它
- 嘗試繪出學習曲線(learning curve)以決定是否更多地特征、數據會對處理有效
- 手動檢查交叉驗證集中的樣本誤差,並嘗試發現大多數誤差發生的趨勢
例如假設我們有500份郵件,我們的模型誤分類了其中的100份,我們這是應手動的分析這100份郵件,判斷各屬於什么類型,然后,我們可以嘗試提出新的線索和特征,以幫助我們正確地分類這100封電子郵件。如果大多數錯誤分類的電子郵件是嘗試竊取密碼的郵件,那么我們可以找到這些電子郵件特有的功能,並將其添加到我們的模型中。
數值化模型的誤差值
將得到誤差轉化為單個數值是機器學習中的一個竅門。 否則,很難評估學習出的算法的性能。例如,如果我們使用詞干截取軟件(這是將不同形式的同一個單詞(fail/failing/failed)作為一個單詞(fail))處理的過程,並且獲得3%的錯誤率而不是5%,那么我們應該增加它到我們的模型。然而,如果我們嘗試區分大寫字母和小寫字母,最終得到3.2%的錯誤率而不是3%,那么我們應該避免使用這個新功能。總而言之,我們應該嘗試方法,並將該方法下的誤差率以數值表示,並根據得到的結果決定是否要保留新功能。
錯誤指標-偏斜類
以癌症的分類為例,訓練邏輯回歸模型\(h_\theta(x)\).其中(確診為癌症時y=1,否則y=0)。當通過訓練集樣本訓練出的模型對診斷的精確度達到99%時,即在測試集上誤差律僅為1%,這是是否可以說我們的訓練模型已經很優秀了呢?然而癌症患者的患病概率僅為0.5%,若我們進定義如下函數:
function y = predictCancer(x)
y = 0; %ignore x!
return
上述函數模型精確度也達到了99.5%,比之前訓練的模型看起來更加優秀,事實是這樣嗎?
查准率/回收率
y=1表示我們想檢測的真實類,整體分類可能有以下幾種:
設計一種高精度的學習系統:如,對於模糊單詞的分類{to,two,too},{then,than}
嘗試使用以下4種算法:1.感知器-Perceptron(Logistic regression)2.Winnow 3.Me,ory-based 4.朴素貝葉斯,隨着訓練集數目的增多,精確度如下圖:
使用包含很多參數的學習算法(如:具有很多特征的邏輯回歸/線性回歸;具有多個隱藏層的神經網絡)有:\(J_{train}(\theta)\)將會變小,在沒有出現過擬合現象下,增大訓練集有:
\(J_{train}(\theta) \approx J_{test}(\theta)\),此時\(J_{test}(\theta)\)也將會變小。