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

熱線電話:13121318867

登錄
首頁精彩閱讀R語言實現(xiàn)決策樹算法
R語言實現(xiàn)決策樹算法
2018-06-11
收藏

R語言實現(xiàn)決策樹算法

決策樹算法的R實現(xiàn)
根據(jù)ppvk上的文章《基于 R 語言和 SPSS 的決策樹算法介紹及應(yīng)用》,只簡單跑了關(guān)于R部分的代碼,實驗成功,簡單記錄下。
    決策樹算法簡介
    R語言實現(xiàn)
決策樹算法
決策樹算法是一種典型的分類方法,首先對數(shù)據(jù)進(jìn)行處理,利用歸納算法生成可讀的規(guī)則和決策樹,然后使用決策對新數(shù)據(jù)進(jìn)行分析。本質(zhì)上決策樹是通過一系列規(guī)則對數(shù)據(jù)進(jìn)行分類的過程。
一個簡單的決策樹示例(圖片來源網(wǎng)絡(luò)):

決策樹由節(jié)點和有向邊組成,內(nèi)部節(jié)點代表了特征屬性,外部節(jié)點(葉子節(jié)點)代表了類別,根據(jù)一步步地屬性分類可以將整個特征空間進(jìn)行劃分,從而區(qū)別出不同的分類樣本。好的決策樹不僅對訓(xùn)練樣本有著很好的分類效果,對于測試集也有著較低的誤差率。
數(shù)據(jù)集純度函數(shù)

信息增益
信息熵表示的是不確定度。均勻分布時,不確定度最大,此時熵就最大。當(dāng)選擇某個特征對數(shù)據(jù)集進(jìn)行分類時,分類后的數(shù)據(jù)集信息熵會比分類前的小,其差值表示為信息增益。
假設(shè)在樣本數(shù)據(jù)集 D 中,混有 c 種類別的數(shù)據(jù)。構(gòu)建決策樹時,根據(jù)給定的樣本數(shù)據(jù)集選擇某個特征值作為樹的節(jié)點。
在數(shù)據(jù)集中,可以計算出該數(shù)據(jù)中的信息熵:其中 D 表示訓(xùn)練數(shù)據(jù)集,c 表示數(shù)據(jù)類別數(shù),Pi 表示類別 i 樣本數(shù)量占所有樣本的比例。
作用前的信息熵公式

對應(yīng)數(shù)據(jù)集 D,選擇特征 A 作為決策樹判斷節(jié)點時,在特征 A 作用后的信息熵的為 Info(D),其中 k 表示樣本 D 被分為 k 個部分。


信息增益表示數(shù)據(jù)集 D 在特征 A 的作用后,其信息熵減少的值
Gain\left ( A \right )=Info\left ( D \right ) - Info_{A}\left ( D \right )
對于決策樹節(jié)點最合適的特征選擇,就是 Gain(A) 值最大的特征。

基尼指數(shù)

對于給定的樣本集合D, c 表示數(shù)據(jù)集中類別的數(shù)量,Pi 表示類別 i 樣


選取的屬性為 A,那么分裂后的數(shù)據(jù)集 D 的基尼指數(shù)的計算公式,其中 k 表示樣本 D 被分為 k 個部分,數(shù)據(jù)集 D 分裂成為 k 個 Dj 數(shù)據(jù)集。


對于特征選取,需要選擇最小的分裂后的基尼指數(shù)。也可以用基尼指數(shù)增益值作為決策樹選擇特征的依據(jù)

R語言實現(xiàn)決策樹算法
實現(xiàn)決策樹算法之前首先確保自己已經(jīng)安裝了所需相應(yīng)的語言包。安裝方法有兩種。
方法一:使用 install.packages( ) ,括號內(nèi)填寫要安裝的包。例如
install.packages("rpart")
方法二:自己在官網(wǎng)下載好語言包,手動安裝。使用方法一安裝時,如果自己安裝的R的版本過低,而R在執(zhí)行 install.packages( )命令時,會自動下載最新版本,可能與計算機(jī)上安裝的R的版本不符合,導(dǎo)致運行不成功等問題,這時需要自己去官網(wǎng)上下載與本機(jī)上R版本相符的語言包進(jìn)行安裝。安裝方法如下:

點擊按鍵,彈出頁面

點擊browse,瀏覽你所保存的r語言包,選中后,點擊install,即可安裝。

使用rpart包

# 導(dǎo)入構(gòu)建決策樹所需要的庫   
library("rpart")
library("rpart.plot")
library("survival")
#--------------------------------------------------------------------------#
# A查看本次構(gòu)建決策樹所用的數(shù)據(jù)源  stagec
stagec
# 通過 rpart 函數(shù)構(gòu)建決策樹
fit <- rpart(Surv(pgtime,pgstat)~age+eet+g2+grade+gleason+ploidy,stagec,method="exp")
# 查看決策樹的具體信息
print(fit)
printcp(fit)
# 繪制構(gòu)建完的決策樹
plot(fit, uniform=T, branch=0.6, compress=T)
text(fit, use.n=T)
# 通過 prune 函數(shù)剪枝
fit2 <- prune(fit, cp=0.016)
# 繪制剪枝完后的決策樹
plot(fit2, uniform=T, branch=0.6, compress=T)
text(fit2, use.n=T)

#-------------------------------------------------------------------------#
#B(rpart包)使用TH.data包中的bodyfat數(shù)據(jù)集
str(TH.data::bodyfat)
dim(TH.data::bodyfat)
head(TH.data::bodyfat)
# 分別選取訓(xùn)練樣本(70%)和測試樣本(30%)
 set.seed(1234)
 indexa <- sample(2,nrow(TH.data::bodyfat),replace = TRUE,prob=c(0.7,0.3))
 bodyfat_train <- TH.data::bodyfat[indexa==1,]
 bodyfat_test <- TH.data::bodyfat[indexa==2,]
# 使用age、waistcirc等五個變量進(jìn)行決策樹分類
myFormulaa <- DEXfat ~ age + waistcirc + hipcirc + elbowbreadth + kneebreadth
# minsplit為最小分支節(jié)點數(shù)
bodyfat_rpart <- rpart(myFormulaa, data = bodyfat_train,  control = rpart.control(minsplit = 10))
# cptable: a matrix of information on the optimal prunings based on a complexity parameter.
 print(bodyfat_rpart$cptable)
 # 輸出具體的決策樹模型結(jié)果
 bodyfat_rpart
 # 可視化展示
 rpart.plot::rpart.plot(bodyfat_rpart)
 # 對決策樹進(jìn)行剪枝處理(prune),防止過度擬合
 opt <- which.min(bodyfat_rpart$cptable[,"xerror"])
 cp <- bodyfat_rpart$cptable[opt, "CP"]
 bodyfat_prune <- prune(bodyfat_rpart, cp = cp)
 plot(bodyfat_prune)
 text(bodyfat_prune,use.n=T)
 # 使用調(diào)整過后的決策樹進(jìn)行預(yù)測
 DEXfat_pred <- predict(bodyfat_prune, newdata=bodyfat_test)
 xlim <- range(TH.data::bodyfat$DEXfat)
 plot(DEXfat_pred ~ DEXfat, data=bodyfat_test, xlab="Observed", ylab="Predicted", ylim=xlim, xlim=xlim)
 # 為圖形添加回歸線,點的分布越靠近該線,則表示使用算法預(yù)測的精度越高
 abline(a=0,b=1)
使用party包

# 載入所用的包,使用ctree()函數(shù)
library(party)
#本次構(gòu)建決策樹所用的數(shù)據(jù)源 iris
str(iris)
set.seed(1234)
#分別選取訓(xùn)練樣本(70%)和測試樣本(30%)
indexb <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7,0.3))
traindata <- iris[indexb == 1,]
testdata <- iris[indexb == 2,]
# 構(gòu)建模型
myFormulab <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormulab, data=traindata)
# 決策樹模型的判斷結(jié)果
table(predict(iris_ctree), traindata$Species)
# 輸出具體的決策樹模型結(jié)果
print(iris_ctree)
# 可視化展示
plot(iris_ctree)
plot(iris_ctree,type='simple')
# predict on test data
testpred <- predict(iris_ctree,newdata=testdata)
table(testpred,testdata$Species)

數(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)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(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){ //倒計時完成 $(".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); }