
R語言之-caret包應(yīng)用
caret包應(yīng)用之一:數(shù)據(jù)預(yù)處理
在進(jìn)行數(shù)據(jù)挖掘時(shí),我們會(huì)用到R中的很多擴(kuò)展包,各自有不同的函數(shù)和功能。如果能將它們綜合起來應(yīng)用就會(huì)很方便。caret包(Classification
and Regression
Training)就是為了解決分類和回歸問題的數(shù)據(jù)訓(xùn)練而創(chuàng)建的一個(gè)綜合工具包。下面的例子圍繞數(shù)據(jù)挖掘的幾個(gè)核心步驟來說明其應(yīng)用。
本例涉及到的數(shù)據(jù)是一個(gè)醫(yī)學(xué)實(shí)驗(yàn)數(shù)據(jù),載入數(shù)據(jù)之后可以發(fā)現(xiàn)其樣本數(shù)為528,自變量數(shù)為342,mdrrDescr為自變量數(shù)據(jù)框,mdrrClass為因變量。
library(caret)
data(mdrr)
本例的樣本數(shù)據(jù)所涉及到的變量非常多,需要對(duì)變量進(jìn)行初步降維。其中一種需要?jiǎng)h除的變量是常數(shù)自變量,或者是方差極小的自變量,對(duì)應(yīng)的命令是nearZeroVar,可以看到新數(shù)據(jù)集的自變量減少到了297個(gè)。
zerovar=nearZeroVar(mdrrDescr)
newdata1=mdrrDescr[,-zerovar]
另一類需要?jiǎng)h除的是與其它自變量有很強(qiáng)相關(guān)性的變量,對(duì)應(yīng)的命令是findcorrelation。自變量中還有可能存在多重共線性問題,可以用findLinearCombos命令將它們找出來。這樣處理后自變量減少為94個(gè)。
descrCorr = cor(newdata1)
highCorr = findCorrelation(descrCorr, 0.90)
newdata2 = newdata1[, -highCorr]
comboInfo = findLinearCombos(newdata2)
newdata2=newdata2[, -comboInfo$remove]
我們還需要將數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化并補(bǔ)足缺失值,這時(shí)可以用preProcess命令,缺省參數(shù)是標(biāo)準(zhǔn)化數(shù)據(jù),其高級(jí)功能還包括用K近鄰和裝袋決策樹兩種方法來預(yù)測(cè)缺失值。此外它還可以進(jìn)行cox冪變換和主成分提取。
Process = preProcess(newdata2)
newdata3 = predict(Process, newdata2)
最后是用createDataPartition將數(shù)據(jù)進(jìn)行劃分,分成75%的訓(xùn)練樣本和25%檢驗(yàn)樣本,類似的命令還包括了createResample用來進(jìn)行簡(jiǎn)單的自助法抽樣,還有createFolds來生成多重交叉檢驗(yàn)樣本。
inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata3[inTrain,]
testx = newdata3[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]
在建模前還可以對(duì)樣本數(shù)據(jù)進(jìn)行圖形觀察,例如對(duì)前兩個(gè)變量繪制箱線圖
featurePlot(trainx[,1:2],trainy,plot=’box’)
caret包應(yīng)用之二:特征選擇
在進(jìn)行數(shù)據(jù)挖掘時(shí),我們并不需要將所有的自變量用來建模,而是從中選擇若干最重要的變量,這稱為特征選擇(feature
selection)。一種算法就是后向選擇,即先將所有的變量都包括在模型中,然后計(jì)算其效能(如誤差、預(yù)測(cè)精度)和變量重要排序,然后保留最重要的若干變量,再次計(jì)算效能,這樣反復(fù)迭代,找出合適的自變量數(shù)目。這種算法的一個(gè)缺點(diǎn)在于可能會(huì)存在過度擬合,所以需要在此算法外再套上一個(gè)樣本劃分的循環(huán)。在caret包中的rfe命令可以完成這項(xiàng)任務(wù)。
首先定義幾個(gè)整數(shù),程序必須測(cè)試這些數(shù)目的自變量.
subsets = c(20,30,40,50,60,70,80)
然后定義控制參數(shù),functions是確定用什么樣的模型進(jìn)行自變量排序,本例選擇的模型是隨機(jī)森林即rfFuncs,可以選擇的還有l(wèi)mFuncs(線性回歸),nbFuncs(樸素貝葉斯),treebagFuncs(裝袋決策樹),caretFuncs(自定義的訓(xùn)練模型)。
method是確定用什么樣的抽樣方法,本例使用cv即交叉檢驗(yàn), 還有提升boot以及留一交叉檢驗(yàn)LOOCV
ctrl= rfeControl(functions = rfFuncs, method = “cv”,verbose = FALSE, returnResamp = “final”)
最后使用rfe命令進(jìn)行特征選擇,計(jì)算量很大,這得花點(diǎn)時(shí)間
Profile = rfe(newdata3, mdrrClass, sizes = subsets, rfeControl = ctrl)
觀察結(jié)果選擇50個(gè)自變量時(shí),其預(yù)測(cè)精度最高
print(Profile)
Variables Accuracy Kappa AccuracySD KappaSD Selected
20 0.8200 0.6285 0.04072 0.08550
30 0.8200 0.6294 0.04868 0.10102
40 0.8295 0.6487 0.03608 0.07359
50 0.8313 0.6526 0.04257 0.08744 *
60 0.8277 0.6447 0.03477 0.07199
70 0.8276 0.6449 0.04074 0.08353
80 0.8275 0.6449 0.03991 0.08173
94 0.8313 0.6529 0.03899 0.08006
用圖形也可以觀察到同樣結(jié)果
plot(Profile)
特征選擇
下面的命令則可以返回最終保留的自變量
Profile$optVariables
caret包應(yīng)用之三:建模與參數(shù)優(yōu)化
在進(jìn)行建模時(shí),需對(duì)模型的參數(shù)進(jìn)行優(yōu)化,在caret包中其主要函數(shù)命令是train。
首先得到經(jīng)過特征選擇后的樣本數(shù)據(jù),并劃分為訓(xùn)練樣本和檢驗(yàn)樣本
newdata4=newdata3[,Profile$optVariables]
inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata4[inTrain,]
testx = newdata4[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]
然后定義模型訓(xùn)練參數(shù),method確定多次交叉檢驗(yàn)的抽樣方法,number確定了劃分的重?cái)?shù), repeats確定了反復(fù)次數(shù)。
fitControl = trainControl(method = “repeatedcv”, number = 10, repeats = 3,returnResamp = “all”)
確定參數(shù)選擇范圍,本例建模準(zhǔn)備使用gbm算法,相應(yīng)的參數(shù)有如下四項(xiàng)
gbmGrid = expand.grid(.interaction.depth = c(1, 3),.n.trees = c(50,
100, 150, 200, 250, 300),.shrinkage = 0.1,.n.minobsinnode = 10)
利用train函數(shù)進(jìn)行訓(xùn)練,使用的建模方法為提升決策樹方法,
gbmFit1 = train(trainx,trainy,method = “gbm”,trControl = fitControl,tuneGrid = gbmGrid,verbose = FALSE)
從結(jié)果可以觀察到interaction.depth取1,n.trees取150時(shí)精度最高
interaction.depth n.trees Accuracy Kappa Accuracy SD Kappa SD
1 50 0.822 0.635 0.0577 0.118
1 100 0.824 0.639 0.0574 0.118
1 150 0.826 0.643 0.0635 0.131
1 200 0.824 0.64 0.0605 0.123
1 250 0.816 0.623 0.0608 0.124
1 300 0.824 0.64 0.0584 0.119
3 50 0.816 0.621 0.0569 0.117
3 100 0.82 0.631 0.0578 0.117
3 150 0.815 0.621 0.0582 0.117
3 200 0.82 0.63 0.0618 0.125
3 250 0.813 0.617 0.0632 0.127
3 300 0.812 0.615 0.0622 0.126
同樣的圖形觀察
plot(gbmFit1)
caret包應(yīng)用之四:模型預(yù)測(cè)與檢驗(yàn)
模型建立好后,我們可以利用predict函數(shù)進(jìn)行預(yù)測(cè),例如預(yù)測(cè)檢測(cè)樣本的前五個(gè)
predict(gbmFit1, newdata = testx)[1:5]
為了比較不同的模型,還可用裝袋決策樹建立第二個(gè)模型,命名為gbmFit2
gbmFit2= train(trainx, trainy,method = “treebag”,trControl = fitControl)
models = list(gbmFit1, gbmFit2)
另一種得到預(yù)測(cè)結(jié)果的方法是使用extractPrediction函數(shù),得到的部分結(jié)果如下顯示
predValues = extractPrediction(models,testX = testx, testY = testy)
head(predValues)
obs pred model dataType object
1 Active Active gbm Training Object1
2 Active Active gbm Training Object1
3 Active Inactive gbm Training Object1
4 Active Active gbm Training Object1
5 Active Active gbm Training Object1
從中可提取檢驗(yàn)樣本的預(yù)測(cè)結(jié)果
testValues = subset(predValues, dataType == “Test”)
如果要得到預(yù)測(cè)概率,則使用extractProb函數(shù)
probValues = extractProb(models,testX = testx, testY = testy)
testProbs = subset(probValues, dataType == “Test”)
對(duì)于分類問題的效能檢驗(yàn),最重要的是觀察預(yù)測(cè)結(jié)果的混淆矩陣
Pred1 = subset(testValues, model == “gbm”)
Pred2 = subset(testValues, model == “treebag”)
confusionMatrix(Pred1$pred, Pred1$obs)
confusionMatrix(Pred2$pred, Pred2$obs)
結(jié)果如下,可見第一個(gè)模型在準(zhǔn)確率要比第二個(gè)模型略好一些
Reference
Prediction Active Inactive
Active 65 12
Inactive 9 45
Accuracy : 0.8397
Reference
Prediction Active Inactive
Active 63 12
Inactive 11 45
Accuracy : 0.8244
最后是利用ROCR包來繪制ROC圖
prob1 = subset(testProbs, model == “gbm”)
prob2 = subset(testProbs, model == “treebag”)
library(ROCR)
prob1$lable=ifelse(prob1$obs==’Active’,yes=1,0)
pred1 = prediction(prob1$Active,prob1$lable)
perf1 = performance(pred1, measure=”tpr”, x.measure=”fpr” )
plot( perf1 )
數(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)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、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 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 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ù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 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è)操盤手 表格結(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)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(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ù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(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)景中,聚類分析作為 “無監(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