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

熱線電話:13121318867

登錄
首頁精彩閱讀我是R語言小白帶你建模之a(chǎn)daboost建模
我是R語言小白帶你建模之a(chǎn)daboost建模
2018-08-16
收藏

我是R語言小白帶你建模之a(chǎn)daboost建模

今天更新我用我蹩腳的R技能寫的一個(gè)adaboost建模的過程,代碼有參考別人的代碼再根據(jù)自己的思路做了更改。代碼一部分來自書籍《實(shí)用機(jī)器學(xué)習(xí)》,我個(gè)人特別喜歡這本書

至于adaboost,大家自動(dòng)移步谷歌,我跟一個(gè)人說我喜歡百度,他誤以為我喜歡百度一個(gè)公司,所以我決定改口說去谷歌,畢竟谷歌沒廣告。

先說,模型的數(shù)據(jù)是我實(shí)現(xiàn)已經(jīng)缺失值填補(bǔ),以及分組好的數(shù)據(jù),所以代碼中沒有預(yù)處理的部分,只有一些簡單變量的轉(zhuǎn)化。

代碼分為三部分:

1、加載包以及一個(gè)簡單的變量形式轉(zhuǎn)化,以及訓(xùn)練集和測試的分區(qū),還有初步擬合一個(gè)簡單的adaboost。

2、設(shè)置深度以及樹的棵樹,希望是,能通過輸出的模型評(píng)估指標(biāo),找到一個(gè)復(fù)雜度低,但是模型效果相對(duì)較好的adaboost。

3、檢查你取的最優(yōu)的adaboost的模型的泛化能力,這里是通過把數(shù)據(jù)集變成十等份,用剛才擬合出來的adaboost模型計(jì)算其ks、auc、正確率啊,看時(shí)候會(huì)不會(huì)過擬合造成在其他數(shù)據(jù)集中的效果下降。

這可能是我這么久以來這么正經(jīng)的寫R代碼,所以我的注釋特別多,不像我的sas代碼,基本不寫注釋。

1

rm(list=ls())

# 清空緩存數(shù)據(jù)

rpart.installed <- 'rpart' %in% rownames(installed.packages())

if (rpart.installed) {

print("the rpart package is already installed, let's load it...")

}else {

print("let's install the rpart package first...")

install.packages('rpart', dependencies=T)

}

#檢查是否存在rpart包,若沒有就加載

library('rpart')

partykit.installed <- 'partykit' %in% rownames(installed.packages())

if (partykit.installed) {

print("the partykit package is already installed, let's load it...")

}else {

print("let's install the partykit package first...")

install.packages('partykit', dependencies=T)

}

#檢查是否存在partykit包,若沒有就加載

library('grid')

library('partykit')

adabag.installed <- 'adabag' %in% rownames(installed.packages())

if (adabag.installed) {

print("the adabag package is already installed, let's load it...")

}else {

print("let's install the adabag package first...")

install.packages('adabag', dependencies=T)

}

library('adabag')

library('rpart')

library('gplots')

library('ROCR')

# 加載在代碼中需要使用的包

x<-read.csv("alldata_zuhe.csv",header=T);

#讀目標(biāo)數(shù)據(jù),讀取數(shù)據(jù)之前,手動(dòng)加載路徑

D<-as.data.frame(x)

#把x數(shù)據(jù)轉(zhuǎn)成數(shù)據(jù)框

D$APPL_STATUS_1<-as.factor(D$APPL_STATUS_1)

# 把目標(biāo)變量轉(zhuǎn)成因子格式,以防模型擬合的時(shí)候識(shí)別為連續(xù)變量建立回歸樹

# colnames(D)[ncol(D)] <- 'APPL_STATUS_1'

D<-D[-which(names(D) %in% c('APPL_ID'))]

# 剔除掉一些不用進(jìn)入模型的變量

train_ratio <- 0.7

# 設(shè)置訓(xùn)練集以及測試集的比例,這里設(shè)置的是3:7

n_total <- nrow(D)

# 取出原樣本數(shù)據(jù)集的數(shù)量

n_train <- round(train_ratio * n_total)

# 計(jì)算出訓(xùn)練集的數(shù)量

n_test <- n_total - n_train

# 計(jì)算出測試集的數(shù)量

set.seed(42)

# 設(shè)置抽取種子,種子的意義在于當(dāng)取同個(gè)種子的時(shí)候,抽取的樣本一樣。

list_train <- sample(n_total, n_train)

# 利用sample函數(shù)取數(shù)測試集的樣本的行數(shù)

D_train <- D[list_train,]

# 從原樣本中取出訓(xùn)練數(shù)據(jù)

D_test <- D[-list_train,]

