99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀模型驗(yàn)證的常用武器
模型驗(yàn)證的常用武器
2016-04-03
收藏
模型驗(yàn)證的常用武器


分類模型是數(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)證方法:


QQ截圖20160324114443.png


通過混淆矩陣可以算出模型預(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)則

QQ截圖20160324114451.png

通常要求模型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)

```

QQ截圖20160324114502.png


其中,二分變量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)

```

QQ截圖20160324114515.png


從上圖的結(jié)果可知,模型的預(yù)測變量均為顯著,即認(rèn)為這些變量是模型的重要變量。光有模型的預(yù)測變量顯著還不夠,還需要檢測模型是否顯著:


```{r}

#模型的顯著性檢驗(yàn)

anova(object = model, test = 'Chisq')

```

QQ截圖20160324114524.png


從第一個(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

```

QQ截圖20160324114533.png


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

```

QQ截圖20160324114546.png


從模型的預(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')

```

QQ截圖20160324114555.png


結(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')

```

QQ截圖20160324114605.png


提升度一般是這樣使用的:如果某項(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')

```

QQ截圖20160324114613.png


實(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')

QQ截圖20160324114624.png


上圖結(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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }