
我是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
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ū)動(dòng)決策的時(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ù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(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干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(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ì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
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)對(duì)策略? 長短期記憶網(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è)洞察市場動(dòng)態(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ū)動(dòng)力,數(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ū)動(dòng)力,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