1. 程式人生 > >R語言與分類演算法的績效評估

R語言與分類演算法的績效評估

關於分類演算法我們之前也討論過了KNN、決策樹、naivebayes、SVM、ANN、logistic迴歸。關於這麼多的分類演算法,我們自然需要考慮誰的表現更加的優秀。

既然要對分類演算法進行評價,那麼我們自然得有評價依據。到目前為止,我們討論分類的有效性都是基於分類成功率來說的,但是這個指標科學嗎?我們不妨考慮這麼一個事實:一個樣本集合裡有95個正例,5個反例,分類器C1利用似然的思想將所有的例項均分成正例,分類成功率為95%;分類器C2成功分出了80個正例,3個反例,分類成功率僅83%。我們可以說分類器C2不如C1嗎?這就充分表明了,分類成功率掩蓋了樣本是如何被分錯的事實。

那麼我們怎麼來充分反映分類的好壞呢?一個普遍使用的辦法就是報告分類矩陣(又稱混淆矩陣),他可以幫助我們更好地理解分類情況,許多的分類評價指標都是基於分類矩陣發展起來的。

一、考察資料與考察方法

當然,分類器在一個數據集上的好壞說明不了任何問題。以一個數據集的表現來評價分類器效能對分類器而言是極端不公正的也是極端不科學的。但是我們這裡因為篇幅限制,也只能通過一個數據集來看看分類的好壞。我們使用一個在信用評分領域裡大名鼎鼎的免費資料集,German Credit Dataset,你可以在UCI Machine LearningRepository找到(下載;資料描述)。

我們把這個資料分為兩部分,訓練資料train和測試資料test,我們感興趣的二分變數是good_bad,取值為{good, bad}。

信用評分指幫助貸款機構發放消費信貸的一整套決策模型及其支援技術。一般地,信用評分技術將客戶分為好客戶與壞客戶兩類,比如說,好客戶(good)能夠按期還本付息(履約),違約的就是壞客戶(bad)。具體做法是根據歷史上每個類別(履約、違約)的若干樣本,從已知的資料中考察借款人的哪些特徵對其拖欠或違約行為有影響,從而測量借款人的違約風險,為信貸決策提供依據。

二、分類矩陣

一個完美的分類模型就是,如果一個客戶實際上(Actual)屬於類別good,也預測成(Predicted)good,處於類別bad,也就預測成bad。但從上面我們看到,一些實際上是good的客戶,根據我們的模型,卻預測他為bad,對一些原本是bad的客戶,卻預測他為good。我們需要知道,這個模型到底預測對了多少,預測錯了多少,分類矩陣就把所有這些資訊,都歸到一個表裡:

真實結果

+1-1

預測結果+1真正例(TP)偽正例(FP)

-1偽反例(FN)真反例(TN)

FP和FN就是我們常說的第一類錯誤與第二類錯誤,以這四個基本指標可以衍生出多個分類器評價指標。

我們來看看KNN、決策樹、naivebayes、SVM、ANN、logistic迴歸這6

種基分類器的分類矩陣。

好了,分類矩陣全部算出來了,現在我們需要考慮的便是應該定義怎樣的評價指標了。

三、具體的靜態分類指標

常見的分類指標大致有如下幾個:

真實結果

+1-1

預測結果+1真正例(TP)偽正例(FP)

-1偽反例(FN)真反例(TN)

使用這些評價標準可以對分類器進行評估,尤其是其中的準確度或錯誤率,是比較常用的分類器效能評價標準。(在某些如推薦或資訊獲取領域還會組合使用precision-recall作為評價指標)但是,所有這些效能評價標準都只在一個操作點有效,這個操作點即是選擇使得錯誤概率最小的點(我們這裡選擇的是R中預設的分類,與最優閾值下的分類還是有很大差別的)。而且,其中大部分評價標準都有一個共同的弱點,即它們對於類別分佈的改變顯得不夠穩健。當測試集中正例和反例的比例改變時,它們可能不再具有良好的效能,有時甚至不能被接受。

