標籤:

從西瓜書出發--機器學習筆記(2)

第二章 模型評估與選擇

經驗誤差與過擬合

精度&錯誤率:分類錯誤樣本的樣本數占樣本總數的比例為錯誤率,即E(error)= a/m

反之則為精度 1 - E。

誤差:預測輸出和樣本真實值之間的差異,當學習器在訓練集上產生的誤差為訓練誤差(經驗誤差),在測試機或者新樣本上的誤差為泛化誤差,泛化誤差最小化是我們訓練計算機的根本目的。

欠擬合:訓練器對訓練數據的一般性質無法擬合,沒有好好學習,或者學習資料(數據)不夠導致。

過擬合:訓練器對訓練數據學習精度很高,但是太過刻板,無法泛化一般狀況,換一道題就不會做了。過擬合無法避免,我們的目標就是盡量的降低其影響,使得訓練器有著更低的泛化誤差。

評估方法

首先明確為何要使用評估方法。因為現實中未知的問題我們無法預知,為了判斷訓練器在經過訓練後,演算法判斷未知事物的性能,所以要選擇使用測試集來計算測試誤差,以此來估計我們最關心的泛化誤差。

測試集要求測試樣本獨立同分布,並且與訓練集互斥,否則在測試集上測試就無法正確的估算泛化誤差,因為兩次考同一張卷,根本說明不了學生的學習能力。下面來說明一些具體的方法:

一、留出法

面對一份數據集,留出法選擇將數據集分為互斥兩個集合,例如一份包含70%為訓練集,30%為測試集合。並且,為了更準確的評價,一般要對數據集進行多次隨機劃分,再取所有測試結果的平均值作為評估結果。

舉個栗子,有一個變態老闆,把總共1000顆栗子和榛子放在一個筐里讓員工去學習區分(不要問為啥,還記得當年數學書里雞鴨同籠的變態老農么),老闆先從筐里拿出700個混合子(?)作為訓練集,讓員工學習挑選,員工每次挑選出正確的栗子,老闆就會給個贊。當這員工區分完成了,老闆暗搓搓的拿出剩下300個讓員工挑選出栗子,但是不給任何反饋,最後來考察員工對剩下這300個的測試集的分類準確率。

既然叫變態老闆,當然沒有那麼容易收手,當員工分揀完成後,老闆把所有栗子和榛子混合回去,再次重複上面的步驟若干次,最後取每次員工在測試集上準確率的平均數作為評價員工的標準。

留出法操作簡單,但是注意分割比例,一般做法是2/3~4/5作為訓練集。

sklearn里的用法在此:

sklearn.model_selection.train_test_split - scikit-learn 0.19.1 documentation?

scikit-learn.org圖標

from sklearn.model_selection import train_test_splitfeatures_train, features_test, labels_train, labels_test = train_test_split(features, lables, test_size = 0.3, random_state = 45)

二、交叉驗證法

交叉驗證,顧名思義,數據集之間相互交錯的互相驗證,具體做法是將數據集劃分為k個互斥的子集,然後用k-1個子集用於訓練,剩下一個用於測試,經過一次測試之後,將上一次的測試集放回,在抽取一個不相同的子集作為驗證,直到完成k次,每個子集都充當過一次測試集,取k次的測試結果平均值。

正常狀況下,k選5、10、20的狀況比較多,即為k折驗證法(k-fold)。特別的,當k取數據集的長度時,這個時候叫做留一法(leave—one—out),留一法評估結果一般來說最準確,但是當數據集非常大的時候,需要的計算時間和資源往往很難承受,所以留一法適合數據集較小的狀況下使用。

又是那個變態老闆,這回他選擇將1000個栗子榛子混合物分成了10份,每次拿出其中9份讓員工練習,剩下一份用來對員工的水平進行考察,然後收回,選出不同的一份做繼續做測試集,剩下的用來訓練,最後拿10次的結果平均值作為考量,就是10折驗證法。當老闆特別的變態,他拿999顆作為訓練,拿一顆作為測試,每次測試不同,來回折騰1000次,就是留一法了。

sklearn中k-fold:

sklearn.model_selection.KFold - scikit-learn 0.19.1 documentation?

scikit-learn.org圖標

from sklearn.model_selection import KFoldkf = KFold(n_split = k, shuffle = False, random_state = None)for train_index, test_index in kf.split(X): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index]

三、自助法

自助法的名字有點迷惑,如果學習過概率論,就知道有一個經典的煩人問題,就是有放回的抽小球(陰影降臨),自助法簡單的說,就是通過對數據集進行多次的有放回的採樣,經過m次的採樣數據,組成了新的訓練集,但是原數據集中依然有1/e(自然對數導數,具體極限問題可查書)約等於36.8%的數據始終沒有被採樣,原數據集去除掉採樣數據的集合後,就是新的測試集。

自助法在數據集小並且難以有效劃分訓練-測試集時比較有效,同時,由於自助法能夠從初始數據集中產生多個不同的訓練集(採樣不同),對集成學習由很大的幫助;但是,由於這樣就改變了初始數據集的分布狀況,會引入估計偏差,所以在數據集足夠的時候還是上面個兩個方法比較合適。

