一、模型評估
混淆矩陣Confusion Matrix
在機器學習領域,混淆矩陣(confusion matrix),又稱為可能性表格或是錯誤矩陣。它是一種特定的矩陣用來呈現算法性能的可視化效果,通常是監(jiān)督學習(非監(jiān)督學習,通常用匹配矩陣:matching matrix)。其每一列代表預測值,每一行代表的是實際的類別。這個名字來源于它可以非常容易的表明多個類別是否有混淆(也就是一個class被預測成另一個class)。
Example
假設有一個用來對貓(cats)、狗(dogs)、兔子(rabbits)進行分類的系統(tǒng),混淆矩陣就是為了進一步分析性能而對該算法測試結果做出的總結。假設總共有 27只動物:7只貓, 8條狗, 12只兔子。結果的混淆矩陣如下圖:

這個混淆矩陣中,實際有 7只貓,但是系統(tǒng)將其中2只預測成了狗;對于 8條狗,其中有 2條被預測成了兔子,3條被預測成了貓。從混淆矩陣中我們可以看出系統(tǒng)對于區(qū)分貓和狗存在一些問題,但是區(qū)分兔子和其他動物的效果還是不錯的。所有正確的預測結果都在對角線上,所以從混淆矩陣中可以很方便直觀的看出哪里有錯誤,因為他們呈現在對角線外面。
Table of confusion
在預測分析中,混淆表格(有時候也稱為混淆矩陣),是由false positives,false negatives,true positives和true negatives組成的兩行兩列的表格。它允許我們做出更多的分析,而不僅僅是局限在正確率(準確率,下面會講,ACC)。
假定一個實驗有 P個positive實例,在某些條件下有 N 個negative實例。那么上面這四個輸出可以用下面的偶然性表格(或混淆矩陣)來表示:

這個表中呈現了所有衡量模式性能的方法,PPV,FDR,FOR,NPV,TPR,FPR,FNR,TNR以及Accuracy,都是用我們上面的false positives,false negatives,true positives和true negatives來進行計算的。
而其中,False Positive被稱為1類錯誤,而False Negative被稱為2類錯誤。
除去對角線分類正確的點不說,False Positive是說本身這個事物是正確的,但是卻判斷為錯誤的,False Negative是說本身這個事物是錯誤的,但卻判斷為正確的。我們針對不同的場景,重視False Negative或者False Positive的程度不同,比如我們現在已診斷病人的場景為例

False Negative是明明生病了,卻診斷為健康的,False Positive是明明是健康的,卻判斷為生病的,哪一個比重多影響嚴重呢?很明顯,False Negative比重大影響更重。所以就出現了很多除了acc以外衡量模型的方法。這中間比較最重要的就是精確率precision和召回率recall。
下一個最先引出的內容就是Accuracy
準確率accuracy
可以從上面那個圖很清楚的看到,
ACC = (所有True Positive + 所有 True Negative)/ 所有點
accuracy = (TP + TN) / (TP + FP + TN + FN)
就是準確率。換句話說,就是所有被分類正確的點在所有點中的概率。
肯定很好奇,已經有了ACC為什么還有那么多其他的判斷標準,其實,ACC有很多場景是不適合使用的。
準確率對于分類器的性能分析來說,并不是一個很好地衡量指標,因為如果數據集不平衡(每一類的數據樣本數量相差太大),很可能會出現誤導性的結果。例如,如果在一個數據集中有95只貓,但是只有5條狗,那么某些分類器很可能偏向于將所有的樣本預測成貓。整體準確率為95%,但是實際上該分類器對貓的識別率是100%,而對狗的識別率是0%。那么這個模型也是一個很不好的模型,并沒有真正的正確分類。
所以又通過混淆矩陣引出了另外的衡量模型的方法:
精確率precision
精確率precision總是和準確率Accuracy一同出現,但其實表達的并不是一樣的含義
精確率是針對我們預測結果而言的,它表示的是預測為正的樣本中有多少是真正的正樣本。那么預測為正就有兩種可能了,一種就是把正類預測為正類(TP),另一種就是把負類預測為正類(FP),也就是TPR。