構造一個高正確率(precision)或者高召回率(recall)的分類器不難,但是要保證兩者同時成立卻是很難的。顯然如果任何樣本都判為正例,那麼召回率很高但是正確率很難保證。構造一個同時使正確率和召回率最大的分類器也是具有挑戰性的。

我們來看看各種方法的各個指標情況:(上面是訓練集下面是測試集的資料)

methodFP ratespecificityrecallprecisionaccuracyF-score

logistic35.10%64.90%76.87%83.71%73.29%64.35%

Test36.36%63.64%76.55%84.73%73.00%64.86%

ANN50.61%49.39%87.93%79.74%76.13%70.11%

Test58.18%41.82%86.21%79.62%74.00%68.64%

SVM57.96%42.04%77.12%75.09%66.38%57.91%

Test58.18%41.82%80.00%78.38%69.50%62.70%

naive bayes44.49%55.51%84.32%81.11%75.50%68.39%

Test60.00%40.00%82.76%78.43%71.00%64.91%

C4.537.55%62.45%86.31%83.89%79.00%72.40%

Test60.00%40.00%82.76%78.43%71.00%64.91%

CART78.37%21.63%98.20%73.95%74.75%72.62%

Test85.45%14.55%96.55%74.87%74.00%72.28%

KNN21.63%78.37%95.14%90.88%90.00%86.46%

Test54.55%45.45%82.07%79.87%72.00%65.55%

將各個指標按降序排列看看哪個方法更好:

可以看到,對於這組非平衡資料,CART分類的結果是很棒的(主要考慮測試集),ANN也有不錯的表現,相比之下,在平衡資料裡表現不俗的SVM反而表現很差,我們再來看看在業界應用很多的logistic迴歸的表現:從recall的角度(預測為正例的真實正例佔所有的真實正例的比例)來看,logistic迴歸並不佔優,也就是利用這個模型銀行決定發放貸款的人群僅佔了值得給予貸款的人群的一小部分;再來看precision,從這個角度(預測為正例的比例在真正正例的比例)來看,logistic表現很好,也就是銀行估計你不會違約那麼你違約發生的可能性真心不大,所以就可靠性來說,這個做法有一定的合理性;再看整個預測的準確性,logistic表現也很好(測試集角度)。可能由於ANN的隱藏結點個數的選擇,CART的剪枝不太好把握,所以銀行選擇logistic模型作為貸款評估是有一定道理的。現代分類器很多都不是簡單地給出一個0或1 的分類判定,而是給出一個分類的傾向程度,比如貝葉斯分類器輸出的分類概率。對於這些分類器,當你取不同閾值,就可以得到不同的分類結果及分類器評價指標。我們還可以看到,隨著閾值的減小(更多的客戶就會被歸為正例),recall和1-Specificity也相應增加(也即Specificity相應減少)。那麼我們要動態的評價,一個合理的辦法就是把基於不同的閾值而產生的一系列recall和Specificity描繪到直角座標上,就能更清楚地看到它們的對應關係。由於recally和Specificity的方向剛好相反,我們把sensitivity和1-Specificity描繪到同一個圖中,它們的對應關係,就得到了傳說中的ROC曲線,全稱是receiver operating characteristic curve,中文叫“接受者操作特性曲線”。

四、ROC曲線與AUC

受試者工作特徵曲線 (receiver operatingcharacteristic curve,簡稱ROC曲線),又稱為感受性曲線(sensitivity curve)。得此名的原因在於曲線上各點反映著相同的感受性,它們都是對同一訊號刺激的反應,只不過是在幾種不同的判定標準下所得的結果而已。接受者操作特性曲線就是以虛報概率為橫軸,擊中概率為縱軸所組成的座標圖,和被試在特定刺激條件下由於採用不同的判斷標準得出的不同結果畫出的曲線。

