在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

KNN算法、分類(lèi)回歸樹(shù)、隨機(jī)森林的優(yōu)缺點(diǎn)及應(yīng)用實(shí)例

新機(jī)器視覺(jué) ? 來(lái)源:新機(jī)器視覺(jué) ? 作者:新機(jī)器視覺(jué) ? 2022-11-11 10:11 ? 次閱讀

原理

KNN屬于一種監(jiān)督學(xué)習(xí)的分類(lèi)算法,用于訓(xùn)練的數(shù)據(jù)集是完全正確且已分好類(lèi)的。

如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類(lèi)別,則該樣本也屬于這個(gè)類(lèi)別。KNN算法的指導(dǎo)思想是“近朱者赤,近墨者黑”,由鄰居來(lái)推斷出類(lèi)別。

「計(jì)算步驟如下:」

算距離:給定測(cè)試對(duì)象,計(jì)算它與訓(xùn)練集中的每個(gè)對(duì)象的距離。包括閔可夫斯基距離、歐氏距離、絕對(duì)距離、切比雪夫距離、夾角余弦距離;

找鄰居:圈定距離最近的k個(gè)訓(xùn)練對(duì)象,作為測(cè)試對(duì)象的近鄰;

做分類(lèi):根據(jù)這k個(gè)近鄰歸屬的主要類(lèi)別,來(lái)對(duì)測(cè)試對(duì)象分類(lèi)

「K的含義」:來(lái)了一個(gè)樣本x,要給它分類(lèi),即求出它的y,就從數(shù)據(jù)集中,在x附近找離它最近的K個(gè)數(shù)據(jù)點(diǎn),這K個(gè)數(shù)據(jù)點(diǎn),類(lèi)別c占的個(gè)數(shù)最多,就把x的label設(shè)為c。K-近鄰法中的鄰近個(gè)數(shù),即K的確定,是該方法的關(guān)鍵。

「優(yōu)點(diǎn):」

簡(jiǎn)單,易于理解,易于實(shí)現(xiàn),無(wú)需估計(jì)參數(shù),無(wú)需訓(xùn)練;

特別適合于多分類(lèi)問(wèn)題(對(duì)象具有多個(gè)類(lèi)別標(biāo)簽)。

「缺點(diǎn):」

主要的不足:當(dāng)樣本不平衡時(shí),如一個(gè)類(lèi)的 樣本容量很大,而其他類(lèi)樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的K個(gè)鄰居中大容量類(lèi)的樣本占多數(shù)。該算法只計(jì)算“最近的”鄰居樣本,某一類(lèi)的樣本數(shù)量很大,那么或者這類(lèi)樣本并不接近目標(biāo)樣本,或者這類(lèi)樣本很靠近目標(biāo)樣本。

計(jì)算量較大,因?yàn)閷?duì)每一個(gè)待分類(lèi)的文本都要計(jì)算它到全體已知樣本的距離,才能求得它的K個(gè)最近鄰點(diǎn)。

可理解性差,無(wú)法給出像決策樹(shù)那樣的規(guī)則。

R 進(jìn)行 KNN 的實(shí)例

#簡(jiǎn)單示范,以iris數(shù)據(jù)集為例
train<-?iris[sample(nrow(iris),?145),]?#?訓(xùn)練數(shù)據(jù)
test?<-?iris[sample(nrow(iris),?5),]?#?測(cè)試數(shù)據(jù)
head(test)
library(class)
aa?<-?knn(train?=?train[,1:4],?test?=?test[,1:4],?
??????????cl?=?train[,5],?k?=?5)
aa
table(test[,5],?aa)

輸出結(jié)果:

> head(test)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
117          6.5         3.0          5.5         1.8 virginica
135          6.1         2.6          5.6         1.4 virginica
44           5.0         3.5          1.6         0.6    setosa
18           5.1         3.5          1.4         0.3    setosa
43           4.4         3.2          1.3         0.2    setosa
> table(test[,5], aa)
            aa
             setosa versicolor virginica
  setosa          3          0         0
  versicolor      0          0         0
  virginica       0          0         2

「隨機(jī)數(shù)據(jù)進(jìn)行KNN分類(lèi):」

#data
set.seed(12345)
x1<-?runif(60,-1,1)
x2?<-?runif(60,-1,1)??
y?<-?sample(c(0,1),size=60,replace=TRUE,prob=c(0.3,0.7))???
Data?<-?data.frame(Fx1=x1,Fx2=x2,Fy=y)??
SampleId?<-?sample(x=1:60,size=18)??
DataTest?<-?Data[SampleId,]???#?測(cè)試集
DataTrain?<-?Data[-SampleId,]??#?訓(xùn)練集

par(mfrow=c(2,2),mar=c(4,6,4,4))
plot(Data[,1:2],pch=Data[,3]+1,cex=0.8,xlab="x1",ylab="x2",main="全部樣本")
plot(DataTrain[,1:2],pch=DataTrain[,3]+1,cex=0.8,xlab="x1",ylab="x2",main="訓(xùn)練樣本和測(cè)試樣本")
points(DataTest[,1:2],pch=DataTest[,3]+16,col=2,cex=0.8)

#?KNN?分類(lèi)
library(class)
#?循環(huán)計(jì)算不同K時(shí)的錯(cuò)誤率
##?測(cè)試集與訓(xùn)練集均為Data時(shí),會(huì)出現(xiàn)過(guò)擬合,錯(cuò)誤率會(huì)很低
errRatio?<-?vector()??#?全部觀測(cè)的錯(cuò)判率向量
for(i?in?1:30){
??KnnFit=knn(train=Data[,1:2],test=Data[,1:2],cl=Data[,3],k=i)
??CT=table(Data[,3],KnnFit)??#?計(jì)算混淆矩陣
??errRatio=c(errRatio,(1-sum(diag(CT))/sum(CT))*100)??#?計(jì)算錯(cuò)判率(百分比)
}
plot(errRatio,type="l",xlab="鄰近個(gè)數(shù)K",ylab="錯(cuò)判率(%)",main="ErrorRatio",ylim=c(0,80))
#?訓(xùn)練集與測(cè)試集單獨(dú)分開(kāi)
errRatio1?<-?vector()???#?測(cè)試樣本錯(cuò)判率向量(旁置法)
for(i?in?1:30){
?KnnFit=knn(train=DataTrain[,1:2],test=DataTest[,1:2],cl=DataTrain[,3],k=i)?
?CT=table(DataTest[,3],KnnFit)?
?errRatio1=c(errRatio1,(1-sum(diag(CT))/sum(CT))*100)????
}
lines(1:30,errRatio1,lty=2,col=2)??#?隨著樣本數(shù)增加,錯(cuò)誤率趨于穩(wěn)定

#?使用另一個(gè)函數(shù)?knn.cv(),在不指定測(cè)試集的情況下默認(rèn)使用訓(xùn)練集
#?該函數(shù)使用留一法交叉驗(yàn)證方法,與?knn?有區(qū)別,適用于樣本量少的情況
errRatio2<-vector()???#?留一法錯(cuò)判率向量
for(i?in?1:30){???
?KnnFit<-knn.cv(train=Data[,1:2],cl=Data[,3],k=i)?
?CT<-table(Data[,3],KnnFit)??
?errRatio2<-c(errRatio2,(1-sum(diag(CT))/sum(CT))*100)?????
}
lines(1:30,errRatio2,col=2)

#?KNN?回歸
set.seed(12345)
x1?<-?runif(60,-1,1)?
x2?<-?runif(60,-1,1)?
y?<-?runif(60,10,20)???
Data?<-?data.frame(Fx1=x1,Fx2=x2,Fy=y)
SampleId?<-?sample(x=1:60,size=18)??
DataTest?<-?Data[SampleId,]??
DataTrain?<-?Data[-SampleId,]??
mseVector?<-?vector()????
for(i?in?1:30){
?KnnFit<-knn(train=DataTrain[,1:2],test=DataTest[,1:2],cl=DataTrain[,3],k=i,prob=FALSE)?
?#?回歸結(jié)果為因子向量,需轉(zhuǎn)換成數(shù)值型向量
?KnnFit<-as.double(as.vector(KnnFit))???
?mse<-sum((DataTest[,3]-KnnFit)^2)/length(DataTest[,3])???
?mseVector<-c(mseVector,mse)
}
plot(mseVector,type="l",xlab="近鄰個(gè)數(shù)?K",ylab="均方誤差",main="近鄰數(shù)K與均方誤差",ylim=c(0,80))

5cc8fd0a-6105-11ed-8abf-dac502259ad0.png

上圖中,第一幅圖為觀測(cè)全體在特征空間中的分布,三角和圈分別表示輸出變量的類(lèi)別值分別為0和1;第二幅圖是訓(xùn)練樣本集和測(cè)試樣本集的觀測(cè)分布,其中有填充色的點(diǎn)屬于測(cè)試樣本集;