召回率recall
召回率是針對我們原來的樣本而言的,它表示的是樣本中的正例有多少被預測正確了。那也有兩種可能,一種是把原來的正類預測成正類(TP),另一種就是把原來的正類預測為負類(FN),也就上面那個總圖對應的PPV。

那么用圖示來看下上面兩個的區(qū)別

精確率和召回率又被稱為查準率和查全率,
查準率=檢索出的相關信息量 / 檢索出的信息總量
查全率=檢索出的相關信息量 / 系統(tǒng)中的相關信息總量
F1 score
有時候我們用召回率,有時候又要用精確率確實比較迷惑,所以這時,就引入了F1分數,F1分數公式如下:
F1 Score:F1 Score = 2*P*R/P+R,其中P和R分別為 precision 和
recall
F1的由來主要是因為調和平均數,調和平均數(英語:Harmonic mean),是求一組數值的平均數的方法中的一種,調和平均數永遠小于一般的算數平均數,所以調和平均數,更接近小一點的那個值,套入F1公式的話,就是更接近精確率和召回率更小一點的那個值。
F-beta Score
首先鏈接是F1的鏈接哈,下面有F-beta Score的公式。
這個beta可以理解為偏向某個方向的天平,從下圖可以看出如果beta越小,那么越重視精確率,如果beta越大,則說明越重視召回率。


接收者操作特征曲線ROC curve
ROC空間將偽陽性率(FPR)定義為 X 軸,真陽性率(TPR)定義為 Y 軸。
- TPR:在所有實際為陽性的樣本中,被正確地判斷為陽性之比率。
TPR = TP / (TP + FN) - FPR:在所有實際為陰性的樣本中,被錯誤地判斷為陽性之比率。
FPR = FP / (FP + TN)
給定一個二元分類模型和它的閾值,就能從所有樣本的(陽性/陰性)真實值和預測值計算出一個 (X=FPR, Y=TPR) 座標點。
從 (0, 0) 到 (1,1) 的對角線將ROC空間劃分為左上/右下兩個區(qū)域,在這條線的以上的點代表了一個好的分類結果(勝過隨機分類),而在這條線以下的點代表了差的分類結果(劣于隨機分類)。
ROC空間里的單點,是給定分類模型且給定閾值后得出的。但同一個二元分類模型的閾值可能設定為高或低,每種閾值的設定會得出不同的FPR和TPR。
- 將同一模型每個閾值 的 (FPR, TPR) 座標都畫在ROC空間里,就成為特定模型的ROC曲線。
如下圖,人體的血液蛋白濃度是呈正態(tài)分布的連續(xù)變數,病人的分布是紅色,平均值為A g/dL,健康人的分布是藍色,平均值是C g/dL。健康檢查會測量血液樣本中的某種蛋白質濃度,達到某個值(閾值,threshold)以上診斷為有疾病征兆。研究者可以調整閾值的高低(將左上圖的B垂直線往左或右移動),便會得出不同的偽陽性率與真陽性率,總之即得出不同的預測準確率。
1. 由于每個不同的分類器(診斷工具、偵測工具)有各自的測量標準和測量值的單位(標示為:“健康人-病人分布圖”的橫軸),所以不同分類器的“健康人-病人分布圖”都長得不一樣。
2. 比較不同分類器時,ROC曲線的實際形狀,便視兩個實際分布的重疊范圍而定,沒有規(guī)律可循。
3. 但在同一個分類器之內,閾值的不同設定對ROC曲線的影響,仍有一些規(guī)律可循:
當閾值設定為最高時,亦即所有樣本都被預測為陰性,沒有樣本被預測為陽性,此時在偽陽性率 FPR = FP / ( FP + TN ) 算式中的 FP = 0,所以 FPR = 0%。同時在真陽性率(TPR)算式中, TPR = TP / ( TP + FN ) 算式中的 TP = 0,所以 TPR = 0%
當閾值設定為最高時,必得出ROC座標系左下角的點 (0, 0)。
當閾值設定為最低時,亦即所有樣本都被預測為陽性,沒有樣本被預測為陰性,此時在偽陽性率FPR = FP / ( FP + TN ) 算式中的 TN = 0,所以 FPR = 100%。同時在真陽性率 TPR = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%
當閾值設定為最低時,必得出ROC座標系右上角的點 (1, 1)。-
因為TP、FP、TN、FN都是累積次數,TN和FN隨著閾值調低而減少(或持平),TP和FP隨著閾值調低而增加(或持平),所以FPR和TPR皆必隨著閾值調低而增加(或持平)。
隨著閾值調低,ROC點 往右上(或右/或上)移動,或不動;但絕不會往左下(或左/或下)移動。
roc.PNG
以上就是ROC空間和ROC曲線,但是針對ROC曲線還有一個很重要的性質,那就是曲線下面積(AUC),AUC的意義是: 因為是在1x1的方格里求面積,AUC必在0~1之間。
假設閾值以上是陽性,以下是陰性;
若隨機抽取一個陽性樣本和一個陰性樣本,分類器正確判斷陽性樣本的值高于陰性樣本之機率 = AUC。
-
簡單說:AUC值越大的分類器,正確率越高。
下面來看下數據分步和AUC的關系,可以明顯看出,如果不是很好分出的數據,他的auc大概在0.5左右,而如果能完美分類的模型,他的auc為1.
auc.png
上面的評估指標都是評估分類模型的,現在讓我們來學評估回歸模型的指標
平均絕對誤差(Mean absolute error MAE)
其實顧名思義了,直接看圖看公式吧

很容易對不對,誤差的絕對值的總和求平均。
機器學習中我們一般用sklearn的mean_absolute_error函數來算結果。

但因為我們是用的絕對值做計算,這種情況我們不能去求導來做梯度下降(梯度下降通過求導的負數來得出我們的線段的斜率和偏移該怎么變化,或者說是變化方向),那么就引入了下一個誤差方式來方便求導,那就是:
均方誤差Mean squared error MSE
同樣,也基本是看到就知道大概意思了,那么我們直接看公式

很明顯對不對,點和線段的偏差的平方求和來求平均

同樣我們常用sklearn的mean_squared_error 函數來實現這個功能
決定系數R2 score
另外一個非常重要的判定分數是R2 score,又叫Coefficient of determination,R2 score在回歸問題評估上非常常見,R2 score是通過將我們的模型和最簡單的模型相比得出的,
具體計算如下:

上圖可以看出,決定系數越接近1,這個模型評估也好。
同樣用sklearn的r2_score函數計算。

二、模型選擇
方差,偏差,過擬合和欠擬合
首先要選擇模型,自然要知道什么樣的模型是不好的,針對模型來說,我們有兩種比較不好的模型,一種是過擬合的模型,另一種是欠擬合的模型,而這兩種不好的模型其實反應的是方差和偏差,這里有非常好的資料可以進行學習。
那么我們從頭細細道來:
當我們討論預測模型時,預測誤差可以分解為我們關心的兩個主要子部分內容:由于“偏差”引起的誤差和由于“方差”引起的誤差。在模型最小化偏差和方差的能力之間存在權衡。了解這兩種類型的錯誤可以幫助我們診斷模型結果并避免過擬合或欠擬合。
1、偏差和方差Bias and Variance
了解不同的誤差源如何導致偏差和方差有助于我們改進數據擬合過程,從而產生更準確的模型。我們以三種方式定義偏差和方差:概念上,圖形上和數學上。
概念上:
(1)由偏差引起的誤差:由于偏差引起的誤差被視為我們模型的預期(或平均)預測與我們正確值之間的差異。當然,你只有一個模型,所以談論預期或平均預測值可能看起來有點奇怪。但是,假設您可以多次重復整個模型構建過程:每次收集新數據并運行新分析創(chuàng)建新模型。由于基礎數據集中的隨機性,所得到的模型將具有一系列預測。偏差衡量這些模型的預測與正確值的距離。
(2)由方差引起的誤差:由于方差引起的誤差被視為給定數據點的模型預測的可變性。再次,假設您可以多次重復整個模型構建過程。方差是給定點的預測在模型的不同實現之間變化的程度。
圖形上:


這個靶子目標的中心是一個完美預測正確值的模型。靶子上的點請理解為每一次模型評估后實現,可以看到命中點與模型中心的偏差,最左上的很明顯,偏差和方差都很小的情況下,模型評估幾乎都正中紅心,這是一個良好模型的體現,而高方差的情況,點雖然靠近中心,但有些像四周分散,這就是過擬合的表現,就像一個人比較極端偏執(zhí),眼光比較狹隘,極端擬合了一些狀態(tài),沒有大局觀,而高偏差呢,能看到我們的點并沒有像中心靠攏,而是有些偏斜,這就是欠擬合的表現,就像一個人想面面俱到的做事情,比較圓滑,放任某些錯誤的邏輯繼續(xù)走偏。
從第二張模型復雜度圖(后面講)也能看到,我們variance方差和bias的存在基本是互斥的,高方差的話偏差就低,高偏差的話方差就低,就像我們的過擬合的狀態(tài)一樣,而我們就是要找到最低的那個error,盡量去找那個“完美”模型。
我們也可以看下面這個例子,來理解:

2、模型復雜度圖表
模型復雜性圖比較訓練誤差training errors和交叉驗證誤差cross-validation errors ,以便測量某個模型對給與的數據集是否過擬合或者欠擬合。就像這個圖中所示,比如第一個使用的是一階線性回歸,對于訓練數據有3個錯分類的點,對于測試數據有3個錯分類的點,這就勾出了曲線的第一個節(jié)點,以此類推,這樣的一個整體的圖,就是模型復雜度圖了

以這個圖來看,degree=2是最好的模型,在這之后的模型測試數據判斷失誤開始增多,圖形趨近于過擬合
K折交叉驗證
首先,什么是Cross-validation交叉驗證?它也叫循環(huán)估計,是一種統(tǒng)計學上將數據樣本切割成較小子集的實用方法。于是可以先在一個子集上做分析, 而其它子集則用來做后續(xù)對此分析的確認及驗證。 一開始的子集被稱為訓練集。而其它的子集則被稱為驗證集或測試集。交叉驗證的目標是在訓練階段定義一組用于“測試”模型的數據集,以便減少像過擬合的問題,得到該模型將如何衍生到一個獨立的數據集的提示。
那么同樣k折交叉驗證就是將訓練集分割成K個子樣本,一個單獨的子樣本被保留作為驗證模型的數據,其他K-1個樣本用來訓練。交叉驗證重復K次,每個子樣本驗證一次,平均K次的結果或者使用其它結合方式,最終得到一個單一估測。這個方法的優(yōu)勢在于,同時重復運用隨機產生的子樣本進行訓練和驗證,每次的結果驗證一次,10次交叉驗證是最常用的。
使用sklearn的方法如下

學習曲線
學習曲線,是表示通過增長學習經驗來觀察學習能力變化的一個圖表,這是原本的學習曲線的含義。
舉個栗子:

那么在機器學習中,學習曲線的y軸表示的是錯誤error或者是acc正確率,而原來表示經驗的x軸可能是用于學習的訓練樣本的數量或用于優(yōu)化系統(tǒng)模型參數的迭代次數等等。

可以用以下代碼生成學習曲線:
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
- estimator,是我們針對數據使用的實際分類器,例如 LogisticRegression() 或 GradientBoostingClassifier()。
- X 和 y 是我們的數據,分別表示特征和標簽。
- train_sizes 是用來在曲線上繪制每個點的數據大小。
- train_scores 是針對每組數據進行訓練后的算法訓練得分。
- test_scores 是針對每組數據進行訓練后的算法測試得分。
網格搜索
首先要了解一個概念,超參數,可能會覺得很奇怪,經常聽到參數,超參數什么?原文-參數與超參數的不同
模型參數是模型內部的配置變量,可以用數據估計模型參數的值;模型超參數是模型外部的配置,必須手動設置參數的值。
具體來說,首先,我們來看一下“參數”是什么?
參數作為模型從歷史訓練數據中學到的一部分,是機器學習算法的關鍵 。
統(tǒng)計學中的“參數”:
在統(tǒng)計學中,你可以假設一個變量的分布,比如高斯分布。高斯分布的兩個參數分別是平均值(μ)和標準差(sigma)。這在機器學習中是有效的,其中這些參數可以用數據估計得到并用作預測模型的一部分。
編程中的“參數”:
編程中可以將參數傳遞給函數。在這種情況下,參數是一個函數參數,可以有一個值范圍。在機器學習中,您正在使用的具體模型就是函數,需要參數才能對新數據進行預測。
參數和模型有什么關系?
根據經典的機器學習文獻,可以將模型看作假設,而參數是根據特定的數據集對假設進行的具體調整。
模型是否具有固定或可變數量的參數,決定了模型是“參數”模型或“非參”模型。
什么是模型參數?
簡單來說,模型參數就是模型內部的配置變量,可以用數據估計它的值。
具體來講,模型參數有以下特征:
- 進行模型預測時需要模型參數。
- 模型參數值可以定義模型功能。
- 模型參數用數據估計或數據學習得到。
- 模型參數一般不由實踐者手動設置。
- 模型參數通常作為學習模型的一部分保存。
通常使用優(yōu)化算法估計模型參數,優(yōu)化算法是對參數的可能值進行的一種有效搜索。
模型參數的一些例子包括:
- 人造神經網絡中的權重。
- 支持向量機中的支持向量。
- 線性回歸或邏輯回歸中的系數。
什么是模型超參數?
模型超參數是模型外部的配置,其值不能從數據估計得到。
具體特征有:
- 模型超參數常應用于估計模型參數的過程中。
- 模型超參數通常由實踐者直接指定。
- 模型超參數通常可以使用啟發(fā)式方法來設置。
- 模型超參數通常根據給定的預測建模問題而調整。
怎樣得到它的最優(yōu)值: 對于給定的問題,我們無法知道模型超參數的最優(yōu)值。但我們可以使用經驗法則來探尋其最優(yōu)值,或復制用于其他問題的值,也可以通過反復試驗的方法。
模型超參數的一些例子包括:
- 訓練神經網絡的學習速率。
- 支持向量機的C和sigma超參數。
- k鄰域中的k。
兩者聯系:
當針對特定問題調整機器學習算法時,例如在使用網格搜索或隨機搜索時,你將調整模型或命令的超參數,以發(fā)現一個可以使模型預測最熟練的模型參數。許多模型中重要的參數無法直接從數據中估計得到。例如,在K近鄰分類模型中...這種類型的模型參數被稱為調整參數,因為沒有可用的分析公式來為其計算一個合適的值。
第64-65頁,應用預測建模,2013
兩者區(qū)分:
模型超參數通常被稱為模型參數,這種叫法很容易讓人產生誤解。解決這個問題的一個很好的經驗法則如下:如果你必須手動指定一個“模型參數”,那么它可能就是一個模型超參數。
那么介紹完了超參數我們來真正進入網格搜索,這里有一篇講解的很好的文章,可以進行學習:
網格搜索算法與K折交叉驗證
大致介紹來說,Grid Search是一種調參手段,是通過窮舉法來找到自己所探索的參數中,最好的那一套參數,一般結合交叉驗證來用。舉例的話上面那個鏈接里寫的就很好了,這里就不說了。
最后,如何在sklearn中進行使用呢?
在 sklearn 中的網格搜索非常簡單。 我們將用一個例子來說明一下。 假設我們想要訓練支持向量機,并且我們想在以下參數之間做出決定:
kernel:poly或rbf。
C:0.1,1 或 10。
( 注:這些參數對于你來說,現在可以簡單了解一下,我們將在該納米學位接下來的監(jiān)督學習部分中詳細了解它們。
具體步驟如下所示:
1. 導入 GridSearchCV
from sklearn.model_selection import GridSearchCV
2.選擇參數:
現在我們來選擇我們想要選擇的參數,并形成一個字典。 在這本字典中,鍵 (keys) 將是參數的名稱,值 (values) 將是每個參數可能值的列表。
parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]}
3.創(chuàng)建一個評分機制 (scorer)
我們需要確認將使用什么指標來為每個候選模型評分。 這里,我們將使用 F1 分數。
from sklearn.metrics import make_scorer
from sklearn.metrics import f1_score
scorer = make_scorer(f1_score)
4. 使用參數 (parameter) 和評分機制 (scorer) 創(chuàng)建一個 GridSearch 對象。 使用此對象與數據保持一致 (fit the data) 。
# Create the object.
grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
# Fit the data
grid_fit = grid_obj.fit(X, y)
5. 獲得最佳估算器 (estimator)
best_clf = grid_fit.best_estimator_
現在你可以使用這一估算器best_clf來做出預測。