(摘自:百度百科)

要分析ROC曲線,就得回到分類矩陣上,我們再來看看分類矩陣:

ROC繪製的就是在不同的閾值p下,TPR和FPR的點圖。所以ROC曲線的點是由不同的p造成的。所以你繪圖的時候,就用不同的p就行。

上圖便是利用logistic模型測算違約率的模型的ROC曲線(訓練集),我們可以看到在ROC曲線上會報告兩條線:一條實線,代表閾值變化時分類模型給出的TPR與FPR的變化情況;一條虛線,代表隨機猜測的TPR與FPR的變化情況。如果實線在虛線之上,那麼恭喜你,你的預測模型比胡亂猜測要優秀的。如果在虛線之下,那麼你還是放棄你的猜測辦法好了。

顯然,一個理想的模型會盡可能的處於左上角,這意味著兩類錯誤的都很低。這就告訴我們,可以計算ROC實線上的每一個點與(0,1)的距離,距離最小的那個點對應最佳閾值。我們分類時就應該這麼去設定閾值,而非單純的設定0.5,上圖我們可以看出閾值取0.4時比0.5會好一些,我們來看看是不是這樣的:

當閾值為0.4時的分類矩陣:

訓練集 good bad 測試集 good bad

good45394 good11423

bad102151 bad3132

我們還可以利用R算出最優閾值0.4408,此時的分類矩陣(訓練集最優)

訓練集 good bad 測試集 good bad

good45187 good11422

bad104158 bad3133

與0.5時的分類矩陣相比:

訓練集goodbad測試集goodbad

good44286good11120

bad133159bad3435

可以看到分類效果還是有所改善的。

名稱訓練集測試集

閾值0.50.40.440.50.40.44

FP rate35.10%38.37%35.51%36.36%41.82%40.00%

specificity64.90%61.63%64.49%63.64%58.18%60.00%

recall76.87%81.62%81.26%76.55%78.62%82.29%

precision83.71%82.82%83.83%84.73%83.21%86.75%

accuracy73.29%75.50%76.13%73.00%73.00%76.96%

F-score64.35%67.60%68.12%64.86%65.42%71.38%

關於ROC下的最優閾值,簡單理解下的話,保證TPR同時代價FPR要儘量的小,那麼我們建立max(TPR+(1-FPR))的模型,然後選合適的閾值p_0。這就說明用ROC比用一些靜態指標是要好很多的。而且ROC有一個更大的優點,就是可以基於成本效益來判決分類器好壞,比如說銀行處在擴張的階段,它吸納一個偽客戶的後果遠比放棄一個真客戶的後果要輕,於是我們比較分類器就應該在控制棄真錯誤的基礎上比較誰犯的取偽錯誤更少來評價。在這樣的指導思想下,我們可以判斷下圖的A與B誰更優秀。這是靜態指標肯定做不到的。

ROC曲線是根據與45度線的偏離來判斷模型好壞。圖示的好處是直觀,不足就是不夠精確。到底好在哪裡,好了多少?一個自然的想法就是對曲線下的面積進行比較,這就傳說中的AUC(Area Under the ROC Curve,ROC曲線下的面積),不過也不是新東西,只是ROC的一個派生而已。回到先前那張ROC曲線圖。45度線下的面積是0.5,ROC曲線與它偏離越大,ROC曲線就越向左上方靠攏,它下面的面積(AUC)也就應該越大。我們就可以根據AUC的值與0.5相比,來評估一個分類模型的預測效果(我們這裡logistic分類器訓練集的auc約為0.78)。但是AUC僅僅給出的是分類器的平均效能值,這是不能代替對整條曲線的觀察的。