第三幅圖黑線為全部觀測(cè)進(jìn)入訓(xùn)練樣本集時(shí)的錯(cuò)判概率線,K=1時(shí)預(yù)測(cè)錯(cuò)誤率一般為0;紅色虛線為旁置法的錯(cuò)判概率曲線,K=9時(shí)達(dá)到最小;紅色實(shí)線為留一法錯(cuò)判概率曲線,K=7時(shí)達(dá)到最小。「留一法的曲線基本在旁置法下方,應(yīng)是較為客觀的預(yù)測(cè)錯(cuò)誤估計(jì)」。第四幅圖是回歸預(yù)測(cè)時(shí)測(cè)試樣本集的均方誤差隨參數(shù)K變化的曲線。

KNN應(yīng)用——天貓數(shù)據(jù)集

5d086c38-6105-11ed-8abf-dac502259ad0.png

library(class)
Tmall_train<-read.table(file="天貓_Train_1.txt",header=TRUE,sep=",")
head(Tmall_train)
#???BuyOrNot?BuyDNactDN?ActDNTotalDN?BuyBBrand?BuyHit
#?1????????1???????6.38????????51.09??????2.83???1.57
#?2????????1???????8.93????????60.87??????3.20???2.17
#?3????????1??????16.13????????33.70?????11.63???6.36
#?4????????1??????16.22????????40.22?????11.29???6.25
#?5????????1???????3.85????????56.52??????1.89???1.45
#?6????????1???????4.00????????54.35??????2.13???1.28
Tmall_train$BuyOrNot<-as.factor(Tmall_train$BuyOrNot)
Tmall_test<-read.table(file="天貓_Test_1.txt",header=TRUE,sep=",")
head(Tmall_test)
#???BuyOrNot?BuyDNactDN?ActDNTotalDN?BuyBBrand?BuyHit
#?1????????0???????0.00????????54.84??????0.00???0.00
#?2????????1???????7.69????????83.87??????2.36???0.83
#?3????????1??????14.29????????90.32??????4.76???3.89
#?4????????1??????10.00????????32.26??????7.69???4.00
#?5????????1??????15.38????????41.94??????8.70???6.98
#?6????????0???????0.00????????19.35??????0.00???0.00
Tmall_test$BuyOrNot<-as.factor(Tmall_test$BuyOrNot)

模型方法同上:

#天貓成交顧客的分類(lèi)預(yù)測(cè)
set.seed(123456)
errRatio<-vector()???
for(i?in?1:30){
?KnnFit<-knn(train=Tmall_train[,-1],test=Tmall_test[,-1],cl=Tmall_train[,1],k=i,prob=FALSE)?
?CT<-table(Tmall_test[,1],KnnFit)
?errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)
}
errorRation
#?[1]?1.707317?2.195122?2.804878?3.170732?3.292683?4.146341?3.292683?4.878049?5.975610?4.756098?5.365854?6.097561?6.341463?6.341463?6.341463?6.829268?8.048780
#?[18]?8.048780?8.048780?8.048780?8.048780?6.951220?6.829268?6.707317?8.048780?7.439024?8.048780?8.048780?8.048780?8.048780
plot(errRatio,type="b",xlab="近鄰個(gè)數(shù)?K",ylab="錯(cuò)判率(%)",main="天貓成交顧客的分類(lèi)預(yù)測(cè)")

5d4aa878-6105-11ed-8abf-dac502259ad0.png

結(jié)合上圖并兼顧KNN分析的穩(wěn)健性等考慮,采用K=7的分析結(jié)論,錯(cuò)判率為3.3%。

基于變量重要性的加權(quán)KNN

KNN默認(rèn)各輸入變量在距離測(cè)度中有“同等重要”的貢獻(xiàn),但情況并不總是如此。因此需要采用基于變量重要性的加權(quán)KNN,計(jì)算加權(quán)距離,給重要變量賦予較高的權(quán)重,不需要的變量賦予較低的權(quán)重是必要的。

天貓數(shù)據(jù)KNN分類(lèi)討論變量的重要性

library(class)
par(mfrow=c(2,2))
set.seed(123456)
errRatio<-vector()???
for(i?in?1:30){
?KnnFit<-knn(train=Tmall_train[,-1],test=Tmall_test[,-1],cl=Tmall_train[,1],k=i,prob=FALSE)?
?CT<-table(Tmall_test[,1],KnnFit)?
?errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)????
}
plot(errRatio,type="l",xlab="近鄰個(gè)數(shù)?K",ylab="錯(cuò)判率(%)",main="鄰近數(shù)?K?與錯(cuò)判率")
#?選擇一個(gè)錯(cuò)判率相對(duì)較低的?K
errDelteX<-errRatio[7]
#?剔除變量
for(i?in?-2:-5){
?fit<-knn(train=Tmall_train[,c(-1,i)],test=Tmall_test[,c(-1,i)],cl=Tmall_train[,1],k=7)
?CT<-table(Tmall_test[,1],fit)
?errDelteX<-c(errDelteX,(1-sum(diag(CT))/sum(CT))*100)
}
plot(errDelteX,type="l",xlab="剔除變量",ylab="剔除錯(cuò)判率(%)",main="剔除變量與錯(cuò)判率(K=7)",cex.main=0.8)
xTitle=c("1:全體變量","2:消費(fèi)活躍度","3:活躍度","4:成交有效度","5:活動(dòng)有效度")
legend("topright",legend=xTitle,title="變量說(shuō)明",lty=1,cex=0.6)
FI<-errDelteX[-1]+1/4
wi<-FI/sum(FI)
GLabs<-paste(c("消費(fèi)活躍度","活躍度","成交有效度","活動(dòng)有效度"),round(wi,2),sep=":")
pie(wi,labels=GLabs,clockwise=TRUE,main="輸入變量權(quán)重",cex.main=0.8)
ColPch=as.integer(as.vector(Tmall_test[,1]))+1
plot(Tmall_test[,c(2,4)],pch=ColPch,cex=0.7,xlim=c(0,50),ylim=c(0,50),col=ColPch,
?????xlab="消費(fèi)活躍度",ylab="成交有效度",main="二維特征空間中的觀測(cè)",cex.main=0.8)

5d6ebd1c-6105-11ed-8abf-dac502259ad0.png

上圖中第一幅圖為普通KNN方法;

第二幅圖為確定K=7后,逐個(gè)剔除變量,剔除后的錯(cuò)判率曲線("1:全體變量","2:消費(fèi)活躍度","3:活躍度","4:成交有效度","5:活動(dòng)有效度"),可見(jiàn)剔除消費(fèi)活躍度后錯(cuò)判概率顯著增加,說(shuō)明消費(fèi)活躍度對(duì)預(yù)測(cè)的影響巨大;剔除活躍度后錯(cuò)判概率大幅下降,說(shuō)明該變量包含較強(qiáng)噪聲,對(duì)預(yù)測(cè)性能有負(fù)面影響;剔除成交有效性后錯(cuò)判率也大幅上升,說(shuō)明該變量對(duì)預(yù)測(cè)貢獻(xiàn)較大;

根據(jù)FI定義計(jì)算各個(gè)輸入變量的重要性,確定的權(quán)重如第三幅圖;第四幅圖是消費(fèi)活躍度和成交有效度特征空間中觀測(cè)點(diǎn)的分布情況,黑色圓圈表示無(wú)成交,紅色三角表示有成交,可見(jiàn)所有無(wú)交易點(diǎn)均在消費(fèi)活躍度和成交有效度等于0處,消費(fèi)活躍度和成交有效度大于0則均為有成交。

?

綜上,結(jié)論如下:

①在近鄰數(shù)K=7時(shí),普通KNN方法對(duì)測(cè)試樣本集的錯(cuò)判率僅為3.3%,效果較好;

②大部分成交顧客處于消費(fèi)活躍度和成交有效性取值水平較低的位置,在消費(fèi)活躍度和成交有效性上取值較高處的成交顧客數(shù)量很少,可作為日后顧客營(yíng)銷(xiāo)策略的參考依據(jù)

?

基于觀測(cè)相似性的加權(quán)KNN

5d978062-6105-11ed-8abf-dac502259ad0.png

#devtools::install_github("KlausVigo/kknn")
library("kknn")
#kknn(formula=R公式,train=訓(xùn)練樣本集,test=測(cè)試樣本集,na.action=na.omit(),k=鄰近個(gè)數(shù)K,distance=k,kernel=核名稱(chēng))
par(mfrow=c(2,1))
Tmall_train<-read.table(file="天貓_Train_1.txt",header=TRUE,sep=",")
Tmall_train$BuyOrNot<-as.factor(Tmall_train$BuyOrNot)
fit<-train.kknn(formula=BuyOrNot~.,data=Tmall_train,kmax=11,distance=2,kernel=c("rectangular","triangular","gaussian"),na.action=na.omit())
plot(fit$MISCLASS[,1]*100,type="l",
?????main="不同核函數(shù)和近鄰個(gè)數(shù)K下的錯(cuò)判率曲線圖",cex.main=0.8,xlab="近鄰個(gè)數(shù)?K",ylab="錯(cuò)判率(%)")
lines(fit$MISCLASS[,2]*100,lty=2,col=1)
lines(fit$MISCLASS[,3]*100,lty=3,col=2)
legend("topleft",legend=c("rectangular","triangular","gaussian"),lty=c(1,2,3),col=c(1,1,2),cex=0.7)
#?利用加權(quán)?K?近鄰分類(lèi)
Tmall_test<-read.table(file="天貓_Test_1.txt",header=TRUE,sep=",")
Tmall_test$BuyOrNot<-as.factor(Tmall_test$BuyOrNot)
fit<-kknn(formula=BuyOrNot~.,train=Tmall_train,test=Tmall_test,k=7,distance=2,kernel="gaussian",na.action=na.omit())
CT<-table(Tmall_test[,1],fit$fitted.values)
errRatio<-(1-sum(diag(CT))/sum(CT))*100
#?利用?K?近鄰分類(lèi)
library("class")
fit<-knn(train=Tmall_train,test=Tmall_test,cl=Tmall_train$BuyOrNot,k=7)
CT<-table(Tmall_test[,1],fit)
errRatio<-c(errRatio,(1-sum(diag(CT))/sum(CT))*100)
errGraph<-barplot(errRatio,main="加權(quán)K近鄰法與K近鄰法的錯(cuò)判率比對(duì)圖(K=7)",
??????????????????cex.main=0.8,xlab="分類(lèi)方法",ylab="錯(cuò)判率(%)",axes=FALSE)
axis(side=1,at=c(0,errGraph,3),labels=c("","加權(quán)?K-?近鄰法","K-近鄰法",""),tcl=0.25)
axis(side=2,tcl=0.25)

