當前位置:編程學習大全網 - 編程語言 - R語言之決策樹和隨機森林

R語言之決策樹和隨機森林

R語言之決策樹和隨機森林

總結決策樹之前先總結壹下特征的生成和選擇,因為決策樹就是壹種內嵌型的特征選擇過程,它的特征選擇和算法是融合在壹起的,不需要額外的特征選擇。

壹、特征生成:

特征生成是指在收集數據之時原始數據就具有的數據特征,這些數據特征由收集的數據決定(其實也就是在產品定型時設定的需要收集的數據特征),當然,在數據預處理時,也可以在此基礎上構造壹些新的數據特征,這些特征越多越好,表示妳考慮問題比較周全,具體那些變量有用或沒用,這要交給下壹步特征選擇來決定。

二、特征選擇

特征選擇是指在原有數據特征的基礎上,去除重要性比較低的特征變量,過濾出有用的特征變量。這裏比較困難的是搞清楚什麽樣的特征比較重要?這需要根據具體的問題具體分析,有些變量的選擇可以很直觀的看出來,但這種直覺也不壹定正確。對於常用特征選擇方法主要有:過濾型、包裝型、內嵌型。

過濾型:是指妳可以根據某個統計量的大小排序來選擇特征變量,如相關系數、p值、R值等

包裝型:是指在壹個特征集合中選取最優的特征子集。具體需要考慮:用什麽樣的算法來選取?選取的最優的標準是什麽?

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

向前搜索:每次選取壹個能使模型預測或分類效果最好的特征變量進來,進來後不退出,直到模型改善效果不再明顯;

向後刪除:是指每次從特征全集中每次刪除壹個特征變量能使模型預測或分類效果最好,退出後不進來,直到模型改善效果不再明顯;

雙向搜索:是指每次每次刪除壹個特征變量或加入壹個特征變量能使模型預測或分類效果最好,退出的不進來,進來的不退出,直到模型改善效果不再明顯;

這裏再提壹下特征變量選擇的幾個標準:p值、R值、AIC(越小效果越好)、BIC(越小效果越好)、熵(越小效果越好)

內嵌型:這裏應該主要就是像決策樹這樣的情況,算法內部完成特征變量的選取。

三、決策樹

決策的幾個要點:1、如何決策?(也就是如何樹如何分叉)------熵和信息增益---這裏面包含的就是特征的選擇?哪個特征變量包含的信息量大,就排在前面,至於最後樹的深度就決定特征變量的個數。

當然不同的算法使用的衡量的標準不同,還有:信息增益比、基尼不純系數

2、如何剪枝?-----壹般是事後剪枝

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

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

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

決策樹模型特點:模型易於解釋;存儲空間較小,以樹的形式存儲,決策樹是壹個弱分類器,不能完全分類,需要把多個弱分類器通過多數投票法組合在壹起。

四、R包實現決策樹

library(rpart)

library(rpart.plot)

## rpart.control對樹進行壹些設置

## xval是10折交叉驗證

## minsplit是最小分支節點數,這裏指大於等於20,那麽該節點會繼續分劃下去,否則停止

## minbucket:葉子節點最小樣本數

## maxdepth:樹的深度

## cp全稱為complexity parameter,指某個點的復雜度,對每壹步拆分,模型的擬合優度必須提高的程度

ct <- rpart.control(xval=10, minsplit=20, cp=0.1)

## kyphosis是rpart這個包自帶的數據集

## na.action:缺失數據的處理辦法,默認為刪除因變量缺失的觀測而保留自變量缺失的觀測。

## method:樹的末端數據類型選擇相應的變量分割方法:

## 連續性method=“anova”,離散型method=“class”,計數型method=“poisson”,生存分析型method=“exp”

## parms用來設置三個參數:先驗概率、損失矩陣、分類純度的度量方法(gini和information)

## cost是損失矩陣,在剪枝的時候,葉子節點的加權誤差與父節點的誤差進行比較,考慮損失矩陣的時候,從將“減少-誤差”調整為“減少-損失”

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)

## 第二種,這種會更漂亮壹些:

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決策樹");

## rpart包提供了復雜度損失修剪的修剪方法,printcp會告訴分裂到每壹層,cp是多少,平均相對誤差是多少