我們現在來說說ROC曲線的做法。為了畫出ROC曲線,分類器必須提供每個樣例被判為正例或者反例的可信度的值(在一些文獻中稱之為score)。如naive Bayes提供了一個可能性,logistic迴歸中輸入到sigmoid函式中的數值或者sigmoid函式的輸出值,SVM中輸到sign函式裡的數值都可以看做分類器預測強度的衡量值。為了畫出ROC曲線,首先要將分類樣例按照其預測強度排序,先從排名最低的開始,所有排名更低的都被判為反例,所有排名更高的都被判為正例,這就得到了對應的點(1,1)。然後,將其移到排名次低的樣例中去,如果該樣例是正例,那麼修改TPR,否則修改FPR;依次做下去,可以得到ROC。

上述過程聽起來不是那麼的明白,不妨閱讀以下下列程式碼,就會發現一切是那麼的一目瞭然。(以logistic模型考慮客戶分類為例)

reg1<-glm(good_bad~checking+history+duration+savings+property,data=trainset,family="binomial")

reg2<-step(reg1)

summary(reg2)

p<-predict(reg2,trainset)

TPR<-rep(0,length(p))

FPR<-rep(0,length(p))

for(i in 1:length(p)){

p0<-p[order(p)[i]];

label.true<-ifelse(trainset[,6]=="good",1,0)

label.pred<-1*(p>p0)

TPR[i]<-sum(label.pred*label.true)/sum(label.true)

FPR[i]<-sum(label.pred*(1-label.true))/sum(1-label.true)

}

plot(FPR,TPR,type="l",col=2)

points(c(0,1),c(0,1),type="l",lty=2)

得到如下圖形(與之前R給出的ROC相比是不是幾乎一樣的):

執行下列程式碼還可以得到近似的AUC:

pos.label<-p[trainset[,6]=="good"]

neg.label<-p[trainset[,6]=="bad"]

mean(sample(pos.label,500000,replace=T) > sample(neg.label,500000,replace=T))

aucs<-replicate(1000,mean(sample(pos.label,1000,replace=T) > sample(neg.label,1000,replace=T)))

這裡我解釋一下為什麼這麼算。首先我們回到ROC曲線的定義上,我們可以清楚的看到曲線下方的點都是正例得分超過反例的點。這也再次說明了AUC給出了分類器的平均效能值。於是,利用蒙特卡羅的辦法就可以輕鬆地得到面積。aucs<-replicate(1000,mean(sample(pos.label,1000,replace=T)> sample(neg.label,1000,replace=T)))程式碼是為了利用bootstrap的辦法來看看模擬計算的好壞而寫的,可以忽略不看。

(tips:蒙特卡羅算面積的一個很直觀的解釋.假設你要計算上圖的面積,我們可以將這個圖片用1*1的紙張打印出來,倒1000顆豆子到紙上(假定豆子全在紙上),那麼大數定律告訴我們,落在曲線下方的豆子數/總豆子數可以看做任取一點那一點落在曲線下方的概率=曲線下方的面積/總面積,總面積已知,故求出曲線下方的面積)

我們將logistic迴歸,人工神經網路(ANN)、支援向量機(SVM)、樸素貝葉斯(naivebayes)的ROC曲線繪製如下(訓練資料集):

在看看測試資料集的ROC曲線:

從上圖我們可以很容易理解為何業界人士那麼喜歡logistic迴歸作為信用評分的標準了吧,它不僅簡單而且好用。

為了精確的比較,我們還是來報告一下AUC:

LogisticANNSVMBayes

訓練集0.781950.797820.606070.77650

測試集0.760750.690720.674980.73241

除了ANN可能是我設計的不是那麼的合理(隱藏結點取5有些magic number的味道)導致其AUC可能超過logistic而沒有超過外,其他的都能看到logistic在AUC指標下表現不俗。但是我們從整個ROC曲線來看。Logistic的優勢在於logistic很好的控制住了FPR,所以在兩類錯誤代價不一致時,如何選取還得仔細分析。正如同我們前面說的資料分析是一門藝術而不是一門技術,具體問題還需具體分析。

五、ROC的延續

ROC曲線的所有內容都是分類矩陣提供的,我們可以運用ROC類似的辦法來定義一些新的曲線來衡量分類器效能的好壞。我們這裡還是先回顧一下分類矩陣:

1、PR曲線

我們之前在評述靜態分類指標時就說過,在某些如推薦或資訊獲取領域還會組合使用precision-recall作為評價指標。那麼我們不妨來看看precision與recall展示到二維空間後評估了什麼?合理的解釋又是什麼?Precision-Recall曲線,這個東西應該是來源於資訊檢索中對相關性的評價,用我們的例子來講,Precision 就是我們決定發放貸款的人群中有多少是會按時還款的,Recall就是所有值得發放貸款的人有多少被銀行挑選出來給予服務了。放到檢索中來說,Precision 就是檢索出來的條目中(比如網頁)有多少是準確的,Recall就是所有準確的條目有多少被檢索出來了。這也就是為什麼IR中很多演算法的評估都用到Precision和Recall來評估好壞。

我們來看看logistic迴歸在測試集上PR曲線的表現:

Logistic迴歸在訓練集上的表現:

與ROC曲線的做法類似,我們這裡不再詳述PR曲線的做法,我們直接上程式碼:

reg1<-glm(good_bad~checking+history+duration+savings+property,data=trainset,family="binomial")

reg2<-step(reg1)

summary(reg2)

p<-predict(reg2,testset)

Precision<-rep(0,length(p))

Recall<-rep(0,length(p))

label.true<-ifelse(testset[,6]=="good",1,0)

for(i in 1:length(p)){

p0<-p[order(p)[i]]

label.pred<-1*(p>=p0)

Recall[i]<-sum(label.pred*label.true)/sum(label.true)

Precision[i]<-ifelse(is.nan(sum(label.pred*label.true)/sum(label.pred)),1,

sum(label.pred*label.true)/sum(label.pred))

}

plot(Recall, Precision, col=4,lwd=5, type="l",xlab="Recall",ylab="Precision", main="PR Curve")

我們來看看PR意義下不同分類器的績效(左訓練集右測試集):

2、lift曲線

我們再一次回到分類矩陣:

考慮lift曲線,意味著我們需要重新加入一個指標:lift。為了敘述的簡便,在說lift之前我們引入指標:depth、k。Depth=proportionallocated to class 1=(TP+FP)/(P+N),表示預測成正例的樣例佔總樣例的比例。

K=P/(P+N),表示總樣例中正例所佔的比例。

Precision表明如果採用了分類器,正例的識別比例;而k表明如果不用分類器,用隨機的方式抽取出正例的比例。這二者相比自然就解決了如果使用者用分類器分類會使得正類產生的比例會增加多少的問題。這就自然而然的定義了提升值lift:Lift=precision/K,意味著與不利用模型相比,模型的預測能力“變好”了多少。顯然,lift(提升指數)越大,模型的執行效果越好。如果這個模型的預測能力跟似然的.

結果一樣(lift等於1),這個模型就沒有任何“提升”了。光有lift一個指標是不夠的,那麼還有一個指標是什麼呢?depth(有的書稱為RPP:

正類預測比例,Rate of positive predictions的縮寫)。之所以選擇depth是因為隨著閾值的減小,更多的客戶就會被歸為正例,也就是depth(預測成正例的比例)變大。當閾值設定得足夠的小,那麼幾乎所有的觀測值都會被歸為正例(depth幾乎為1)——這時分類的效果就跟似然的結果差不多了,相對應的lift值就接近於1。

lift曲線是資料探勘分類器最常用的方式之一,與ROC曲線不同的是lift考慮分類器的準確性,也就是使用分類器獲得的正類數量和不使用分類器隨機獲取正類數量的比例。

那麼在一個合理的depth範圍內,我們要尋找最大的提升。這就是比較模型的依據。我們先來看看logistic迴歸模型的lift圖:

