1. 程式人生 > >西瓜書第二章(01)

西瓜書第二章(01)

今天起把西瓜書上重要的,經常用的內容簡單記錄一下,以防自己遺忘。

今天整理西瓜書2.1-2.4 #概念問題 學習器在訓練集上表現出來的誤差叫做訓練誤差,而在測試集上表現出來的叫做“泛化誤差”

當學習器把訓練樣本學的太好了的時候,很可能已經把訓練樣本上的一些獨特的特點當作了所有物件都會有的特性,這種叫做“過擬合”,與之相對的是”欠擬合“,這兩種問題在機器學習中對策大不相同。

在現實生活中,我們一般對一個問題會有多種演算法可供選擇,甚至對同一個學習演算法選擇不同的引數配置也會產生不同的模型,那麼我們應該怎麼對模型進行評估呢,這就是機器學習中的模型選擇問題。

#模型評估方法

####如何進行測試集與驗證集劃分 ①留出法 留出法是直接將資料集D劃分為兩個互斥的集合,其中一個集合作為訓練集,另一個作為測試集。需要注意的是劃分時候要儘量保持分佈的一致性,避免因為資料劃分而出現的偏差。 例如在分類問題中至少要保證樣本類別的比例相同,訓練集中存在著500個正例,500個反例,那麼測試集中應該保持與之相同如300個正例,300個反例。但是即使給出了訓練/測試集樣本之後仍存在著許多種劃分方式,如選正例中的前500個還是後500個做為訓練資料中的正例,一般使用留出法時採取的方法是多次隨機劃分並且最終取絕對值。 留出法還有一個問題就是如果訓練集佔據了大多數,那麼測試資料就不夠穩定準確,如果測試集佔據了大多數,那麼訓練出來的模型可能在測試集上表現不是很好,目前一般採用2/3~4/5用作訓練集,其餘用作測試集。

②交叉驗證法 交叉驗證法是先將資料集D劃分為k個大小的互斥子集,每個子集要儘量保證資料的分佈一致性,也就是採取的是分層取樣得到的,然後選取其中的k-1個子集做並集當作訓練集,餘下的一個子集當作測試集,這樣可以進行k組測試以及訓練,通常將這種稱為k折(Kfold)驗證,k一般取5,10,20,在sklearn(機器學習包)中有專門的方法來實現關於交叉驗證。 k折交叉驗證

和留出法存在一樣的問題,k折交叉驗證劃分時會有不同的劃分方法,為了減少因為樣本不同導致出現差別,k折交叉驗證通常要隨即使用不同的劃分重複p次,所以最終我們應該訓練的模型數目應該是p*k,加入是10折且重複劃分10次那麼我們應該訓練100個模型,k折交叉驗證有一個特例是當k等於1的時候叫做留一法(Leave_One_Out),顯而易見留一法不受樣本劃分方式的影響,但是缺點也很明顯。當資料集很大的時候我們需要訓練數量巨大的模型,甚至還不包括後期的引數調整。

③自助法 不管是留出法還是k折交叉驗證,我們模型得到的訓練資料都要比實際所有的資料要少一些,比如k折交叉驗證中我們的模型訓練資料是k-1個集合的並集,有什麼方法可以克服呢?就是我們接下來講到的自助法。 我們的資料集D,我們要對他進行取樣產生一個大小相同的D1資料集合,如果我們進行放回抽取操作,每次取出來一個然後放回,直到兩個集合資料總量相等時停止,這樣的話我們就會有一些資料被重複抽取,有一些從來沒有被抽取,那麼他們的概率是多少呢?

有大概36.8%的資料從來沒有被抽取過,我們將用沒在訓練集中出現的樣本用於測試,這樣的測試結果我們也稱作”包外估計“。

自助法在資料集較小,比較難劃分訓練/測試集的時候很有用,而且自助法能從初始資料集中產生多個不同的訓練集,這在以後我們將會學到的整合學習中很有用。我們應該知道,我們在進行取樣也就是抽取值的時候沒有進行分層等操作,也就是說資料會出現偏差,所以在資料量足夠的時候我們還是應該用前面兩種方法。