## 交叉驗證的估計誤差(“xerror”列),以及標準誤差(“xstd”列),平均相對誤差=xerror±xstd

printcp(fit)

## 通過上面的分析來確定cp的值

##調用CP(complexity parameter)與xerror的相關圖,壹種方法是尋找最小xerror點所對應

#的CP值,並由此CP值決定樹的大小,另壹種方法是利用1SE方法,尋找xerror+SE的最小點對應的CP值。

plotcp(fit)

##利用以下方法進行修剪:

## prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])

fit2 <- prune(fit, cp=0.01)

#利用模型預測

ndata=data.frame(...)

predict(fit,newdata=ndata)

#案例

str(iris)

set.seed(1234)#設置隨機數種子--使每次運行時產生的壹組隨機數相同,便於結果的重現

#抽樣:從iris數據集中隨機抽70%定義為訓練數據集,30%為測試數據集(常用)

#這裏是對行抽樣,ind是壹個只含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

#訓練數據

fit<-rpart(f,trainData)

#預測

re<-predict(fit,testData)

#******************或者用其他包********************

library(party)

#建立決策樹模型預測花的種類

myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

iris_ctree <- ctree(myFormula, data=trainData)

# 查看預測的結果

z<-table(predict(iris_ctree), trainData$Species)

#可以根據以上列聯表求出預測的正確率---評估模型

#計算準確度

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

五、機器集成與隨機森林法則

前面說過,決策樹的壹個特點是:弱分類器,分類不完全,需要利用集成投票的方式來增加精確度和穩健性。

機器集成算法:對於數據集訓練多個模型,對於分類問題,可以采用投票的方法,選擇票數最多的類別作為最終的類別,而對於回歸問題,可以采用取均值的方法,取得的均值作為最終的結果。主要的集成算法有bagging和adaboost算法。

隨機森林:隨機森林就是利用機器集成多個決策樹,主要有兩個參數,壹個是決策樹的個數,壹個是每棵樹的特征變量個數。

隨機森林特點:精確度高、穩健性好,但可解釋性差。(可以知道各個變量的重要性)

R包實現機器集成算法:

#adabag包均有函數實現bagging和adaboost的分類建模

#利用全部數據建模

library(adabag)

a<-boosting(Species~.,data=iris)

z0<-table(iris[,5],predict(a,iris)$class)

#計算誤差率

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

barplot(a$importance)

b<-errorevol(a,iris)#計算全體的誤差演變

plot(b$error,type="l",main="AdaBoost error vs number of trees") #對誤差演變進行畫圖

a<-bagging(Species~.,data=iris)

z0<-table(iris[,5],predict(a,iris)$class)

#計算誤差率

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

barplot(a$importance)

b<-errorevol(a,iris)#計算全體的誤差演變

plot(b$error,type="l",main="AdaBoost error vs number of trees") #對誤差演變進行畫圖

#5折交叉驗證

set.seed(1044) #設定隨機種子

samp=c(sample(1:50,25),sample(51:100,25),sample(101:150,25)) #進行隨機抽樣

a=boosting(Species~.,data=iris[samp,]) #利用訓練集建立adaboost分類模

z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#訓練集結果

z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#測試集結果

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

E1<-(sum(z0)-sum(diag(z0)))/sum(z1)

a=bagging(Species~.,data=iris[samp,]) #利用訓練集建立adaboost分類模

z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#訓練集結果

z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#測試集結果

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

E1<-(sum(z0)-sum(diag(z0)))/sum(z1)

R包實現隨機森林:

#隨機森林法則

library(randomForest)

library(foreign)

data("iris")

#抽樣數據

ind<-sample(2,nrow(iris),replace = TRUE,prob=c(0.7,0.3))

traning<-iris[ind==1,]

testing<-iris[ind==2,]

#訓練數據

rf <- randomForest(Species ~ ., data=traning, ntree=100, proximity=TRUE)

#預測

table(predict(rf),traning$Species)

table(predict(rf,testing),testing$Species)

#查看預測的效果

print(rf)

plot(rf)

#查看重要性

importance(rf)

varImpPlot(rf)

  • 上一篇:為什麽有人說《周易》是宇宙全息論?
  • 下一篇:關於C語言的題目
  • copyright 2024編程學習大全網