一個常用的利用lift圖作為模型比較依據的辦法:lift圖把驗證資料集中的觀測資料根據它們的分數以升序或降序排列,分數是基於訓練資料集估計的響應事件(成功)的概率。把這些分數再細分成10分位點,然後對驗證資料集中的每個10分位點計算和圖示成功的預測概率。如果這些成功的預測概率與估計概率具有相同的順序(升序或降序),那麼模型就是有效的。 我們以下圖為例:

圖中可看出分數以降序排列,所以曲線減少越多表明模型越好。因此模型classification tree看起來比另一個更好,特別是在第3個10分位點,它具有較好的成功率。

用每個曲線的值除以基本線,可得到效能的相對指標,稱為lift,它測量一個模型的價值。

對於模型classification tree,在第3個10分位點的lift值為2.77(即2.27%/1.0%),這意味著使用模型classification tree的成功率是隨機選擇(基本線)的3倍。

我們來看看lift意義下不同分類器的績效(左訓練集右測試集):

當然這裡有必要指出的是lift這個指標就是作為單純的靜態指標也是很常用的,而且可以這麼說lift作為靜態指標比作為這樣的動態指標更常用,畢竟比起用哪一類模型我們更關心確定的那一個模型的好壞。通常來說lift大於2就說明分類效果可以了。但是對於有偏資料來說,似然估計的準確率已經很高了,希望lift達到2或者更高基本不太現實。

3、Gains曲線

有了lift的基礎,我們要說的增益曲線就變得異常簡單了,lift曲線不是以lift作為評價指標嘛,我們換成precision作為評價指標,畫precision-depth曲線就是傳說中的gains曲線了。

4、Lorenz曲線

既然gains曲線選擇了precision作為縱軸,那我們選recall可不可以呢?當然可以,傳說中的lorenz曲線就是他了。lorenz曲線的橫軸就是lift曲線中涉及到的深度depth,也就是:將樣本的預測為1的概率從大到小排序後,取前百分之幾。通常會簡化成十分位點,0%,10%,20%,...,90%,100%。而曲線的縱軸其實就是相對應的TPR。形象地說,就是我們面對著一堆人(1000個),這堆人裡面有20個壞人,我們的目標就是抓壞人。通過模型計算,我們把這堆人按照可能是壞人的概率從大到小地排了隊,然後我們抓取前一百名,在這前一百名裡面,可能就有13個壞人了(因為這一百個人的是壞人的概率比較高嘛),也就是說我們只抓取10%的樣本,但是抓到了65%的目標。從lift的角度也可以很好地理解這種提升效果,而lorenz則更形象地展示了這種投入產出比的含義。

以上提到的ROC、Lift、Gains、Lorenz,都是基於混淆矩陣及其派生出來的幾個指標。

如果願意,你隨意組合幾個指標,展示到二維空間,就是一種跟ROC平行的評估圖。

六、R實現

R提供了各種各樣的函式來實現分類的績效評估。我們為了保持行文的一貫性,我們使用鳶尾花資料(僅考慮後兩種花的分類)SVM模型來說說R是如何實現績效評估的。

有些指標在另一群人的眼中是這樣的:

Sensitivity(覆蓋率,True Positive Rate)=正確預測到的正例數/實際正例總數PV+ (命中率,Precision,Positive Predicted Value) =正確預測到的正例數/預測正例總數Specificity (負例的覆蓋率,True Negative Rate) =正確預測到的負例個數/實際負例總數

我們來看看最熟悉的分類矩陣(data僅為鳶尾花的51到150行的資料):

library(e1071)

m1 <- svm(Species~.,data=data,cross=10,type="C-classification",kernel="sigmoid")

pred1<-predict(m1,data)

table(pred1,data[,5])

之後是ROC圖:

library(ROCR)

pred<-predict(m1,data,decision.values = TRUE)

p<--attr(pred,"decision.values")

pred <- prediction(p, data[,5])

perf <- performance(pred,"tpr","fpr")