#調參與最終模型

很多初學者認為模型訓練完成之後就萬事大吉了,但是我們還有很多需要做的內容,比如我們需要對模型進行調參,在進行調參操作中我們會在一個範圍比如[0,0.2]之間,以0.05為步長直接進行暴力搜尋,看看在引數為多少的時候loss是最小的。如果有兩組這樣的引數我們就需要進行4*4=16組訓練,工程量還是非常大的。

這裡有個要注意的地方,也是我們剛開始很容易混淆的內容,就是關於資料的種類,實際上整個資料可以分為三種:測試集,驗證集,訓練集。測試集是我們模型在測試時候接觸到的資料,這些資料都是模型第一次接觸,所以對於這些資料的預測可以反映一個模型的泛化能力,而驗證集以及訓練集是模型在訓練中遇到的,訓練集就不用說了是模型拿來訓練的,而驗證集則是模型用來進行調參的,模型用這些資料來進行調整引數,通過這些資料的預測結果反饋給模型,模型記錄下來不同引數下的預測結果好壞,最終選擇最好的模型。

#效能度量 對於學習器而言,不僅要有各種實驗估計方法,還需要有衡量模型泛化能力的評價標準,這就是效能度量。

迴歸任務採用的是一般是均方誤差: 均方誤差

####查準率以及查全率 我們在面對實際問題時候經常會關心如下問題,比如在資訊檢索中“檢索出來的資訊有多少是使用者感興趣的”,“使用者感興趣的資訊有多少被檢索出來了”,用這些來判斷一個模型的好與不好,對於二分類問題,只存在正例以及反例,我們先給出混淆矩陣。 混淆矩陣

其中定義查準率以及查全率分別為 查準率以及查全率

需要注意的是,查準率以及查全率是成反比的,查準率高了那查全率要相對下降一些,查全率高了那查準率要下降一些。我們根據學習器的預測結果對樣例進行排序,排在最前面的是最有可能的樣本,然後把一個一個樣本都當作是正例進行預測這樣我們可以得到當前的混淆矩陣,然後以查全率作為橫軸,查準率作為縱軸可以得到“P-R圖” P-R圖

如果一個學習器把另外一個學習器的P-R圖完全包住那麼證明前者要優於後者,如果發生了交叉,則要具體看在哪種情況下哪種學習器更優。

查準率與查全率相等的點叫做平衡點簡稱BEP,誰的BEP更大則可能誰更優秀,但是隻看BEP事非常簡單的操作,更常用的是F1度量: F1度量

F1 是對查準率以及查全率進行調和平均,其次還有更加普通的度量函式

調和函式 這個調和函式是對查準率以及查全率的加權平均調和。其中的引數 度量了查準率對查全率的相對重要性等於1時候退化為標準的F1度量,當他大於1時候查全率更加重要,當他小於1時候查準率更加重要

####ROC 與 AUC 如果想了解ROC曲線那麼應該先了解兩個函式,一個是TPR(真正例率)一個是FPR(假正例率)兩者分別定義如下: 真正例率以及假正例率 畫圖原理和P-R圖是類似的,畫出如下: ROC曲線 但是在實際情況中我們通常只有有限個測試樣例來繪製ROC圖,所以僅能獲得有限個座標對,繪圖原理如下:給定m1個正例和m2個反例將分類閾值設定為最大則會預測所有樣例均為反例,這是分別將閾值設定為點的預測值,然後連線相鄰點即可。 現實繪製的ROC曲線

同樣的如果一個學習器的ROC曲線完全包住了另一個學習器的ROC曲線那麼前者是更好的,但是如果有交叉的話這時候可以看曲線下的面積AUC,AUC計算公式為 AUC 如果用AUC來評判模型的好壞那麼決定AUC的主要是前面排序的好壞,也就是前面根據模型對樣例預測值進行排序的好壞,他的排序損失函式如下圖所示,其中Ⅱ()函式表示如果其中的條件為真的話返回1,如果為假的話返回0。 損失函式