5dc1b08a-6105-11ed-8abf-dac502259ad0.png

5ddae906-6105-11ed-8abf-dac502259ad0.png

決策樹(shù)&隨機(jī)森林

原理

決策樹(shù)的目標(biāo)是建立分類(lèi)預(yù)測(cè)模型或回歸預(yù)測(cè)模型。決策樹(shù)(decision tree)也稱(chēng)判定樹(shù),它是由對(duì)象的若干屬性、屬性值和有關(guān)決策組成的一棵樹(shù)。其中的節(jié)點(diǎn)為屬性(一般為語(yǔ)言變量),分枝為相應(yīng)的屬性值(一般為語(yǔ)言值)。從同一節(jié)點(diǎn)出發(fā)的各個(gè)分枝之間是邏輯“或”關(guān)系;根節(jié)點(diǎn)為對(duì)象的某一個(gè)屬性;從根節(jié)點(diǎn)到每一個(gè)葉子節(jié)點(diǎn)的所有節(jié)點(diǎn)和邊,按順序串連成一條分枝路徑,位于同一條分枝路徑上的各個(gè)“屬性-值”對(duì)之間是邏輯“與”關(guān)系,葉子節(jié)點(diǎn)為這個(gè)與關(guān)系的對(duì)應(yīng)結(jié)果,即決策屬性。

「根節(jié)點(diǎn)」:決策樹(shù)最上層的點(diǎn),一棵決策樹(shù)只有一個(gè)根節(jié)點(diǎn);

「葉節(jié)點(diǎn)」:沒(méi)有下層的節(jié)點(diǎn)稱(chēng)為葉節(jié)點(diǎn);

「中間節(jié)點(diǎn)」:位于根節(jié)點(diǎn)下且自身有下層的節(jié)點(diǎn)。中間節(jié)點(diǎn)可分布在多個(gè)層中,同層節(jié)點(diǎn)稱(chēng)為兄弟節(jié)點(diǎn)。上層節(jié)點(diǎn)是下層節(jié)點(diǎn)的父節(jié)點(diǎn),下層節(jié)點(diǎn)是上層節(jié)點(diǎn)的子節(jié)點(diǎn)。根節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn),葉節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。

**2 叉樹(shù)和多叉樹(shù) **:若樹(shù)中每個(gè)節(jié)點(diǎn)最多只能長(zhǎng)出兩個(gè)分枝,即父節(jié)點(diǎn)只能有兩個(gè)子節(jié)點(diǎn),這樣的決策樹(shù)稱(chēng)為2叉樹(shù)。若能長(zhǎng)出不止兩個(gè)分枝,即父節(jié)點(diǎn)有兩個(gè)以上的子節(jié)點(diǎn),這樣的決策樹(shù)稱(chēng)為多叉樹(shù)。

?

決策樹(shù)分為分類(lèi)樹(shù)和回歸樹(shù),分別對(duì)應(yīng)分類(lèi)預(yù)測(cè)模型和回歸預(yù)測(cè)模型,分別用于對(duì)分類(lèi)型和數(shù)值型輸出變量值的預(yù)測(cè)。

?

決策樹(shù)主要圍繞兩個(gè)核心問(wèn)題展開(kāi):

「決策樹(shù)的生長(zhǎng)」。即利用訓(xùn)練樣本集完成決策樹(shù)的建立過(guò)程。決策樹(shù)一般不建立在全部觀測(cè)樣本上,通常需首先利用旁置法,將全部觀測(cè)樣本隨機(jī)劃分訓(xùn)練樣本集和測(cè)試樣本集。在訓(xùn)練樣本集上建立決策樹(shù),利用測(cè)試樣本集估計(jì)決策樹(shù)模型的預(yù)測(cè)誤差;

「決策樹(shù)的剪枝」。即利用測(cè)試樣本集對(duì)所形成的決策樹(shù)進(jìn)行精簡(jiǎn)。

分類(lèi)回歸樹(shù)的R實(shí)現(xiàn)

rpart(輸出變量~輸入變量,data=數(shù)據(jù)框名,method=方法名,parms=list(split=異質(zhì)性測(cè)度指標(biāo)),control=參數(shù)對(duì)象名)
#數(shù)據(jù)事先組織在 data 參數(shù)指定的數(shù)據(jù)框中;
#輸出變量~輸入變量是R公式的寫(xiě)法,若建立分類(lèi)樹(shù),輸出變量應(yīng)為因子,若有多個(gè)輸入變量,需用加號(hào)連接;
#參數(shù) method 用于指定方法,可取值:“class”表示建立分類(lèi)樹(shù),“position”和“anova”分別輸出變量為計(jì)數(shù)變量和其他數(shù)值型變量,此時(shí)建立回歸樹(shù);
#參數(shù) parms 用于指定分類(lèi)樹(shù)的異質(zhì)性測(cè)度指標(biāo),可取值:“gini”表示采用Gini系數(shù),“information”表示采用信息熵;
#參數(shù)control用于設(shè)定預(yù)修剪參數(shù)、后修剪中的復(fù)雜度參數(shù)CP值

設(shè)置預(yù)修剪等參數(shù)的 R 函數(shù):

rpart.control(minsplit=20,maxcompete=4,xval=10,maxdepth=30,cp=0.01)
# minsplit:指定節(jié)點(diǎn)最小樣本量,默認(rèn)為20
# maxcompete:指定按變量重要性降序,輸出當(dāng)前最佳分組變量的前若干個(gè)候選變量,默認(rèn)為4
# xval:指定進(jìn)行交叉驗(yàn)證剪枝時(shí)的交叉折數(shù),默認(rèn)為10
# maxdepth:指定最大樹(shù)深度,默認(rèn)為30
# cp:指定最小代價(jià)復(fù)雜度剪枝中的復(fù)雜度CP參數(shù)值,默認(rèn)為0.01

?

當(dāng)參數(shù) cp 采用默認(rèn)值 0.01 且 R 給出的決策樹(shù)過(guò)小時(shí)(由于0.01過(guò)大的結(jié)果),可適當(dāng)減小 cp 參數(shù)值。如可指定參數(shù) cp 為 0,此時(shí)的決策樹(shù)是滿足預(yù)修剪參數(shù)下的未經(jīng)后修剪的最大樹(shù),實(shí)際應(yīng)用中這棵樹(shù)可能過(guò)于茂盛。再次基礎(chǔ)上,R 將依次給出 CP 值從 0 開(kāi)始并逐漸增大過(guò)程中經(jīng)過(guò)若干次修剪后的決策樹(shù)。

?

可視化決策樹(shù)的 R 函數(shù):

rpart.plot(決策樹(shù)結(jié)果對(duì)象名,type=編號(hào),branch=外形編號(hào),extra=1)
#決策樹(shù)對(duì)象名:rpart 函數(shù)返回對(duì)象;
# type:決策樹(shù)展示方式。可取值:0~4;
# branch:指定決策樹(shù)外形,可取0(斜線連接)和 1(垂線連接);
# extra:指定在節(jié)點(diǎn)中顯示哪些數(shù)據(jù)。可取1~9

復(fù)雜參數(shù) CP 對(duì)預(yù)測(cè)誤差的影響:

#復(fù)雜度參數(shù) CP 是決策樹(shù)剪枝的關(guān)鍵參數(shù),其設(shè)置是否合理直接決定決策樹(shù)是否過(guò)于復(fù)雜而出現(xiàn)過(guò)擬合,或是否過(guò)于簡(jiǎn)單而無(wú)法得到理想的預(yù)測(cè)精度。可通過(guò)函數(shù) printcp 和 plotcp 瀏覽與可視化 cp 值:
printcp(決策樹(shù)結(jié)果對(duì)象名)
plotcp(決策樹(shù)結(jié)果對(duì)象名)

分類(lèi)回歸樹(shù)的應(yīng)用:提煉不同消費(fèi)行為顧客的主要特征

1.初建分類(lèi)樹(shù)