plot(perf,colorize=TRUE)

grid(5, 5, lwd = 1)

points(c(0,1), c(0,1), type="l", lty=2, lwd=2, col="grey")

函式筆記:ROCR包提供了ROC圖的繪製函式,他的主要函式有:

prediction(predictions, labels, label.ordering = NULL)

引數說明:

Predictions:是評價的得分向量

Labels:真實的分類向量

performance(prediction.obj, measure, x.measure="cutoff", ...)

引數說明:

Prediction.obj:由prediction生成的物件

Measure:各種評價指標,如recall、precision、actual等,詳見幫助文件,x.measure類似

計算AUC:

auc.tmp <- performance(pred,"auc")

auc <- as.numeric([email protected])

auc <- round(auc, 4)

計算ROC意義下的最佳閾值:

library(Daim)

roc1<-roc(-p,data[,5],"versicolor")

summary(roc1)

函式筆記:Daim包的roc函式提供了roc曲線的繪製,最佳cutoff點的求解,auc求解等功能。

roc(x, labels, labpos, thres=NULL, ...)

引數說明:

X:評價得分向量

Labels:實際分類向量

Thres:正例名稱

Tips:你可以嘗試plot(roc1)

繪製PR曲線:(預設以載入ROCR包,下同)

pred <- prediction(p, data[,5])

perf <- performance(pred,measure="prec", x.measure="rec")

plot(perf,colorize=TRUE)

繪製lift曲線:

pred<- prediction(p, data[,5])

perf<- performance(pred,measure="lift", x.measure="rpp")

plot(perf,colorize=TRUE)

繪製Gain曲線

pred<- prediction(p, data[,5])

perf<- performance(pred,measure="prec", x.measure="rpp")

plot(perf,colorize=TRUE)

繪製Lorenz曲線:

pred<- prediction(p, data[,5])

perf<- performance(pred,measure="rec", x.measure="rpp")

plot(perf,colorize=TRUE)

grid(5,5, lwd = 1)

points(c(0,1),c(0,1), type="l", lty=2, lwd=2, col="grey")

除此以外,你還可以嘗試Sensitivity/specificity曲線(試著解釋一下它)

pred<- prediction(p, data[,5])

perf<- performance(pred,measure="sens", x.measure="spec")

plot(perf,colorize=TRUE)

tips:基本上你可以拿任何兩種指標填入measure與x.measure裡便可以得到一幅圖,

還有很多幅圖都是可以畫的,你可以逐一去嘗試他們,這裡就不一一介紹了。

七、小結

前面說了那麼多,我們考慮GermanCredit Dataset這個例子,把我們所說的東西的含義簡單的總結一下。

我們所說的增益gain意味著從30%的人裡抓到了50%的欺騙者,這就是gain曲線(0.3,0.5)

這一座標點的含義。對角線意味著利用似然想法隨意抓人的收益。

我們所說的提升lift意味著從30%的人裡抓,抓到5個,比隨便抓,抓到3個要好了5/3=1.7,這就是lift曲線(0.3,1.7)這一點的含義

我們所說的ROC曲線意味著從30%的人裡面抓到了欺騙者的50%(5/10),抓錯了好人20%(4/20),這就是ROC曲線上(0.2,0.5)的含義。對角線意味著胡亂抓人(每人都有50%的可能是欺騙者)的情況。

Lorenz曲線與K-S指標見下圖:

(上圖的座標軸標註不是很準確:紅線是lorenz bad,藍線是lorenzgood)

Reference:

這次不提供further reading,這篇文章參考但不限於下列文獻:

百度百科:ROC曲線

波波頭一頭:二分類模型效能評價2.0(ROC曲線,lift曲線,lorenz曲線)

胡江堂:分類模型的效能評估系列文章(混淆矩陣、ROC和AUC、lift和gain)

丕子:再理解下ROC曲線和PR曲線

不周山:分類器評價、混淆矩陣與ROC曲線