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

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀R語(yǔ)言之決策樹(shù)和隨機(jī)森林
R語(yǔ)言之決策樹(shù)和隨機(jī)森林
2018-06-16
收藏

R語(yǔ)言決策樹(shù)隨機(jī)森林

總結(jié)決策樹(shù)之前先總結(jié)一下特征的生成和選擇,因?yàn)?a href='/map/jueceshu/' style='color:#000;font-size:inherit;'>決策樹(shù)就是一種內(nèi)嵌型的特征選擇過(guò)程,它的特征選擇和算法是融合在一起的,不需要額外的特征選擇。

一、特征生成:

特征生成是指在收集數(shù)據(jù)之時(shí)原始數(shù)據(jù)就具有的數(shù)據(jù)特征,這些數(shù)據(jù)特征由收集的數(shù)據(jù)決定(其實(shí)也就是在產(chǎn)品定型時(shí)設(shè)定的需要收集的數(shù)據(jù)特征),當(dāng)然,在數(shù)據(jù)預(yù)處理時(shí),也可以在此基礎(chǔ)上構(gòu)造一些新的數(shù)據(jù)特征,這些特征越多越好,表示你考慮問(wèn)題比較周全,具體那些變量有用或沒(méi)用,這要交給下一步特征選擇來(lái)決定。

二、特征選擇

特征選擇是指在原有數(shù)據(jù)特征的基礎(chǔ)上,去除重要性比較低的特征變量,過(guò)濾出有用的特征變量。這里比較困難的是搞清楚什么樣的特征比較重要?這需要根據(jù)具體的問(wèn)題具體分析,有些變量的選擇可以很直觀的看出來(lái),但這種直覺(jué)也不一定正確。對(duì)于常用特征選擇方法主要有:過(guò)濾型、包裝型、內(nèi)嵌型。

過(guò)濾型:是指你可以根據(jù)某個(gè)統(tǒng)計(jì)量的大小排序來(lái)選擇特征變量,如相關(guān)系數(shù)、p值、R值等

包裝型:是指在一個(gè)特征集合中選取最優(yōu)的特征子集。具體需要考慮:用什么樣的算法來(lái)選?。窟x取的最優(yōu)的標(biāo)準(zhǔn)是什么?

常用的算法是分步回歸包括向前搜索、向后刪除、雙向搜索

向前搜索:每次選取一個(gè)能使模型預(yù)測(cè)或分類效果最好的特征變量進(jìn)來(lái),進(jìn)來(lái)后不退出,直到模型改善效果不再明顯;

向后刪除:是指每次從特征全集中每次刪除一個(gè)特征變量能使模型預(yù)測(cè)或分類效果最好,退出后不進(jìn)來(lái),直到模型改善效果不再明顯;

雙向搜索:是指每次每次刪除一個(gè)特征變量或加入一個(gè)特征變量能使模型預(yù)測(cè)或分類效果最好,退出的不進(jìn)來(lái),進(jìn)來(lái)的不退出,直到模型改善效果不再明顯;

這里再提一下特征變量選擇的幾個(gè)標(biāo)準(zhǔn):p值、R值、AIC(越小效果越好)、BIC(越小效果越好)、熵(越小效果越好)

內(nèi)嵌型:這里應(yīng)該主要就是像決策樹(shù)這樣的情況,算法內(nèi)部完成特征變量的選取。

三、決策樹(shù)

決策的幾個(gè)要點(diǎn):1、如何決策?(也就是如何樹(shù)如何分叉)------熵和信息增益---這里面包含的就是特征的選擇?哪個(gè)特征變量包含的信息量大,就排在前面,至于最后樹(shù)的深度就決定特征變量的個(gè)數(shù)。

當(dāng)然不同的算法使用的衡量的標(biāo)準(zhǔn)不同,還有:信息增益比、基尼不純系數(shù)

2、如何剪枝?-----一般是事后剪枝

3、連續(xù)性變量如何離散化?-----閾值的選擇

熵:是指信息的混合程度(混亂程度),熵【0-1】越大表示該集合中混合的信息越多,也就表明這次的分叉效果不好還是有很多不同類的信息混在一起

信息增益:熵值的減少量,越大越好

決策樹(shù)模型特點(diǎn):模型易于解釋;存儲(chǔ)空間較小,以樹(shù)的形式存儲(chǔ),決策樹(shù)是一個(gè)弱分類器,不能完全分類,需要把多個(gè)弱分類器通過(guò)多數(shù)投票法組合在一起。