#install.packages("rpart")
#install.packages("rpart.plot")
library(rpart)
library(rpart.plot)
BuyOrNot<-read.table(file="消費(fèi)決策數(shù)據(jù).txt",header=TRUE)
BuyOrNot$Income<-as.factor(BuyOrNot$Income)?#指定收入為因子
BuyOrNot$Gender<-as.factor(BuyOrNot$Gender)?#?指定性別為因子
#?指定預(yù)修剪等參數(shù),復(fù)雜度參數(shù)CP為?0
Ctl?<-?rpart.control(minsplit=2,maxcompete=4,xval=10,maxdepth=10,cp=0)
set.seed(12345)
TreeFit1?<-?rpart(Purchase~.,data=BuyOrNot,method="class",
????????????????parms=list(split="gini"),control=Ctl)
rpart.plot(TreeFit1,type=4,branch=0,extra=2)
printcp(TreeFit1)?#?可視化CP值
plotcp(TreeFit1)

5dfe4770-6105-11ed-8abf-dac502259ad0.png

結(jié)果顯示,根節(jié)點(diǎn)包括全部 431 個(gè)觀測(cè)樣本,其中「162 個(gè)輸出變量值為1的觀測(cè)被誤判為0,錯(cuò)判率為 38%」。左圖中,(不含序號(hào))第1列為CP值,第2列 nsplit 為樣本數(shù)據(jù)共經(jīng)過(guò)的分組次數(shù),第3列 rel error 是預(yù)測(cè)誤差相對(duì)值的估計(jì),第4列 xerror 是交叉驗(yàn)證的預(yù)測(cè)誤差相對(duì)值,第 5 列 xstd 為預(yù)測(cè)誤差的標(biāo)準(zhǔn)誤。

需要注意的是,這里的第 3~4 列給出的是以根節(jié)點(diǎn)預(yù)測(cè)誤差為單位1的相對(duì)值。例如:本例中根節(jié)點(diǎn)的預(yù)測(cè)錯(cuò)誤率162/431為單位1,經(jīng)2次分組得到3個(gè)葉節(jié)點(diǎn)的分類(lèi)樹(shù),因錯(cuò)誤相對(duì)值為0.944,所以該樹(shù)總的預(yù)測(cè)錯(cuò)誤率為153/431。

當(dāng)復(fù)雜度參數(shù) CP 取指定值 0 時(shí),此時(shí)的分類(lèi)樹(shù)是經(jīng)過(guò)51次分組的結(jié)果,包含52個(gè)葉節(jié)點(diǎn),與右圖對(duì)應(yīng)。此時(shí)分類(lèi)樹(shù)的預(yù)測(cè)誤差估計(jì)值為0.667。經(jīng)過(guò)交叉驗(yàn)證,在CP參數(shù)增加至0.002過(guò)程中進(jìn)行了若干次剪枝,此時(shí)決策樹(shù)是36次分組后的結(jié)果,包含37個(gè)節(jié)點(diǎn),預(yù)測(cè)誤差相對(duì)值為0.698,增加了0.031個(gè)單位。

右圖縱坐標(biāo)為根節(jié)點(diǎn)的交叉驗(yàn)證預(yù)測(cè)誤差為單位 1 時(shí),當(dāng)前決策樹(shù)的交叉驗(yàn)證預(yù)測(cè)誤差的單位數(shù);橫坐標(biāo)從右往左是 CP 列表中 8 個(gè) CP 值的典型代表值 β,上方對(duì)應(yīng)的是當(dāng)前決策樹(shù)所包含的葉節(jié)點(diǎn)個(gè)數(shù)。可以看出,「包含 12 個(gè)葉節(jié)點(diǎn)的決策樹(shù)有最低的交叉驗(yàn)證預(yù)測(cè)誤差」

2.再建分類(lèi)樹(shù)

set.seed(12345)
#默認(rèn)參數(shù)
(TreeFit2<-rpart(Purchase~.,data=BuyOrNot,method="class",parms=list(split="gini")))
TreeFit2
rpart.plot(TreeFit2,type=4,branch=0,extra=2)??#?可視化決策樹(shù)
printcp(TreeFit2)??#?顯示復(fù)雜度CP參數(shù)列表

#?指定?cp=0.008,建立前述包含12個(gè)葉節(jié)點(diǎn)的決策樹(shù)
TreeFit3<-prune(TreeFit1,cp=0.008)?
rpart.plot(TreeFit3,type=4,branch=0,extra=2)
printcp(TreeFit3)
plotcp(TreeFit3)

5ea3f0bc-6105-11ed-8abf-dac502259ad0.png

上圖是按系統(tǒng)默認(rèn)參數(shù)構(gòu)建決策樹(shù),CP 參數(shù)為默認(rèn)初始值 0.01,異質(zhì)性指標(biāo)采用 Gini 系數(shù)。節(jié)點(diǎn)2后的星號(hào)*標(biāo)記表示為葉節(jié)點(diǎn),其中所有觀測(cè)的 Income 取 1 或 2,樣本量為 276,其中 88 個(gè)輸出變量為 1 的觀測(cè)點(diǎn)被誤判為 0,置信度為0.68,錯(cuò)判率 0.32。其余同理。

5ece47a4-6105-11ed-8abf-dac502259ad0.png

?

「分類(lèi)回歸樹(shù)只能建立 2 叉樹(shù)」

?

建立分類(lèi)回歸樹(shù)的組合預(yù)測(cè)模型:給出穩(wěn)健預(yù)測(cè)

分類(lèi)回歸樹(shù)具有不穩(wěn)定性,模型會(huì)隨訓(xùn)練樣本的變化而劇烈變動(dòng)。組合預(yù)測(cè)模型是提高模型預(yù)測(cè)精度和穩(wěn)健性的有效途徑,其首要工作是基于樣本數(shù)據(jù)建立一組模型而非單一模型;其次,預(yù)測(cè)時(shí)由這組模型同時(shí)提供各自的預(yù)測(cè)結(jié)果,通過(guò)類(lèi)似“投票表決”的形式?jīng)Q定最終的預(yù)測(cè)結(jié)果。

組合預(yù)測(cè)中的單個(gè)模型稱(chēng)為「基礎(chǔ)學(xué)習(xí)器(Base Learner)」,通常有相同的模型形式,如決策樹(shù)或其他預(yù)測(cè)模型等。多個(gè)預(yù)測(cè)模型是建立在多個(gè)樣本集合上的。

如何獲得多個(gè)樣本集合,以及如何將多個(gè)模型組合起來(lái)實(shí)現(xiàn)更合理的“投票表決”,是組合模型預(yù)測(cè)中的兩個(gè)重要方面。對(duì)此,常見(jiàn)的技術(shù)有「袋裝(Bagging)技術(shù)」「推進(jìn)(Boosting)技術(shù)」

1.袋裝技術(shù)的 R 實(shí)現(xiàn)

#ipred包中的bagging函數(shù)
bagging(輸出變量名~輸出變量名,data=數(shù)據(jù)框名,nbagg=k,coob=TRUE,control=參數(shù)對(duì)象名)
#輸出變量名~輸入變量名為 R 公式的寫(xiě)法,有多個(gè)輸入變量時(shí)應(yīng)用加號(hào)連接;
#coob=TRUE表示基于袋裝觀測(cè)(OOB)計(jì)算預(yù)測(cè)誤差
# control:指定袋裝過(guò)程所建模型的參數(shù)。bagging函數(shù)的內(nèi)嵌模型,即基礎(chǔ)學(xué)習(xí)器為分類(lèi)回歸樹(shù),control參數(shù)應(yīng)為rpart函數(shù)的參數(shù)
# nbagg:指定自舉次數(shù)為 k,默認(rèn)重復(fù) 25 次自舉過(guò)程,生成 25顆分類(lèi)回歸樹(shù)

#adabag包中的bagging函數(shù)
bagging(輸出變量名~輸出變量名,data=數(shù)據(jù)框名,mfinal=重復(fù)次數(shù),control=參數(shù)對(duì)象名)
# mfinal:指定重復(fù)幾次自舉過(guò)程,默認(rèn)為100。bagging函數(shù)的基礎(chǔ)學(xué)習(xí)器為分類(lèi)樹(shù),control參數(shù)應(yīng)為rpart函數(shù)的參數(shù)
# bagging函數(shù)返回值是列表。tree成分中存儲(chǔ)k顆分類(lèi)樹(shù)的結(jié)果;votes中存儲(chǔ)k個(gè)模型的投票情況;prob中存儲(chǔ)預(yù)測(cè)類(lèi)別的概率值;class為預(yù)測(cè)類(lèi)別;importance為輸入變量對(duì)輸出變量預(yù)測(cè)重要性的得分
#對(duì)新樣本集進(jìn)行預(yù)測(cè):predict.bagging 函數(shù)
predict.bagging(bagging結(jié)果對(duì)象名,新樣本集名)
# predict.bagging 將返回名為 votes,prob,class的列表成分,含義同bagging函數(shù)。此外,還返回名為confusion和error的列表成分,分別存儲(chǔ)混淆矩陣和錯(cuò)判率