還是那個變態老闆,這回他變得很摳門,不願意拿出1000個栗子榛子來給新員工進行培訓,他想了個辦法,拿出了100個混合物(?)來培訓,他首先標記每個堅果的編號,從中抽出20個記錄下編號,作為一個樣本1寫在小本本上,然後把堅果放回去,然後再抽取20個,作為樣本2記錄下來,經過一定次數之後,小本本上寫下來好多組樣本,這就是新的測試集,用來訓練員工,剩下一次都沒有被採樣到的堅果,約36.8%,就被當成了測試集。

由於自助法實際在集成學習(ensemble learning)使用最廣泛,所以留待記錄到集成學習再給出代碼示例。

四、調參與最終模型

對於很多演算法來說,有許多參數需要調節,就是所謂的調參,由於參數負責多樣,大量的參數又是在實數範圍內取值,導致很多學習機器學習的人自嘲調參行為就像是「煉丹」。例如,舉個簡單的栗子:

class sklearn.tree.DecisionTreeClassifier(criterion=』gini』, splitter=』best』, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

這是決策樹的可調節的參數,總共由13項,就算每個參數選取兩種可能取值,其對應可能的模型也有2的13次方,8192種可能,如果參數範圍更大,在沒有合理的指導下基本上就是一個不可能完成的任務。

同時,由於我們最終的願望是訓練出來的模型能夠在最終的測試集上取得好的泛化性能,那麼對於絕大多數的機器學習演算法都需要進行多次的調參,所以一般的做法是將數據集分為三份,訓練集用來訓練模型,驗證集用來驗證調節參數,最終的測試集用來評估模型泛化能力。

性能度量

性能度量就是根據不同場景和目標的需要,用來對比不同的演算法模型性能的指標。

在回歸任務中,最常用的就是均方誤差(MSE):

均方誤差,預測值和標記值差和的平均

相較於回歸任務,分類任務的性能度量會更加複雜,下面的錯誤率和精度主要就是用來描述分類任務的性能。

錯誤率:分類錯誤的樣本數占樣本總數的比例,例如1000個栗子榛子,錯將100個榛子選成了栗子,錯誤率就是10%。

精度:1減去錯誤率,實際上就是準確度。

錯誤率

準確率

概率密度積分形式

混淆矩陣

混淆矩陣秒速的是分類任務結果,其中:

TP(True Positive):真正例,就是模型分類樣本為真,樣本實際也為真,就是員工拿出來一個栗子,它還真的就是一個栗子。

FP(False Positive):假正例,模型分類樣本為真,但是樣本實際為假,一個迷糊的員工以為拿出來的是個栗子,實際上它是個榛子。

FN(False Negative):假反例,模型分類樣本為假,樣本實際也為假,員工以為手裡拿的是榛子,結果實際是個栗子。

TN(True Neagtive):真反例, 模型分類為假,樣本實際也為假,這回員工終於把榛子給正確的挑出來了!

查准率(precision)&查全率(recall)

查准率P:對於所有模型分類為正的樣本中,結果實際為正的樣本比例。讓員工把栗子挑出來,員工挑出來的所有堅果中真的是栗子的比例。

查全率R:對於所有模型分類為正的樣本總數,佔到真實數據集所有正例總數的比例。員工挑出來的正確栗子中,占原來栗子總數的比例。

查全率和查准率一般是一堆矛盾值,查全率越高,查准率一般就越低,查全率越低,查准率一般就越高。可以類比有兩個員工,一個細心,一個膽大,細心的想保證每個挑出來的儘可能是栗子,只挑最有把握的,這個時候就會漏掉不少真栗子,查全率就低了;相反,膽子大的想挑出更多的栗子,最粗暴的方法就是把所有堅果都選上,那麼查全率就很高,但是準確性就非常低了。

P-R曲線

P—R曲線與平衡點

如果將學習器的預測結果對樣例進行排序,從按照最可能的正例的樣本到最不可能的正例的樣本,通過對每個樣本的查准率和查全率標記在坐標軸上,就會得到PR曲線。

圖中的每一個曲線代表的是一個學習器,也就是模型,其中A完全將C包含在內,則A完全優於C,因為一個做事又全面又準確的員工一定由於哪一項都不如他的員工;但是考察A和B,兩個學習器的PR曲線發生了交叉,也就是說在某個範圍內,A的查准率優於B,但是在某個範圍內,B的查全率卻優於A,這個時候就要具體考量了現實狀況了,看看我們的目的是要更高的準確度還是更高的覆蓋程度。

當然,非要比出個高低,也有人提出按照曲線下面積大小來考察A和B的綜合素質,但是由於這個值不是很好估算,所以使用「平衡點」(BEP)的概念將更加方便的考察兩個學習器的性能度量。

當差准率=查全率的時候,就是PR圖的平衡點,A的平衡點大於B的平衡點,從平衡點上考量,A學習器的性能比B好。

F1度量和F-beta度量

實際上用平衡點來考量學習器的性能還是過於簡單了,所以更加常用的指標是F1度量和F-beta度量。

F1:查全率和差准率的調和平均值

F-beta:加權調和平均值

在現實任務中,不同的任務對查全率和差准率有著不同的目標,比如在醫療判斷上,面對癌症的判斷我們更加希望是能夠全面查找,不放掉任何一個可能性,對精度要求不是那麼高,那麼需要重視查全率;在推薦系統上,例如netflix網站希望推薦信息儘可能的符合用戶的喜好,而不是泛濫的彈出一堆廣告,這時候差准率就佔上風了。

F1是F-beta的特殊形式,當beta值為1的時候,F-beta退化為F1。beta的取值決定了任務對查拳查准率的不同要求,當beta>1時,查全率佔有更大的影響,當0<beta<1時,差准率有著更大的影響。

綜合查全率,差准率,F1

在多數的情況下,當我們面的的任務有很多二分類的混淆矩陣時候,如同一個數據集進行多次訓練所得,或者多個不同數據集上所得,這個時候希望考量一個演算法學習器的綜合性能,就需要使用」宏「和」微「兩種度量方式。

簡單的說,宏查全率、宏差准率就是對每次的結果進行簡單的平均,再用得到的平均值計算宏F1。

微查全率,微差准率,就是先對得到的混淆矩陣進行平均,再用經過平均的混淆矩陣來計算。

ROC 和AUC

首先要了解閾值(threshold),對於許多學習器,例如神經網路,每個節點輸出的都是一個在0和1之間的概率值,當概率大於0.5時候分類為正,小於0.5的時候分類為負,這個0.5就是這個學習器的閾值。

在不同的任務中,可以設置不同的閾值來把控學習器的性能度量,例如對學習器的查准率進行排序之後,把閾值設置靠前,則更加重視差准率,閾值設置靠後,則更加重視查全率。

ROC(受試者工作特徵,Receiver Operating Characteristic)曲線 ,與PR曲線類似,只是坐標數值不同了,ROC曲線使用的是TPR(真正例率)和FPR(假正例率)。

TPR是判斷學習器判斷正確的正例占數據中所有正例的比率,就是挑出來的栗子中占所有栗子的比率;FPR是判斷學習器判斷錯誤的正例占數據中占所有反例的比率,就是挑出來的榛子占所有榛子的比率。

ROC曲線

同PR曲線,當學習器A產生的ROC曲線能夠完全包住學習器B的ROC曲線時,則學習器A更加優秀;但是如果兩者的ROC曲線發生交叉,則考慮AUC(Area Under ROC Curve),即ROC曲線下的面積來判斷優劣。

在實際問題中,ROC曲線不可能像上圖一樣如此平滑,更加合理的ROC曲線是如下圖:

代價敏感錯誤率與代價曲線

不同的錯誤類型在任務中會產生不同的後果,例如在醫療判斷中,錯誤的將一個健康的人判斷成一個病人,或者將病人判斷成了健康的人,兩個判斷都是造成一個錯誤,但是代價確實不一樣的,前者只需要進行再次檢查,但是後者可能就會付出沉重的代價。所以,同樣是錯誤,其代價是不同的,就是」非均等代價「。

代價矩陣實際就是混淆矩陣的變形,只是將混淆矩陣中判斷正確的值設為0,即為沒有代價,判斷錯的的設為cost項,即產生代價。以二分類任務來說,還是用回醫療判斷的例子,0代表患者,1代表健康,那麼將患者判斷為健康人的代價就是cost01,那麼cost01的代價明顯是大於cost10的,損失程度相差越大,兩者的值相差越大。

在前面的例子中,默認的是錯誤代價相等,但在引入了錯誤代價的概念後,我們希望的是最小化的錯誤代價作為評判指標,就是寧可錯誤的將五個健康人判斷為患者,也不希望將一個患者錯誤的判斷為健康人,即cost01為cost10的五倍,則代價敏感(cost-sensitive)為:

代價敏感

代價曲線(cost curve)能夠反映出ROC曲線不能反應的代價值,其中正例概率代價:

歸一化:

其中FNR是假正例率,FRP是假反例率。

比較檢驗

在機器學習的性能比較中有幾個重要因素:

1、泛化性能才是目標,測試集上得到性能指標和該學習器在生活中的性能指標未必相同;

2、測試集的選擇可能會使得測試結果有所不同,甚至同一測試集也有可能產生不同結果;

3、很多機器學習的演算法有隨機性,同一個演算法在同一參數下在同意測試集下運行多次,也有可能產生不同的結果。

這也就是為什麼最後的結果還要進行統計假設檢驗來驗證性能。


推薦閱讀:

python3機器學習經典實例-第五章構建推薦引擎28
Relation Classification名詞解釋(持續更新,歡迎補充)
初窺神經網路內部機制,圖文詳解權重和隱藏層
機器學習篇:XGB為啥這麼萬能

TAG:機器學習 |