四、R包實(shí)現(xiàn)決策樹(shù)

library(rpart)

library(rpart.plot)

## rpart.control對(duì)樹(shù)進(jìn)行一些設(shè)置

## xval是10折交叉驗(yàn)證
## minsplit是最小分支節(jié)點(diǎn)數(shù),這里指大于等于20,那么該節(jié)點(diǎn)會(huì)繼續(xù)分劃下去,否則停止
## minbucket:葉子節(jié)點(diǎn)最小樣本數(shù)
## maxdepth:樹(shù)的深度
## cp全稱為complexity parameter,指某個(gè)點(diǎn)的復(fù)雜度,對(duì)每一步拆分,模型的擬合優(yōu)度必須提高的程度
ct <- rpart.control(xval=10, minsplit=20, cp=0.1)
## kyphosis是rpart這個(gè)包自帶的數(shù)據(jù)集
## na.action:缺失數(shù)據(jù)的處理辦法,默認(rèn)為刪除因變量缺失的觀測(cè)而保留自變量缺失的觀測(cè)。         
## method:樹(shù)的末端數(shù)據(jù)類型選擇相應(yīng)的變量分割方法:
## 連續(xù)性method=“anova”,離散型method=“class”,計(jì)數(shù)型method=“poisson”,生存分析型method=“exp”
## parms用來(lái)設(shè)置三個(gè)參數(shù):先驗(yàn)概率、損失矩陣、分類純度的度量方法(gini和information)
## cost是損失矩陣,在剪枝的時(shí)候,葉子節(jié)點(diǎn)的加權(quán)誤差與父節(jié)點(diǎn)的誤差進(jìn)行比較,考慮損失矩陣的時(shí)候,從將“減少-誤差”調(diào)整為“減少-損失”
data("Kyphosis")
fit <- rpart(Kyphosis~Age + Number + Start,data=kyphosis, method="class",control=ct,parms = list(prior = c(0.65,0.35), split = "information"));
## 作圖有2種方法
## 第一種:
par(mfrow=c(1,3));plot(fit); text(fit,use.n=T,all=T,cex=0.9)
## 第二種,這種會(huì)更漂亮一些:
rpart.plot(fit, branch=1, branch.type=2, type=1, extra=102,
           shadow.col="gray", box.col="green",
           border.col="blue", split.col="red",
           split.cex=1.2, main="Kyphosis決策樹(shù)");

## rpart包提供了復(fù)雜度損失修剪的修剪方法,printcp會(huì)告訴分裂到每一層,cp是多少,平均相對(duì)誤差是多少
## 交叉驗(yàn)證的估計(jì)誤差(“xerror”列),以及標(biāo)準(zhǔn)誤差(“xstd”列),平均相對(duì)誤差=xerror±xstd
printcp(fit)
## 通過(guò)上面的分析來(lái)確定cp的值
##調(diào)用CP(complexity parameter)與xerror的相關(guān)圖,一種方法是尋找最小xerror點(diǎn)所對(duì)應(yīng)
#的CP值,并由此CP值決定樹(shù)的大小,另一種方法是利用1SE方法,尋找xerror+SE的最小點(diǎn)對(duì)應(yīng)的CP值。
plotcp(fit)
##利用以下方法進(jìn)行修剪:
## prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
fit2 <- prune(fit, cp=0.01)

#利用模型預(yù)測(cè)
ndata=data.frame(...) 
predict(fit,newdata=ndata) 

#案例
str(iris)
set.seed(1234)#設(shè)置隨機(jī)數(shù)種子--使每次運(yùn)行時(shí)產(chǎn)生的一組隨機(jī)數(shù)相同,便于結(jié)果的重現(xiàn)
#抽樣:從iris數(shù)據(jù)集中隨機(jī)抽70%定義為訓(xùn)練數(shù)據(jù)集,30%為測(cè)試數(shù)據(jù)集(常用)
#這里是對(duì)行抽樣,ind是一個(gè)只含1和2的向量
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))
trainData <- iris[ind==1,]
testData <- iris[ind==2,]
f<-Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

#訓(xùn)練數(shù)據(jù)
fit<-rpart(f,trainData)

#預(yù)測(cè)

re<-predict(fit,testData)