# 從原樣本中取出測試集數(shù)據(jù)

y_train <- D_train$APPL_STATUS_1

# 取數(shù)訓(xùn)練集中的因變量,待會(huì)對(duì)模型的評(píng)估需要用到

y_test <- D_test$APPL_STATUS_1

# 取數(shù)測試集中的因變量,待會(huì)對(duì)模型的評(píng)估需要用到

maxdepth <- 3

# 設(shè)置樹的深度,利用rpart.control帶著深度的向量,也可以直接寫上深度,

# 設(shè)置在提升樹過程中的樹的深度

mfinal <- 10

# 設(shè)置樹的數(shù)量

M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,

boos = FALSE, mfinal = mfinal, coeflearn = 'Breiman',

control=rpart.control(maxdepth=maxdepth))

summary(M_AdaBoost1)

# 輸出對(duì)象的M_AdaBoost1的信息,大概是種了幾棵樹,幾個(gè)客戶預(yù)測錯(cuò)了之類的。

M_AdaBoost1$trees

# 看下你種下的十棵樹的大致情況。

M_AdaBoost1$trees[[1]]

# 檢查第一顆樹的情況,你檢查也是看他合不合理,盡管不合理,只要效果好,

# 你還是會(huì)用,畢竟又不是只有一棵樹。

M_AdaBoost1$weights

# 檢查每棵樹的權(quán)重

M_AdaBoost1$importance

# 看下變量的重要性??梢岳眠@個(gè)方法去篩選變量。

errorevol(M_AdaBoost1, D_test)

# 看下誤差的演變

y_test_pred_AdaBoost1 <- predict(M_AdaBoost1, D_test)

# 使用模型預(yù)測測試集的效果。這里輸出有概率也有預(yù)測分類,

# y_test_pred_AdaBoost1是個(gè)list的對(duì)象,跟拒想算的模型評(píng)估量選擇計(jì)算。

accuracy_test_AdaBoost1 <- sum(y_test==y_test_pred_AdaBoost1$class) / n_test

# 計(jì)算正確率,即使用預(yù)測客戶狀態(tài)

msg <- paste0('accuracy_test_AdaBoost1 = ', accuracy_test_AdaBoost1)

print(msg)

# 輸出正確率的結(jié)果

y_train_pred_AdaBoost1 <- predict(M_AdaBoost1, D_train)

# 使用模型預(yù)測訓(xùn)練集的效果

accuracy_train_AdaBoost1 <- sum(y_train==y_train_pred_AdaBoost1$class) / n_train

msg <- paste0('accuracy_train_AdaBoost1 = ', accuracy_train_AdaBoost1)

print(msg)

# 計(jì)算正確率之后,輸出正確率的結(jié)果。

2

# 這個(gè)代碼是為了尋找最優(yōu)的種樹的數(shù)目以及深度,因?yàn)榱朔乐?a href='/map/guonihe/' style='color:#000;font-size:inherit;'>過擬合以及節(jié)省時(shí)間,這里的深度我建議設(shè)置的是2:5

# 樹的數(shù)目大概是10-50課,數(shù)可能多了,但是模型復(fù)雜度也提升了,泛化能力就低了。

library(plyr)

# 加載需要的包

total1<-data.frame()

# 建立一個(gè)空表,待會(huì)這個(gè)表是用來裝結(jié)果的

m <- seq(5, 30, by = 5)

# 設(shè)置樹的數(shù)量,我這里設(shè)置的是從5棵樹開始,到30棵樹,以5為單位。

for (j in m) {

# 循環(huán)樹的數(shù)量

for(i in 3:6){

# 這里設(shè)置深度循環(huán)的數(shù)字,我設(shè)置的3到6

maxdepth <- i

mfinal <- j

M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,boos = FALSE, mfinal = mfinal, coeflearn = 'Breiman',control=rpart.control(maxdepth=maxdepth))

# 設(shè)置參數(shù)之后生成模型

y_test_pred_AdaBoost1 <- predict(M_AdaBoost1, D_test)

# 利用生成的模型預(yù)測測試集

accuracy_test <- sum(D_test$APPL_STATUS_1==y_test_pred_AdaBoost1$class) / length(y_test_pred_AdaBoost1$class)

# 計(jì)算正確率

pred<-prediction(y_test_pred_AdaBoost1$prob[,2],y_test)

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

auc1 <-performance(pred,'auc')@y.values

#計(jì)算AUC值

v = as.vector(unlist(auc1[1]))

# 因?yàn)锳UC值不是一個(gè)向量的格式,但是我后續(xù)需要組成數(shù)據(jù)框,所以在這里轉(zhuǎn)成向量了

ks1 <- max(attr(perf,'y.values')[[1]]-attr(perf,'x.values')[[1]])

#計(jì)算KS

total<-data.frame(auc=v,ks=ks1,accuracy=accuracy_test,maxdepth=i,mfinal=j)

# 將多個(gè)模型評(píng)估指標(biāo)合并變成數(shù)據(jù)框

total1<-rbind(total1,total)

# 縱向合并

print(paste("adaboost-maxdepth:", i))

print(paste("adaboost-mfinal:", j))

# 打印循環(huán)哪一步,以防報(bào)錯(cuò)的時(shí)候可以直達(dá)是哪一步錯(cuò)誤,以及跟蹤進(jìn)度跑到那里了

}

}

結(jié)果跑出看total1這個(gè)數(shù)據(jù)集,圖:

第一列是auc,依次是ks,正確率,設(shè)置的樹的深度,以及種的棵樹??梢愿鶕?jù)這張表選出你認(rèn)為好的深度以及樹的棵樹

3

M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,

boos = FALSE, mfinal = 15, coeflearn = 'Breiman',

control=rpart.control(maxdepth=3))

# 在剛才的adaboost取最優(yōu)參數(shù)取出最優(yōu)的樹以及深度之后,在這里跑出模型之后,用在其他模型上面

# 因?yàn)榧赡P痛蟛糠謺r(shí)候都是一個(gè)類似黑箱子的過程,你是知道幾棵樹,深度多少,但是實(shí)際上,你并不能

# 像邏輯回歸一樣一顆一顆樹去看他合不合理,所以這時(shí)候就需要就檢查他對(duì)其他數(shù)據(jù)是不是也可行,且效果

# 不會(huì)下降太多

library(plyr)

# 加載需要的包

CVgroup <- function(k, datasize, seed) {

cvlist <- list()

set.seed(seed)

n <- rep(1:k, ceiling(datasize/k))[1:datasize]

#將數(shù)據(jù)分成K份,并生成的完整數(shù)據(jù)集n

temp <- sample(n, datasize)

#把n打亂

x <- 1:k

dataseq <- 1:datasize

cvlist <- lapply(x, function(x) dataseq[temp==x])

#dataseq中隨機(jī)生成10個(gè)隨機(jī)有序數(shù)據(jù)列

return(cvlist)

}

cvlist<-CVgroup(10, 10513, 957445)

# 這個(gè)過程第二個(gè)參數(shù)輸入的是你的數(shù)據(jù)集的總數(shù),第三個(gè)是seed種子,第一個(gè)是劃分成幾份。

# cvlist是一個(gè)list,包含十個(gè)樣本,每個(gè)樣本的數(shù)量差不多

data <- D

# 將的原樣本數(shù)據(jù)集賦給data

total1 <- data.frame()

#建立一個(gè)空表存儲(chǔ)預(yù)測結(jié)果

for (i in 1:10) {

# 循環(huán)上面那個(gè)代碼分好的是個(gè)數(shù)據(jù)集

print(i)

test <- data[cvlist[[i]],]

# 取出第i個(gè)數(shù)據(jù)集

y_test<-test$APPL_STATUS_1

# 取出第i個(gè)數(shù)據(jù)集中的因變量

y_test_pred_rf1 <- predict(M_AdaBoost1, test)

# 預(yù)測第i個(gè)數(shù)據(jù)集

accuracy_test <- sum(test$APPL_STATUS_1==y_test_pred_rf1$class) / length(y_test_pred_rf1$class)

# 計(jì)算第i個(gè)數(shù)據(jù)集的正確率

pred<-prediction(y_test_pred_rf1$prob[,2],y_test)

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

auc1 <- performance(pred,'auc')@y.values

v = as.vector(unlist(auc1[1]))

#計(jì)算第i個(gè)數(shù)據(jù)集的AUC值

ks1 <- max(attr(perf,'y.values')[[1]]-attr(perf,'x.values')[[1]]) #計(jì)算KS

#計(jì)算第i個(gè)數(shù)據(jù)集的ks值

total<-data.frame(auc=v,ks=ks1,accuracy=accuracy_test)

# 合并各項(xiàng)參數(shù)

total1<-rbind(total1,total)

# 合并每個(gè)數(shù)據(jù)集的結(jié)果

}

這個(gè)代碼跑完之后看total1,圖:

這就是你選出的模型,將總體數(shù)據(jù)分成十份每一份的ks以及auc,你要是覺得不可靠,可以多循環(huán)幾次種子。要是覺得你選的模型不好,可以回去第二步再選一個(gè)放到第三步的代碼跑。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):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)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(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ù)說明請(qǐng)參見: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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }