
分類模型是數(shù)據(jù)挖掘中應(yīng)用非常廣泛的算法之一,常用的分類算法有Logistic模型、決策樹(shù)、隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)、Boosting等。針對(duì)同一個(gè)數(shù)據(jù)集,可以有這么多的算法進(jìn)行分析,那如何評(píng)估什么樣的模型比較合理呢?本文就講講常用的模型驗(yàn)證武器,主要包括混淆矩陣、ROC曲線、提升度、增益法和KS統(tǒng)計(jì)量。
一、混淆矩陣
混淆矩陣就是如下圖所示的那樣,也是最簡(jiǎn)單的一種模型驗(yàn)證方法:
通過(guò)混淆矩陣可以算出模型預(yù)測(cè)精度((a+d)/(a+b+c+d))、正例覆蓋率(b/(c+d))、負(fù)例覆蓋率(a/(a+b))等。通過(guò)這么些指標(biāo)綜合考慮模型的預(yù)測(cè)準(zhǔn)確率。
二、ROC曲線
在講解ROC曲線之前,我們先看看幾個(gè)定義:
Sensitivity:正確預(yù)測(cè)到的正例數(shù)/實(shí)際正例總數(shù),即b/(c+d)
Specificity:正確預(yù)測(cè)到的負(fù)例數(shù)/實(shí)際負(fù)例總數(shù),即a/(a+b)
ROC曲線就是根據(jù)這兩個(gè)指標(biāo)值繪制出來(lái)的,其中x軸為1-Specificity,y軸為Sensitivity。
通過(guò)比較ROC曲線與45°直線可以直觀的反映模型的好壞,但并不能從定量的角度反饋模型好是好到什么程度或模型差是差到什么程度。那么就引申出了AUC的概念,即ROC曲線下的面積。當(dāng)曲線偏離45°直線越遠(yuǎn),則AUC越大,模型相應(yīng)就會(huì)越好。一般認(rèn)為AUC在0.75以上,模型就可以接受了。
三、提升度Lift
在講解提升度曲線之前,我們先看看幾個(gè)定義:
Pi:測(cè)試集中正例的比例,即(c+d)/(a+b+c+d)
Ptp:正確預(yù)測(cè)到的正例個(gè)數(shù)占總觀測(cè)值的比例,即d/a+b+c+d=Pi1* Sensitivity
Pfp:把負(fù)例錯(cuò)誤地預(yù)測(cè)成正例的個(gè)數(shù)占總數(shù)的比例,即b/a+b+c+d=(1-Pi1)*(1- Specificity)
Depth:預(yù)測(cè)成正例的比例,即b+d/a+b+c+d=Ptp+Pfp
PV_Plus:正確預(yù)測(cè)到的正例數(shù)/預(yù)測(cè)正例總數(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ù)測(cè)正例的正真準(zhǔn)確率。
四、增益法Gain
其實(shí)增益法Gain與提升度是一個(gè)事物的兩種說(shuō)法,從公式中就可以看出:
Gain=d/(b+d)=PV_plus
Gain與提升度相比并沒(méi)有除以Pi值。
五、K-S統(tǒng)計(jì)量
統(tǒng)計(jì)學(xué)中,對(duì)于單樣本的K-S檢驗(yàn)就是利用樣本數(shù)據(jù)來(lái)推斷其是否服從某種分布,對(duì)于兩樣本的K-S檢驗(yàn)主要推測(cè)的是兩個(gè)樣本是否具有相同的分布,對(duì)于模型的評(píng)估,希望正例的累積概率分布與負(fù)例的累積概率分布存在顯著差異。
所以我們使用K-S統(tǒng)計(jì)量刻畫(huà)模型的優(yōu)劣,即使正例與負(fù)例的累積概率差達(dá)到最大。這是一個(gè)定量的判斷規(guī)則,如下圖所示,為傳統(tǒng)的評(píng)價(jià)準(zhǔn)則
:
通常要求模型KS值在0.4以上。
廢話不多說(shuō),下面我們看看如何使用R語(yǔ)言實(shí)現(xiàn)這些評(píng)估模型的方法。
實(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水平作為感興趣的水平,很顯然對(duì)于客戶是否為優(yōu)質(zhì)客戶的問(wèn)題,這里選擇good作為關(guān)注對(duì)象是錯(cuò)誤的,下面指定bad水平為興趣水平。
```{r}
#指定感興趣的水平為bad
dmagecr$good_bad <- factor(dmagecr$good_bad, levels = c('good','bad'),ordered = TRUE)
#創(chuàng)建訓(xùn)練集和測(cè)試集
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ù)測(cè)變量均為顯著,即認(rèn)為這些變量是模型的重要變量。光有模型的預(yù)測(cè)變量顯著還不夠,還需要檢測(cè)模型是否顯著:
```{r}
#模型的顯著性檢驗(yàn)
anova(object = model, test = 'Chisq')
```
從第一個(gè)變量到最后一個(gè)變量,逐步加入模型后,模型的偏差檢驗(yàn)均為顯著,即認(rèn)為整個(gè)模型是通過(guò)檢驗(yàn)的。下面我們?cè)倏纯茨P偷臄M合優(yōu)度如何,即模型的預(yù)測(cè)與實(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ù)測(cè)值相吻合的原假設(shè),再次說(shuō)明模型是比較理想的。接下來(lái)我們就用這個(gè)訓(xùn)練集得到的模型來(lái)預(yù)測(cè)測(cè)試集:
```{r}
#模型預(yù)測(cè)
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)
#模型評(píng)估混淆矩陣
Freq <- table(test[,21], predict)
#預(yù)測(cè)精度
Accuracy <- sum(diag(Freq))/sum(Freq)
Freq;Accuracy
```
從模型的預(yù)測(cè)精度來(lái)看,準(zhǔn)確率為74.2%,模型預(yù)測(cè)并不理想。除了使用混淆矩陣來(lái)評(píng)估模型,還可以使用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,模型馬馬虎虎還能說(shuō)的過(guò)去。
```{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)營(yíng)銷活動(dòng)受成本的限制,又想使?fàn)I銷活動(dòng)取得非常成功,一般通過(guò)Lift曲線進(jìn)行人員的篩選,即給定某個(gè)Lift閾值,反過(guò)來(lái)確定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曲線長(zhǎng)的一模一樣,只不過(guò)是縱坐標(biāo)不同而已。
胡江堂的基于SAS模型評(píng)估系列文章中沒(méi)有涉及到K-S統(tǒng)計(jì)量的講解,本文就對(duì)其作一個(gè)拓展,R中還沒(méi)有找到直接繪制兩個(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)的評(píng)價(jià)準(zhǔn)則,也說(shuō)明該模型還是基本行得通的。
在數(shù)據(jù)挖掘實(shí)際過(guò)程中,需要橫向的比較多個(gè)模型評(píng)估結(jié)果,還需要縱向的比較同一個(gè)模型不同參數(shù)調(diào)整的評(píng)估結(jié)果。通過(guò)上面所說(shuō)的這些評(píng)估方法,終能夠選出一個(gè)最理想的模型。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10