2.袋裝技術(shù)的應(yīng)用:穩(wěn)健定位目標(biāo)客戶(hù)

library(rpart)
MailShot<-read.table(file='郵件營(yíng)銷(xiāo)數(shù)據(jù).txt',header?=?T)
MailShot<-MailShot[,-1]??#?剔除ID
Ctl?<-?rpart.control(minsplit=20,maxcompete=4,maxdepth=30,
?????????????????????cp=0.01,xval=10)?#?rpart的默認(rèn)參數(shù)
set.seed(12345)
TreeFit?<-?rpart(MAILSHOT~.,data=MailShot,
?????????????????method="class",?parms=list(split="gini"))??#?建立單一分類(lèi)樹(shù)
rpart.plot(TreeFit,type=4,branch=0,extra=1)
CFit1<-predict(TreeFit,MailShot,type="class")??#?利用單個(gè)分類(lèi)樹(shù)對(duì)全部觀測(cè)進(jìn)行預(yù)測(cè)
#?CFit1<-predict(TreeFit,MailShot)??
ConfM1<-table(MailShot$MAILSHOT,CFit1)??#?計(jì)算單個(gè)分類(lèi)樹(shù)的混淆矩陣
#??????CFit1
#????????NO?YES
#???NO??119??46
#???YES??39??96
(E1?<-(sum(ConfM1)-sum(diag(ConfM1)))/sum(ConfM1))?#?計(jì)算單個(gè)分類(lèi)樹(shù)的錯(cuò)判率
#?0.2833333

首先建立單個(gè)分類(lèi)樹(shù),并利用單個(gè)分類(lèi)樹(shù)對(duì)全部觀測(cè)做預(yù)測(cè),錯(cuò)判率為 0.28。

##利用ipred包中的bagging建立組合分類(lèi)樹(shù)
library(ipred)
set.seed(12345)
MailShot$MAILSHOT<-?as.factor(MailShot$MAILSHOT)??#?不轉(zhuǎn)換數(shù)據(jù)類(lèi)型一直報(bào)錯(cuò)
(BagM1<-bagging(MAILSHOT~.,data=MailShot,nbagg=25,
????????????????coob=TRUE,control=Ctl))??#?bagging建立分類(lèi)組合樹(shù)
CFit2<-predict(BagM1,MailShot,type="class")??#?利用組合分類(lèi)樹(shù)對(duì)全部觀測(cè)進(jìn)行預(yù)測(cè)
ConfM2<-table(MailShot$MAILSHOT,CFit2)??#?計(jì)算組合分類(lèi)樹(shù)的混淆矩陣
(E2<-(sum(ConfM2)-sum(diag(ConfM2)))/sum(ConfM2))??#?計(jì)算組合分類(lèi)樹(shù)的錯(cuò)判率
#?0.196667

5f0a2fda-6105-11ed-8abf-dac502259ad0.png

利用 ipred 包中的 bagging 函數(shù)建立組合分類(lèi)樹(shù),袋裝過(guò)程默認(rèn)進(jìn)行28次重抽樣自舉,生成25顆分類(lèi)樹(shù)。基于袋外觀測(cè)(OOB)的預(yù)測(cè)誤差為0.457。利用組合分類(lèi)樹(shù)并對(duì)全部觀測(cè)做預(yù)測(cè),錯(cuò)判率為 0.197。「預(yù)測(cè)精度較單一分類(lèi)樹(shù)有一定提高」

predict 函數(shù) type 指定為 class 時(shí),給出的預(yù)測(cè)結(jié)果時(shí)分類(lèi)值。不指定參數(shù),默認(rèn)給出的預(yù)測(cè)結(jié)果是各類(lèi)別的概率值(預(yù)測(cè)置信度)。

##利用adabag包中的bagging函數(shù)
detach("package:ipred")
library(adabag)
MailShot<-read.table(file="郵件營(yíng)銷(xiāo)數(shù)據(jù).txt",header=TRUE)
MailShot<-MailShot[,-1]
Ctl<-rpart.control(minsplit=20,maxcompete=4,maxdepth=30,cp=0.01,xval=10)
set.seed(12345)
BagM2<-bagging(MAILSHOT~.,data=MailShot,control=Ctl,mfinal?=?25)
BagM2$importance
#???????AGE???????CAR????GENDER????INCOME???MARRIED??MORTGAGE????REGION??????SAVE?
#?17.761337??3.202805??6.126779?49.217348??7.539829??5.398284??8.425630??2.327989?

CFit3<-predict.bagging(BagM2,MailShot)??#?利用組合分類(lèi)樹(shù)對(duì)全部觀測(cè)進(jìn)行預(yù)測(cè)
CFit3$confusion
CFit3$error

5f2b9cba-6105-11ed-8abf-dac502259ad0.png

adabag 包中的 bagging 函數(shù)建立組合分類(lèi)樹(shù),參數(shù)設(shè)置同前。函數(shù)自動(dòng)計(jì)算了輸入變量重要性的測(cè)度結(jié)果,并進(jìn)行了歸一化處理。輸出變量重要性為歸一化后的百分比。本例中較為重要的兩個(gè)輸入變量依次為收入(INCOME)和年齡(AGE)。

用組合分類(lèi)樹(shù)對(duì)全部觀測(cè)做預(yù)測(cè)的錯(cuò)判率為,預(yù)測(cè)精度較單一分類(lèi)樹(shù)有一定提高。

3.推進(jìn)技術(shù)的 R 實(shí)現(xiàn)

袋裝技術(shù)中,自舉樣本的生成完全是隨機(jī)的。多個(gè)模型在預(yù)測(cè)投票中的地位也都相同,未考慮不同模型預(yù)測(cè)精度的差異性。推進(jìn)技術(shù)在這兩方面進(jìn)行了調(diào)整,其中的AdaBoost(Adaptive Boosting)策略已有較為廣泛的應(yīng)用。

與袋裝技術(shù)不同的是,AdaBoost 采用的是加權(quán)投票方式,不同的模型具有不同的權(quán)重,權(quán)重大小與模型的預(yù)測(cè)誤差成反比。預(yù)測(cè)誤差較小的模型有較高的投票權(quán)重,預(yù)測(cè)誤差較大的模型投票權(quán)重較低。可見(jiàn),「權(quán)重越高的模型,對(duì)決策結(jié)果的影響越大」

#adabag包中的boosting函數(shù)
boosting(輸出變量名~輸入變量名,data=數(shù)據(jù)框,mfinal=重復(fù)次數(shù),
boos=TRUE,coeflearn=模型權(quán)重調(diào)整方法,control=參數(shù)對(duì)象名)
#指定重復(fù)自舉次數(shù),默認(rèn)100
#boos=TRUE表示每次自舉過(guò)程均調(diào)整各觀測(cè)進(jìn)入訓(xùn)練樣本集的權(quán)重
# coeflearn:指定預(yù)測(cè)時(shí)各模型的權(quán)重設(shè)置方法。可取值 Breiman 或 Freund 或 zhu
#boosting函數(shù)的基礎(chǔ)學(xué)習(xí)器為分類(lèi)樹(shù),control參數(shù)應(yīng)為rpart的默認(rèn)參數(shù)

bagging函數(shù)返回值是列表。tree成分中存儲(chǔ)k顆分類(lèi)樹(shù)的結(jié)果;votes中存儲(chǔ)k個(gè)模型的投票情況;prob中存儲(chǔ)預(yù)測(cè)類(lèi)別的概率值;class為預(yù)測(cè)類(lèi)別;importance為輸入變量對(duì)輸出變量預(yù)測(cè)重要性的得分;weight為各個(gè)模型的預(yù)測(cè)權(quán)重。

4.推進(jìn)技術(shù)的應(yīng)用:文件定位目標(biāo)客戶(hù)

library(adabag)
MailShot<-?read.table(file="郵件營(yíng)銷(xiāo)數(shù)據(jù).txt",header?=?T)
MailShot<-MailShot[,-1]
MailShot$MAILSHOT?<-?as.factor(MailShot$MAILSHOT)
Ctl<-rpart.control(minsplit=20,maxcompete=4,maxdepth=30,cp=0.01,xval=10)
set.seed(12345)
BoostM<-boosting(MAILSHOT~.,data=MailShot,boos=TRUE,mfinal=25,
?????????????????coeflearn="Breiman",control=Ctl)
BoostM$importance
#???????AGE???????CAR????GENDER????INCOME???MARRIED??MORTGAGE????REGION??????SAVE?
#?23.666103??3.821141??3.597499?43.118805??5.424618??4.782976?11.057369??4.531490
ConfM4<-table(MailShot$MAILSHOT,BoostM$class)
E4?<-?(sum(ConfM4)-sum(diag(ConfM4)))/sum(ConfM4)
E4
#?0.02666667

本例中,較為重要的兩個(gè)輸入變量依次為收入和年齡。用組合分類(lèi)樹(shù)對(duì)全部觀測(cè)做預(yù)測(cè)的錯(cuò)判率為 0.027,較單一分類(lèi)樹(shù)有顯著提高。

?

袋裝技術(shù)與推進(jìn)技術(shù)有類(lèi)似的研究目標(biāo),但兩者訓(xùn)練樣本集的生成方式不同,組合預(yù)測(cè)方式也不同。兩者均可有效地提高預(yù)測(cè)準(zhǔn)確性。「在大多數(shù)數(shù)據(jù)集中,推進(jìn)技術(shù)的準(zhǔn)確性一般高于袋裝技術(shù),但也可能導(dǎo)致過(guò)擬合問(wèn)題。」

?

隨機(jī)森林:具有隨機(jī)性的組合預(yù)測(cè)

Random Forest 也是一種組合預(yù)測(cè)模型,是用隨機(jī)方式建立一片森林,森林中包含眾多有較高預(yù)測(cè)精度且弱相關(guān)甚至不相關(guān)的決策樹(shù),并形成組合預(yù)測(cè)模型;后續(xù),眾多預(yù)測(cè)模型將共同參與對(duì)新觀測(cè)輸出變量取值的預(yù)測(cè)。

隨機(jī)森林的內(nèi)嵌模型,即基礎(chǔ)學(xué)習(xí)器是分類(lèi)回歸樹(shù),其特色在于隨機(jī),表現(xiàn)在兩個(gè)方面:

訓(xùn)練樣本是對(duì)原始樣本的重抽樣自舉,訓(xùn)練樣本具有隨機(jī)性;

在每顆決策樹(shù)的建立過(guò)程中,稱(chēng)為當(dāng)前最佳分組變量的輸入變量,是輸出變量全體的一個(gè)隨機(jī)候選變量子集中的競(jìng)爭(zhēng)獲勝者。分組變量具有隨機(jī)性

「Bagging方法的主要過(guò)程:」

訓(xùn)練分類(lèi)器。從整體樣本集合中,抽樣n* < N個(gè)樣本 針對(duì)抽樣的集合訓(xùn)練分類(lèi)器Ci

分類(lèi)器進(jìn)行投票,最終的結(jié)果是分類(lèi)器投票的優(yōu)勝結(jié)果

隨機(jī)森林是以決策樹(shù)為基本分類(lèi)器的一個(gè)集成學(xué)習(xí)模型,它包含多個(gè)由Bagging集成學(xué)習(xí)技術(shù)訓(xùn)練得到的決策樹(shù)。前面描述了原始的樹(shù)的bagging算法。Random Forests不同的是:在Bagging的基礎(chǔ)上,他們使用一種改進(jìn)的樹(shù)學(xué)習(xí)算法,這種樹(shù)學(xué)習(xí)算法在每個(gè)候選分裂的學(xué)習(xí)過(guò)程中,選擇特征值的一個(gè)隨機(jī)子集。這個(gè)過(guò)程有時(shí)被稱(chēng)為“「feature bagging」”。

以決策樹(shù)為基本模型的bagging在每次bootstrap放回抽樣之后,產(chǎn)生一棵決策樹(shù),抽多少樣本就生成多少棵樹(shù),在生成這些樹(shù)的時(shí)候沒(méi)有進(jìn)行更多的干預(yù)。而隨機(jī)森林也是進(jìn)行bootstrap抽樣,但它與bagging的區(qū)別是在生成每棵樹(shù)的時(shí)候,每個(gè)節(jié)點(diǎn)變量都僅僅在隨機(jī)選出的少數(shù)變量中產(chǎn)生。因此,不但樣本是隨機(jī)的,連每個(gè)節(jié)點(diǎn)變量(Features)的產(chǎn)生都是隨機(jī)的。

5f55263e-6105-11ed-8abf-dac502259ad0.png

「隨機(jī)森林分類(lèi)性能的主要因素:」

森林中單顆樹(shù)的分類(lèi)強(qiáng)度(Strength):每顆樹(shù)的分類(lèi)強(qiáng)度越大,則隨機(jī)森林的分類(lèi)性能越好。

森林中樹(shù)之間的相關(guān)度(Correlation):樹(shù)之間的相關(guān)度越大,則隨機(jī)森林的分類(lèi)性能越差。

「隨機(jī)森林的幾個(gè)理論要點(diǎn):」

收斂定理。它度量了隨機(jī)森林對(duì)給定樣本集的分類(lèi)錯(cuò)誤率。

泛化誤差界。單個(gè)決策樹(shù)的分類(lèi)強(qiáng)度越大,相關(guān)性越小,則泛化誤差界越小,隨機(jī)森林分類(lèi)準(zhǔn)確度越高。

袋外估計(jì)。Breiman在論文中指出袋外估計(jì)是無(wú)偏估計(jì),袋外估計(jì)與用同訓(xùn)練集一樣大小的測(cè)試集進(jìn)行估計(jì)的精度是一樣的。

「隨機(jī)森林的優(yōu)點(diǎn):」

對(duì)于很多種資料,它可以產(chǎn)生高準(zhǔn)確度的分類(lèi)器。

它可以處理大量的輸入變量。

它可以在決定類(lèi)別時(shí),評(píng)估變量的重要性。

在建造隨機(jī)森林時(shí),它可以在內(nèi)部對(duì)于一般化后的誤差產(chǎn)生無(wú)偏差的估計(jì)。

它包含一個(gè)好方法可以估計(jì)遺失的資料,并且,如果有很大一部分的資料遺失,仍可以維持準(zhǔn)確度。

它提供一個(gè)實(shí)驗(yàn)方法,可以去偵測(cè) variable interactions 。

對(duì)于不平衡的分類(lèi)資料集來(lái)說(shuō),它可以平衡誤差。

它計(jì)算各例中的親近度,對(duì)于數(shù)據(jù)挖掘、偵測(cè)偏離者(outlier)和將資料視覺(jué)化非常有用。

使用上述。它可被延伸應(yīng)用在未標(biāo)記的資料上,這類(lèi)資料通常是使用非監(jiān)督式聚類(lèi)。也可偵測(cè)偏離者和觀看資料。

學(xué)習(xí)過(guò)程是很快速的。

可以實(shí)現(xiàn)并行運(yùn)行

「隨機(jī)森林的缺點(diǎn):」

隨機(jī)森林已經(jīng)被證明在某些噪音較大的分類(lèi)或回歸問(wèn)題上會(huì)過(guò)擬

對(duì)于有不同級(jí)別的屬性的數(shù)據(jù),級(jí)別劃分較多的屬性會(huì)對(duì)隨機(jī)森林產(chǎn)生更大的影響,所以隨機(jī)森林在這種數(shù)據(jù)上產(chǎn)出的屬性權(quán)值是不可信的。

由于隨機(jī)選擇屬性,得單棵決策樹(shù)的的預(yù)測(cè)效果很差

投票機(jī)制中,并不是所有的樹(shù)都能夠準(zhǔn)確地標(biāo)記出所有的對(duì)象。

「隨機(jī)森林的應(yīng)用:」

隨機(jī)森林是現(xiàn)在研究較多一種數(shù)據(jù)挖掘算法,由于其良好的性能表現(xiàn),在現(xiàn)實(shí)生活中也獲得了廣泛的應(yīng)用。隨機(jī)森林主要應(yīng)用于回歸和分類(lèi)。

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

#randomForest包中的randomForst函數(shù)
randomForest(輸出變量名~輸入變量名,data=數(shù)據(jù)框名,mtyr=k,ntree=M,importance=TRUE)
# mtry:指定決策樹(shù)各節(jié)點(diǎn)的輸入變量個(gè)數(shù) k。若輸出變量為因子,隨機(jī)森林中的基礎(chǔ)學(xué)習(xí)器為分類(lèi)樹(shù);若為數(shù)值型變量,則基礎(chǔ)學(xué)習(xí)器為回歸樹(shù);
# ntree:指定隨機(jī)森林包含 M 顆決策樹(shù),默認(rèn)為 500;
# importance = TRUE:表示計(jì)算輸入變量對(duì)輸出變量重要性的測(cè)度值

randomForets 函數(shù)的返回值為列表,包含以下成分:

predicted:基于袋外觀測(cè) OOB 的預(yù)測(cè)類(lèi)別或預(yù)測(cè)值;
confusion:基于袋外觀測(cè) OOB 的混淆矩陣;
votes:適用于分類(lèi)樹(shù)。給出各預(yù)測(cè)類(lèi)別的概率值,即隨機(jī)森林中有多少臂力的分類(lèi)樹(shù)投票給第 i 個(gè)類(lèi)別;
oob.times:各個(gè)觀測(cè)值作為 OOB 的次數(shù),即在重抽樣自舉中有多少次未進(jìn)入自舉樣本,其會(huì)影響基于袋外觀測(cè) OOB 的預(yù)測(cè)誤差結(jié)果;
err.rate:隨機(jī)森林中各個(gè)決策樹(shù)基于 OOB 的整體預(yù)測(cè)錯(cuò)誤率,以及對(duì)各個(gè)類(lèi)別的預(yù)測(cè)錯(cuò)誤率;
importance:輸入變量重要性測(cè)度矩陣。

隨機(jī)森林的應(yīng)用:文件定位客戶(hù)目標(biāo)

