
分類模型是數(shù)據(jù)挖掘中應(yīng)用非常廣泛的算法之一,常用的分類算法有Logistic模型、決策樹、隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)、Boosting等。針對同一個(gè)數(shù)據(jù)集,可以有這么多的算法進(jìn)行分析,那如何評估什么樣的模型比較合理呢?本文就講講常用的模型驗(yàn)證武器,主要包括混淆矩陣、ROC曲線、提升度、增益法和KS統(tǒng)計(jì)量。
一、混淆矩陣
混淆矩陣就是如下圖所示的那樣,也是最簡單的一種模型驗(yàn)證方法:
通過混淆矩陣可以算出模型預(yù)測精度((a+d)/(a+b+c+d))、正例覆蓋率(b/(c+d))、負(fù)例覆蓋率(a/(a+b))等。通過這么些指標(biāo)綜合考慮模型的預(yù)測準(zhǔn)確率。
二、ROC曲線
在講解ROC曲線之前,我們先看看幾個(gè)定義:
Sensitivity:正確預(yù)測到的正例數(shù)/實(shí)際正例總數(shù),即b/(c+d)
Specificity:正確預(yù)測到的負(fù)例數(shù)/實(shí)際負(fù)例總數(shù),即a/(a+b)
ROC曲線就是根據(jù)這兩個(gè)指標(biāo)值繪制出來的,其中x軸為1-Specificity,y軸為Sensitivity。
通過比較ROC曲線與45°直線可以直觀的反映模型的好壞,但并不能從定量的角度反饋模型好是好到什么程度或模型差是差到什么程度。那么就引申出了AUC的概念,即ROC曲線下的面積。當(dāng)曲線偏離45°直線越遠(yuǎn),則AUC越大,模型相應(yīng)就會越好。一般認(rèn)為AUC在0.75以上,模型就可以接受了。
三、提升度Lift
在講解提升度曲線之前,我們先看看幾個(gè)定義:
Pi:測試集中正例的比例,即(c+d)/(a+b+c+d)
Ptp:正確預(yù)測到的正例個(gè)數(shù)占總觀測值的比例,即d/a+b+c+d=Pi1* Sensitivity
Pfp:把負(fù)例錯(cuò)誤地預(yù)測成正例的個(gè)數(shù)占總數(shù)的比例,即b/a+b+c+d=(1-Pi1)*(1- Specificity)
Depth:預(yù)測成正例的比例,即b+d/a+b+c+d=Ptp+Pfp
PV_Plus:正確預(yù)測到的正例數(shù)/預(yù)測正例總數(shù),即d/(b+d)=Ptp/depth
提升度Lift=(d/b+d)/(c+d/a+b+c+d)=PV_plus/Pi1
Lift曲線就是根據(jù)Depth和Lift兩個(gè)指標(biāo)繪制而成,它反映了預(yù)測正例的正真準(zhǔn)確率。
四、增益法Gain
其實(shí)增益法Gain與提升度是一個(gè)事物的兩種說法,從公式中就可以看出:
Gain=d/(b+d)=PV_plus
Gain與提升度相比并沒有除以Pi值。
五、K-S統(tǒng)計(jì)量
統(tǒng)計(jì)學(xué)中,對于單樣本的K-S檢驗(yàn)就是利用樣本數(shù)據(jù)來推斷其是否服從某種分布,對于兩樣本的K-S檢驗(yàn)主要推測的是兩個(gè)樣本是否具有相同的分布,對于模型的評估,希望正例的累積概率分布與負(fù)例的累積概率分布存在顯著差異。
所以我們使用K-S統(tǒng)計(jì)量刻畫模型的優(yōu)劣,即使正例與負(fù)例的累積概率差達(dá)到最大。這是一個(gè)定量的判斷規(guī)則,如下圖所示,為傳統(tǒng)的評價(jià)準(zhǔn)則
:
通常要求模型KS值在0.4以上。
廢話不多說,下面我們看看如何使用R語言實(shí)現(xiàn)這些評估模型的方法。
實(shí)例操作:
```{r}
#讀取數(shù)據(jù)
dmagecr <- read.table(file = file.choose(), head = TRUE, sep = '')
#數(shù)據(jù)結(jié)構(gòu)
str(dmagecr)
```
其中,二分變量good_bad為目標(biāo)變量,Logistic模型默認(rèn)將good水平作為感興趣的水平,很顯然對于客戶是否為優(yōu)質(zhì)客戶的問題,這里選擇good作為關(guān)注對象是錯(cuò)誤的,下面指定bad水平為興趣水平。
```{r}
#指定感興趣的水平為bad
dmagecr$good_bad <- factor(dmagecr$good_bad, levels = c('good','bad'),ordered = TRUE)
#創(chuàng)建訓(xùn)練集和測試集
set.seed(1234)
index <- sample(c(1,2), size = nrow(dmagecr), replace = TRUE, prob = c(0.7,0.3))
train <- dmagecr[index == 1,]
test <- dmagecr[index == 2,]
#構(gòu)建Logistic模型
model <- glm(formula = good_bad ~ checking+history+duration+savings+property, family = binomial(link = "logit"), data = train)
#模型結(jié)果查看
summary(model)
```
從上圖的結(jié)果可知,模型的預(yù)測變量均為顯著,即認(rèn)為這些變量是模型的重要變量。光有模型的預(yù)測變量顯著還不夠,還需要檢測模型是否顯著:
```{r}
#模型的顯著性檢驗(yàn)
anova(object = model, test = 'Chisq')
```
從第一個(gè)變量到最后一個(gè)變量,逐步加入模型后,模型的偏差檢驗(yàn)均為顯著,即認(rèn)為整個(gè)模型是通過檢驗(yàn)的。下面我們再看看模型的擬合優(yōu)度如何,即模型的預(yù)測與實(shí)際情況是否吻合或相近,這里使用H-L檢驗(yàn):
```{r}
#模型的擬合優(yōu)度檢驗(yàn)--HL檢驗(yàn)
library(sjmisc)
HL_test <- hoslem_gof(x = model)
HL_test
```
H-L的P值顯著大于0.05,即接受實(shí)際值與預(yù)測值相吻合的原假設(shè),再次說明模型是比較理想的。接下來我們就用這個(gè)訓(xùn)練集得到的模型來預(yù)測測試集:
```{r}
#模型預(yù)測
probility <- predict(object = model, newdata = test[,-21], type = 'response')
predict <- ifelse(probility > 0.5, 'bad', 'good')
#轉(zhuǎn)型為因子
predict <- factor(predict, levels = c('good','bad'), order = TRUE)
#模型評估混淆矩陣
Freq <- table(test[,21], predict)
#預(yù)測精度
Accuracy <- sum(diag(Freq))/sum(Freq)
Freq;Accuracy
```
從模型的預(yù)測精度來看,準(zhǔn)確率為74.2%,模型預(yù)測并不理想。除了使用混淆矩陣來評估模型,還可以使用ROC曲線下的面積AUC、提升度Lift、增益法Gain和K-S統(tǒng)計(jì)量。下面就深入介紹這幾種方法:
```{r}
#ROC曲線
library(pROC)
roc_curve <- roc(test[,21],probility)
names(roc_curve)
Specificity <- roc_curve$specificities
Sensitivity <- roc_curve$sensitivities
library(ggplot2)
p <- ggplot(data = NULL, mapping = aes(x= 1-Specificity, y = Sensitivity))
p + geom_line(colour = 'red') +geom_abline(intercept = 0, slope = 1)+ annotate('text', x = 0.4, y = 0.5, label=paste('AUC=',round(roc_curve$auc,2)))+ labs(x = '1-Specificity',y = 'Sensitivity', title = 'ROC Curve')
```
結(jié)果顯示,AUC為0.79,相比于0.75,模型馬馬虎虎還能說的過去。
```{r}
#Lift曲線
Pi <- table(test$good_bad)[2]/sum(table(test$good_bad))
Ptp <- Pi*Sensitivity
Pfp <- (1-Pi)*(1-Specificity)
Depth <- Ptp + Pfp
PV_Plus <- Ptp/Depth
Lift <- PV_Plus/Pi
p <- ggplot(data = NULL, mapping = aes(x= Depth, y = Lift))
p + geom_line(colour = 'blue') + labs(x = 'Depth',y = 'Lift', title = 'Lift Curve')
```
提升度一般是這樣使用的:如果某項(xiàng)營銷活動受成本的限制,又想使?fàn)I銷活動取得非常成功,一般通過Lift曲線進(jìn)行人員的篩選,即給定某個(gè)Lift閾值,反過來確定Depth值。如提升度相比于不作任何模型,使其達(dá)到2倍以上的響應(yīng),需要設(shè)置Depth在前25%以內(nèi)。同樣,我們還可以繪制Gain曲線:
```{r}
#Gain曲線
p <- ggplot(data = NULL, mapping = aes(x= Depth, y = PV_Plus))
p + geom_line(colour = 'blue') + labs(x = 'Depth',y = 'PV_Plus', title = 'Gain Curve')
```
實(shí)際上,Lift曲線與Gain曲線長的一模一樣,只不過是縱坐標(biāo)不同而已。
胡江堂的基于SAS模型評估系列文章中沒有涉及到K-S統(tǒng)計(jì)量的講解,本文就對其作一個(gè)拓展,R中還沒有找到直接繪制兩個(gè)連續(xù)變量的K-S曲線統(tǒng)計(jì)量函數(shù),故這里自定義繪制曲線所需數(shù)據(jù)的函數(shù):
```{r}
#準(zhǔn)備K-S數(shù)據(jù)
ks_data <- as.data.frame(cbind(good_bad=test[,21], probility))
good_ks <- ks_data[which(ks_data$good_bad==1),'probility']
bad_ks <- ks_data[which(ks_data$good_bad==2),'probility']
#自定義計(jì)算累計(jì)分布函數(shù)值
KS_Data <- function(x, y){
gaps_x <- seq(min(x), max(x), length=1000)
cauculate_x <- numeric()
for(i in 1:length(gaps_x)){
cauculate_x[i] <- sum(x<=gaps_x[i])/length(x)
}
gaps_x <- sort((gaps_x-min(gaps_x))/(max(gaps_x)-min(gaps_x)))
gaps_y <- seq(min(y), max(y), length=1000)
cauculate_y <- numeric()
for(i in 1:length(gaps_y)){
cauculate_y[i] <- sum(y<=gaps_y[i])/length(y)
}
gaps_y <- sort((gaps_y-min(gaps_y))/(max(gaps_y)-min(gaps_y)))
return(list(df = data.frame(rbind(data.frame(Gaps = gaps_x,Cauculate = cauculate_x,Type = 'Positive'),data.frame(Gaps = gaps_y,Cauculate = cauculate_y,Type = 'Negtive'))), KS = max(abs(cauculate_y-cauculate_x)), x = gaps_y[which.max(abs(cauculate_y-cauculate_x))],y = abs(cauculate_x[which.max(abs(cauculate_y-cauculate_x))]-cauculate_y[which.max(abs(cauculate_y+cauculate_x))])/2))
}
#繪制K-S曲線
ggplot(data = KS_Data(bad_ks,good_ks)$df, mapping = aes(x = Gaps, y = Cauculate, colour = Type)) + geom_line() + theme(legend.position='none') + annotate(geom = 'text', x = KS_Data(bad_ks,good_ks)$x, y = KS_Data(bad_ks,good_ks)$y, label = paste('K-S Value: ', round(KS_Data(bad_ks,good_ks)$KS,2))) + labs(x = 'Probility', y = 'CDF')
上圖結(jié)果顯示,K-S統(tǒng)計(jì)量的值為0.43,根據(jù)傳統(tǒng)的評價(jià)準(zhǔn)則,也說明該模型還是基本行得通的。
在數(shù)據(jù)挖掘實(shí)際過程中,需要橫向的比較多個(gè)模型評估結(jié)果,還需要縱向的比較同一個(gè)模型不同參數(shù)調(diào)整的評估結(jié)果。通過上面所說的這些評估方法,終能夠選出一個(gè)最理想的模型。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03