#******************或者用其他包********************
library(party)
#建立決策樹(shù)模型預(yù)測(cè)花的種類
myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormula, data=trainData)
# 查看預(yù)測(cè)的結(jié)果
z<-table(predict(iris_ctree), trainData$Species)
#可以根據(jù)以上列聯(lián)表求出預(yù)測(cè)的正確率---評(píng)估模型

#計(jì)算準(zhǔn)確度

q<-sum(diag(z))/sum(z)

五、機(jī)器集成與隨機(jī)森林法則

前面說(shuō)過(guò),決策樹(shù)的一個(gè)特點(diǎn)是:弱分類器,分類不完全,需要利用集成投票的方式來(lái)增加精確度和穩(wěn)健性。

機(jī)器集成算法:對(duì)于數(shù)據(jù)集訓(xùn)練多個(gè)模型,對(duì)于分類問(wèn)題,可以采用投票的方法,選擇票數(shù)最多的類別作為最終的類別,而對(duì)于回歸問(wèn)題,可以采用取均值的方法,取得的均值作為最終的結(jié)果。主要的集成算法有bagging和adaboost算法。

隨機(jī)森林隨機(jī)森林就是利用機(jī)器集成多個(gè)決策樹(shù),主要有兩個(gè)參數(shù),一個(gè)是決策樹(shù)的個(gè)數(shù),一個(gè)是每棵樹(shù)的特征變量個(gè)數(shù)。

隨機(jī)森林特點(diǎn):精確度高、穩(wěn)健性好,但可解釋性差。(可以知道各個(gè)變量的重要性)

R包實(shí)現(xiàn)機(jī)器集成算法

#adabag包均有函數(shù)實(shí)現(xiàn)bagging和adaboost的分類建模
#利用全部數(shù)據(jù)建模
library(adabag)
a<-boosting(Species~.,data=iris)
z0<-table(iris[,5],predict(a,iris)$class)
#計(jì)算誤差率
E0<-(sum(z0)-sum(diag(z0)))/sum(z0)
barplot(a$importance)
b<-errorevol(a,iris)#計(jì)算全體的誤差演變
plot(b$error,type="l",main="AdaBoost error vs number of trees") #對(duì)誤差演變進(jìn)行畫(huà)圖


a<-bagging(Species~.,data=iris)
z0<-table(iris[,5],predict(a,iris)$class)
#計(jì)算誤差率
E0<-(sum(z0)-sum(diag(z0)))/sum(z0)
barplot(a$importance)
b<-errorevol(a,iris)#計(jì)算全體的誤差演變
plot(b$error,type="l",main="AdaBoost error vs number of trees") #對(duì)誤差演變進(jìn)行畫(huà)圖


#5折交叉驗(yàn)證
set.seed(1044)  #設(shè)定隨機(jī)種子
samp=c(sample(1:50,25),sample(51:100,25),sample(101:150,25)) #進(jìn)行隨機(jī)抽樣
a=boosting(Species~.,data=iris[samp,]) #利用訓(xùn)練集建立adaboost分類模
z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#訓(xùn)練集結(jié)果
z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#測(cè)試集結(jié)果
E0<-(sum(z0)-sum(diag(z0)))/sum(z0)
E1<-(sum(z0)-sum(diag(z0)))/sum(z1)

a=bagging(Species~.,data=iris[samp,]) #利用訓(xùn)練集建立adaboost分類模
z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#訓(xùn)練集結(jié)果
z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#測(cè)試集結(jié)果
E0<-(sum(z0)-sum(diag(z0)))/sum(z0)
E1<-(sum(z0)-sum(diag(z0)))/sum(z1)


R包實(shí)現(xiàn)隨機(jī)森林

#隨機(jī)森林法則
library(randomForest)
library(foreign)
data("iris")

#抽樣數(shù)據(jù)
ind<-sample(2,nrow(iris),replace = TRUE,prob=c(0.7,0.3))
traning<-iris[ind==1,]
testing<-iris[ind==2,]

#訓(xùn)練數(shù)據(jù)
rf <- randomForest(Species ~ ., data=traning, ntree=100, proximity=TRUE)

#預(yù)測(cè)
table(predict(rf),traning$Species)
table(predict(rf,testing),testing$Species)

#查看預(yù)測(cè)的效果
print(rf)
plot(rf)

#查看重要性
importance(rf)
varImpPlot(rf)


數(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)檢測(cè)極驗(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ù)說(shuō)明請(qǐng)參見(jiàn):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); }