library(randomForest)
MailShot<-read.table(file="郵件營(yíng)銷(xiāo)數(shù)據(jù).txt",?header?=?T)
MailShot<-MailShot[,-1]
set.seed(12345)
(rFM<-randomForest(MAILSHOT~.,data=MailShot,importance=TRUE,proximity=TRUE))
head(rFM$votes)??#?各觀測(cè)的各類(lèi)別預(yù)測(cè)概率
head(rFM$oob.times)??#?各觀測(cè)作為?OOB?的次數(shù)

5f8dfbda-6105-11ed-8abf-dac502259ad0.png

隨機(jī)森林共建了500顆決策樹(shù),每個(gè)節(jié)點(diǎn)的候選輸入變量個(gè)數(shù)為2。基于袋外觀測(cè) OOB 的預(yù)測(cè)錯(cuò)判率為 45%。從袋外觀測(cè)的混淆矩陣看,模型對(duì)兩個(gè)類(lèi)別的預(yù)測(cè)精度均不理想。對(duì)NO類(lèi)的預(yù)測(cè)錯(cuò)誤率為36.4%,對(duì)YES類(lèi)的預(yù)測(cè)錯(cuò)誤率為55.6%。

以第一個(gè)觀測(cè)為例:有62.8%的決策樹(shù)投票給NO,37.2%的決策樹(shù)投票給YES。有183次作為OOB未進(jìn)入訓(xùn)練樣本集。

DrawL<-par(mfrow=c(2,1),mar=c(5,5,3,1))
plot(rFM,main="隨機(jī)森林的OOB錯(cuò)判率和決策樹(shù)顆數(shù)")
plot(margin(rFM),type="h",main="邊界點(diǎn)探測(cè)",
?????xlab="觀測(cè)序列",ylab="比率差")?#?探測(cè)邊界點(diǎn)
par(DrawL)
Fit<-predict(rFM,MailShot)??#?隨機(jī)森林對(duì)全部觀測(cè)做預(yù)測(cè)
ConfM5<-table(MailShot$MAILSHOT,Fit)??#?隨機(jī)森林對(duì)全部觀測(cè)做預(yù)測(cè)的混淆矩陣
(E5<-(sum(ConfM5)-sum(diag(ConfM5)))/sum(ConfM5))??#?隨機(jī)森林的整體錯(cuò)判率
#?0.03

5fe1920e-6105-11ed-8abf-dac502259ad0.png

對(duì)OOB錯(cuò)判率隨隨機(jī)森林中決策樹(shù)數(shù)量的變化特點(diǎn)進(jìn)行可視化,plot的繪圖數(shù)據(jù)為err.rate。圖中黑色線為整體錯(cuò)判率,紅色線為對(duì)NO類(lèi)預(yù)測(cè)的錯(cuò)判率,綠色線為對(duì)YES類(lèi)預(yù)測(cè)的錯(cuò)判率。可見(jiàn),模型對(duì)NO類(lèi)的預(yù)測(cè)效果好于對(duì)整體和YES類(lèi)的。當(dāng)決策樹(shù)達(dá)到380以后,各類(lèi)錯(cuò)判率基本保持穩(wěn)定。所以本例中參數(shù) ntree 可設(shè)置為380。

下面的圖為使用 margin 函數(shù)考察處于分類(lèi)邊界附近的點(diǎn)的錯(cuò)判情況。該函數(shù)以差的升序返回所有觀測(cè)的比率差。其中,比率差近似等于 0 的觀測(cè)紅色類(lèi)(NO類(lèi))居多,多藍(lán)類(lèi)(YES類(lèi))的預(yù)測(cè)錯(cuò)誤較多。

head(treesize(rFM))#瀏覽各個(gè)樹(shù)的葉節(jié)點(diǎn)個(gè)數(shù)
head(getTree(rfobj=rFM,k=1,labelVar=TRUE))#提取第1顆樹(shù)的部分信息

60241dcc-6105-11ed-8abf-dac502259ad0.png

treesize函數(shù)可用于顯示隨機(jī)森林中各決策樹(shù)的大小。treesize(隨機(jī)森林結(jié)果對(duì)象名, terminal = TRUE/FALSE),參數(shù) terminal 取 TRUE 時(shí)僅統(tǒng)計(jì)決策樹(shù)的葉節(jié)點(diǎn)個(gè)數(shù),取 FALSE 表示統(tǒng)計(jì)所有節(jié)點(diǎn)的個(gè)數(shù)。

本例中,第 1 顆決策樹(shù)包含 88 個(gè)葉節(jié)點(diǎn)。可利用 getTree 函數(shù)抽取隨機(jī)森林中的某顆樹(shù)并瀏覽其結(jié)構(gòu)。

60467408-6105-11ed-8abf-dac502259ad0.png

barplot(rFM$importance[,3],
main="輸入變量重要性測(cè)度(預(yù)測(cè)精度變化)指標(biāo)柱形圖")
box()

607fffa2-6105-11ed-8abf-dac502259ad0.png

可調(diào)用randomForest包中的importance函數(shù),importance(隨機(jī)森林結(jié)果對(duì)象名, type=類(lèi)型編號(hào))。

60a33896-6105-11ed-8abf-dac502259ad0.png

importance(rFM,type=1)

60dfa8ee-6105-11ed-8abf-dac502259ad0.png

varImpPlot(x=rFM,sort=TRUE,n.var=nrow(rFM$importance),main="輸入變量重要性測(cè)度散點(diǎn)圖")

610a5c74-6105-11ed-8abf-dac502259ad0.png

由上圖可知,從對(duì)輸出變量預(yù)測(cè)精度影響的角度看,收入、是否有債務(wù)、婚姻狀況較為重要;從對(duì)輸出變量異質(zhì)性下降程度看,收入、年齡和居住地較為重要,即收入不同,年齡不同,居住地不同的人群對(duì)快遞郵件的反應(yīng)有較大差異。

練習(xí)

將上述數(shù)據(jù)分成70%訓(xùn)練集,訓(xùn)練隨機(jī)森林模型,并對(duì)剩下30%預(yù)測(cè),計(jì)算預(yù)測(cè)準(zhǔn)確率。并且評(píng)價(jià)變量重要性。

library(randomForest)
MailShot<-read.table(file="郵件營(yíng)銷(xiāo)數(shù)據(jù).txt",?header?=?T)
MailShot<-MailShot[,-1]
MailShot$MAILSHOT?<-?as.factor(MailShot$MAILSHOT)
nrow(MailShot)
n?<-?sample(c(1:300),?300*0.70,?replace?=?F)
MailShot_train?<-?MailShot[n,]
MailShot_test?<-?MailShot[-n,]

set.seed(12345)
(rFM<-randomForest(MAILSHOT~.,data=MailShot_train,importance=TRUE,proximity=TRUE))
head(rFM$votes)??#?各觀測(cè)的各類(lèi)別預(yù)測(cè)概率
head(rFM$oob.times)??#?各觀測(cè)作為?OOB?的次數(shù)
DrawL<-par(mfrow=c(2,1),mar=c(5,5,3,1))
plot(rFM,main="隨機(jī)森林的OOB錯(cuò)判率和決策樹(shù)顆數(shù)")
plot(margin(rFM),type="h",main="邊界點(diǎn)探測(cè)",
?????xlab="觀測(cè)序列",ylab="比率差")?#?探測(cè)邊界點(diǎn)
par(DrawL)

Fit<-predict(rFM,MailShot_test)??#?隨機(jī)森林對(duì)測(cè)試數(shù)據(jù)做預(yù)測(cè)
ConfM<-table(MailShot_test$MAILSHOT,Fit)??#?隨機(jī)森林對(duì)測(cè)試數(shù)據(jù)做預(yù)測(cè)的混淆矩陣
(E<-(sum(ConfM)-sum(diag(ConfM)))/sum(ConfM))??#?隨機(jī)森林的整體錯(cuò)判率
#?0.4222222

612eac8c-6105-11ed-8abf-dac502259ad0.png

6159a2f2-6105-11ed-8abf-dac502259ad0.png

6189782e-6105-11ed-8abf-dac502259ad0.png

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算
    +關(guān)注

    關(guān)注

    2

    文章

    450

    瀏覽量

    38809
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1208

    瀏覽量

    24710

原文標(biāo)題:機(jī)器學(xué)習(xí)方法 —— KNN、分類(lèi)回歸樹(shù)、隨機(jī)森林

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【每天學(xué)點(diǎn)AI】KNN算法:簡(jiǎn)單有效的機(jī)器學(xué)習(xí)分類(lèi)

    過(guò)程,其實(shí)就是一個(gè)簡(jiǎn)單的分類(lèi)問(wèn)題,而KNN(K-NearestNeighbors)算法正是模仿這種人類(lèi)決策過(guò)程的機(jī)器學(xué)習(xí)算法。|什么是KNN
    的頭像 發(fā)表于 10-31 14:09 ?331次閱讀
    【每天學(xué)點(diǎn)AI】<b class='flag-5'>KNN</b><b class='flag-5'>算法</b>:簡(jiǎn)單有效的機(jī)器學(xué)習(xí)<b class='flag-5'>分類(lèi)</b>器

    雪崩晶體管有哪些優(yōu)缺點(diǎn)

    雪崩晶體管作為一種特殊的半導(dǎo)體器件,在電子領(lǐng)域具有其獨(dú)特的優(yōu)缺點(diǎn)
    的頭像 發(fā)表于 09-23 18:05 ?312次閱讀

    運(yùn)放恒流源有哪些優(yōu)缺點(diǎn)

    運(yùn)放恒流源,即利用運(yùn)算放大器(Operational Amplifier,簡(jiǎn)稱(chēng)運(yùn)放)構(gòu)成的恒流源電路,具有一系列獨(dú)特的優(yōu)點(diǎn)和缺點(diǎn)。以下是對(duì)其優(yōu)缺點(diǎn)的詳細(xì)分析。
    的頭像 發(fā)表于 08-28 10:18 ?1158次閱讀

    繼電保護(hù)器的種類(lèi)及其優(yōu)缺點(diǎn)

    繼電保護(hù)器在電力系統(tǒng)中扮演著至關(guān)重要的角色,它們負(fù)責(zé)監(jiān)測(cè)電力系統(tǒng)中的電氣參數(shù)和信號(hào),并在系統(tǒng)發(fā)生故障或異常情況時(shí)迅速切斷電路,以保護(hù)電氣設(shè)備和人員的安全。根據(jù)不同的分類(lèi)標(biāo)準(zhǔn),繼電保護(hù)器可以分為多種類(lèi)型,每種類(lèi)型都有其獨(dú)特的優(yōu)缺點(diǎn)。以下是對(duì)繼電保護(hù)器種類(lèi)及其
    的頭像 發(fā)表于 08-09 09:44 ?942次閱讀

    圖像識(shí)別算法優(yōu)缺點(diǎn)有哪些

    圖像識(shí)別算法是一種利用計(jì)算機(jī)視覺(jué)技術(shù)對(duì)圖像進(jìn)行分析和理解的方法,它在許多領(lǐng)域都有廣泛的應(yīng)用,如自動(dòng)駕駛、醫(yī)療診斷、安全監(jiān)控等。然而,圖像識(shí)別算法也存在一些優(yōu)缺點(diǎn)。 一、圖像識(shí)別算法的優(yōu)
    的頭像 發(fā)表于 07-16 11:09 ?1656次閱讀

    AI大模型與小模型的優(yōu)缺點(diǎn)

    在人工智能(AI)的廣闊領(lǐng)域中,模型作為算法與數(shù)據(jù)之間的橋梁,扮演著至關(guān)重要的角色。根據(jù)模型的大小和復(fù)雜度,我們可以將其大致分為AI大模型和小模型。這兩種模型在定義、優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景上存在著顯著的差異。本文將從多個(gè)維度深入探討AI大模型與小模型的特點(diǎn),并分析其各自的
    的頭像 發(fā)表于 07-10 10:39 ?2768次閱讀

    神經(jīng)網(wǎng)絡(luò)反向傳播算法優(yōu)缺點(diǎn)有哪些

    神經(jīng)網(wǎng)絡(luò)反向傳播算法(Backpropagation Algorithm)是一種廣泛應(yīng)用于深度學(xué)習(xí)和機(jī)器學(xué)習(xí)領(lǐng)域的優(yōu)化算法,用于訓(xùn)練多層前饋神經(jīng)網(wǎng)絡(luò)。本文將介紹反向傳播算法優(yōu)缺點(diǎn)
    的頭像 發(fā)表于 07-03 11:24 ?985次閱讀

    神經(jīng)網(wǎng)絡(luò)算法優(yōu)缺點(diǎn)有哪些

    神經(jīng)網(wǎng)絡(luò)算法是一種模擬人腦神經(jīng)元結(jié)構(gòu)的計(jì)算模型,廣泛應(yīng)用于機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、圖像識(shí)別、語(yǔ)音識(shí)別等領(lǐng)域。然而,神經(jīng)網(wǎng)絡(luò)算法也存在一些優(yōu)缺點(diǎn)。本文將詳細(xì)分析神經(jīng)網(wǎng)絡(luò)算法
    的頭像 發(fā)表于 07-03 09:47 ?1411次閱讀

    機(jī)器學(xué)習(xí)算法原理詳解

    機(jī)器學(xué)習(xí)作為人工智能的一個(gè)重要分支,其目標(biāo)是通過(guò)讓計(jì)算機(jī)自動(dòng)從數(shù)據(jù)中學(xué)習(xí)并改進(jìn)其性能,而無(wú)需進(jìn)行明確的編程。本文將深入解讀幾種常見(jiàn)的機(jī)器學(xué)習(xí)算法原理,包括線性回歸、邏輯回歸、支持向量機(jī)(SVM)、決策
    的頭像 發(fā)表于 07-02 11:25 ?1070次閱讀

    數(shù)控系統(tǒng)分類(lèi)及其優(yōu)缺點(diǎn)有哪些

    數(shù)控系統(tǒng)是數(shù)控機(jī)床的核心部分,它負(fù)責(zé)接收加工程序,進(jìn)行數(shù)據(jù)處理和控制機(jī)床的運(yùn)動(dòng)。數(shù)控系統(tǒng)的種類(lèi)繁多,根據(jù)其結(jié)構(gòu)、性能和應(yīng)用領(lǐng)域,可以將其分為不同的類(lèi)型。以下是對(duì)數(shù)控系統(tǒng)分類(lèi)及其優(yōu)缺點(diǎn)的介紹: 一
    的頭像 發(fā)表于 07-01 11:08 ?1375次閱讀

    nbiot和lora的優(yōu)缺點(diǎn)是什么?

    nbiot和lora的優(yōu)缺點(diǎn)
    發(fā)表于 06-04 06:37

    日本大帶寬服務(wù)器優(yōu)缺點(diǎn)分析

    日本大帶寬服務(wù)器是很多用戶(hù)的選擇,那么日本大帶寬服務(wù)器優(yōu)缺點(diǎn)都是什么?Rak部落小編為您整理發(fā)布日本大帶寬服務(wù)器優(yōu)缺點(diǎn)分析。
    的頭像 發(fā)表于 03-22 10:08 ?473次閱讀

    什么是隨機(jī)森林隨機(jī)森林的工作原理

    隨機(jī)森林使用名為“bagging”的技術(shù),通過(guò)數(shù)據(jù)集和特征的隨機(jī)自助抽樣樣本并行構(gòu)建完整的決策樹(shù)。雖然決策樹(shù)基于一組固定的特征,而且經(jīng)常過(guò)擬
    發(fā)表于 03-18 14:27 ?3589次閱讀
    什么是<b class='flag-5'>隨機(jī)</b><b class='flag-5'>森林</b>?<b class='flag-5'>隨機(jī)</b><b class='flag-5'>森林</b>的工作原理

    儲(chǔ)能元件的分類(lèi)優(yōu)缺點(diǎn)

    常見(jiàn)的PCS儲(chǔ)能用的是電池,有磷酸鐵鋰,鋰電池等材料,但是也有用電容儲(chǔ)能的,比如用無(wú)極性大電容和超級(jí)法拉電容的。 1、請(qǐng)問(wèn)用電池儲(chǔ)能和電容儲(chǔ)能那種效率更高??jī)烧吒饔惺裁?b class='flag-5'>優(yōu)缺點(diǎn)? 2、在儲(chǔ)能過(guò)程中,儲(chǔ)
    發(fā)表于 03-11 23:03

    電動(dòng)機(jī)調(diào)速方式的優(yōu)缺點(diǎn)

    電動(dòng)機(jī)調(diào)速方式的優(yōu)缺點(diǎn)? 電動(dòng)機(jī)調(diào)速是指根據(jù)負(fù)載的要求調(diào)整電動(dòng)機(jī)轉(zhuǎn)速的過(guò)程,可分為機(jī)械調(diào)速和電子調(diào)速兩種方式。機(jī)械調(diào)速主要使用機(jī)械裝置來(lái)調(diào)整電動(dòng)機(jī)的速度,而電子調(diào)速則利用電子器件對(duì)電動(dòng)機(jī)進(jìn)行精確
    的頭像 發(fā)表于 01-04 11:26 ?1380次閱讀
    主站蜘蛛池模板: 高清一级片| 中文字幕一二三四区| 天天天天做夜夜夜做| 亚洲精品mv在线观看| 种子 在线播放| 亚州视频一区二区| 男生女生靠逼视频| 黄网站在线观看视频| 国产www在线播放| 5060精品国产福利午夜| 亚洲精品91香蕉综合区| 天堂8中文在线最新版在线| 免费看国产精品久久久久| 国产精品成人观看视频国产奇米| 伊人网在线免费视频| 天天做天天爱夜夜大爽完整| 美女被草视频| tube4欧美最新69| 激情婷婷色| 色综合久久综精品| 性xxxxfreexxxxx国产| 99热精品久久只有精品30| 一区二区三区四区在线不卡高清 | 免费毛片网站在线观看| 国模最新私拍视频在线观看| 永久免费影视在线观看| 久热精品视频| 亚洲伦理一区| 四虎在线精品| 五月天亚洲| 婷婷5月天| 男人的天堂在线视频| www.色天使| 一级片+国产| 国产午夜在线观看| aa国产| 色噜噜亚洲男人的天堂| 婷婷狠狠| 国产精品免费拍拍拍| 久久天天综合| 禁h粗大太大好爽好涨受不了了|