決策樹、隨機森林、聚類分析

背景

預測新承包商的信用評級,這5個特徵指標分別是:
x1 市場份額
x2 客訴率
x3 當年度毛利率
x4 銷售收入佔實收資本比例
x5 淨利潤
利用上述五項指標及歷史評級結果的821條樣本數據開發多分類信用評級模型和聚類模型,如下:

將R語言加載包的網絡鏈接,指向國內鏡像,確保網絡通暢;

鏡像設置加載有2種方式,如下:
A.方法一:代碼指定鏡像
local({r <- getOption(“repos”)
r[“CRAN”] <- “http://mirrors.aliyun.com/CRAN/”
r[“CRANextra”] <- “http://mirrors.aliyun.com/CRAN/”
options(repos=r)})
B.方法二:手動修改鏡像
在這裏插入圖片描述
(2)使用na.omit()命令刪除有缺失的數據行;
在這裏插入圖片描述
可見數據無缺失值,刪除後數據和原數據保持相同,可以進行下一步分析。
(3)對於讀入R語言的附件1數據集,將評級結果grade這一列,利用factor函數轉換爲有序因子的數據類型。

在這裏插入圖片描述
對數據因子進行有序化後,結果爲A<B<C<D.
(4)將轉換完成後的df1數據框,隨機切分成開發樣本df1.train和驗證樣本df1.validate
在這裏插入圖片描述

對數據的抽取比例和數據樣本分別進行了隨機數的設置。

在這裏插入圖片描述

經典決策樹模型

(5)利用df1.train訓練經典決策樹模型,並用df1.validate驗證模型準確性。

library(rpart)
set.seed(123456)
dtree <- rpart(grade~.,data = df1.train,method = 'class',
               parms = list(split = 'information'))
dtree$cptable  #不同大小的樹對應的預測誤差
plotcp(dtree)  #交叉驗證誤差與複雜度參數的關係圖
dtree.pruned <- prune(dtree,cp=0.015) #根據複雜度剪枝,控制樹的大小
library(rpart.plot)
prp(dtree.pruned,type = 2, extra = 104,
    fallen.leaves = TRUE, main = 'Decision Tree') #畫出最終的決策樹
dtree.pred <- predict(dtree.pruned,df1.validate,type = 'class')
str(dtree.pred)
dtree.pref <- table(df1.validate$grade,dtree.pred,
                    dnn = c('Actual','Predicted'))
print(dtree.pref)

結果展示如下:
在這裏插入圖片描述
圖 交叉驗證誤差與複雜度參數的關係
cp=0.015,根據複雜度剪枝,控制樹的大小.繪製決策樹圖形爲:
在這裏插入圖片描述
對該決策樹模型使用驗證集數據進行驗證,結果如下:
在這裏插入圖片描述
計算可得驗證準確的數據個數有:54+205+31+31=321,總體數據爲: 737個。最終準確率爲:321/737=43.56%.

推斷決策樹模型

(6)利用df1.train訓練條件推斷決策樹模型,並用df1.validate驗證模型準確性。

#install.packages("party")
library(party) #加載必要包
fit.ctree <- ctree(grade~.,data = df1.train)  #生成條件決策樹
plot(fit.ctree,main = 'Conditional Inference Tree') #畫出決策樹
ctree.pred <- predict(fit.ctree,df1.validate,type = 'response') #對驗證集分類
ctree.pref <- table(df1.validate$grade,ctree.pred,
                    dnn = c('Actual','"Predict')) #觀察準確率
print(ctree.pref)

執行結果如下:

在這裏插入圖片描述
圖 條件推斷決策樹
對該決策樹模型使用驗證集數據進行驗證,最終預測數據結果爲:

在這裏插入圖片描述
計算可得驗證準確的數據個數有:0+304+0+31=335,總體數據爲: 737個。最終準確率爲:335/737=45.45%

隨機森林模型

(7)利用df1.train訓練隨機森林模型,並用df1.validate驗證模型準確性。

library(randomForest)
set.seed(123456)
ez.forest <- randomForest(grade~.,data = df1.train,
                          na.action = na.roughfix,  #變量缺失值替換成對應列的中位數
                          importance = TRUE)  #生成森林
print(ez.forest)
importance(ez.forest,type=2) 
#type=2參數得到的某個變量的相對重要性就是分割該變量時節點不純度的下降總量(所有決策樹)取平均(/決策樹的數量)
forest.pred <- predict(ez.forest,df1.validate)
forest.perf <- table(df1.validate$grade,forest.pred,
                     dnn = c('Actual','Predicted'))
print(forest.perf)

執行結果如下:
在這裏插入圖片描述
對該決策樹模型使用驗證集數據進行驗證,最終預測數據結果爲:
在這裏插入圖片描述
計算可得驗證準確的數據個數有:77+224+29+35=365,總體數據爲: 737個。最終準確率爲:365/737=49.53%

計算上述三個模型在驗證集上的預測準確率,並評價哪個模型準確率最高。
綜上比較,經典決策樹模型最終準確率爲:43.56%,條件推斷決策樹模型最終準確率爲:45.45%,隨機森林模型最終準確率爲:49.53%,選擇準確率高的隨機森林模型。

聚類分析模型

利用K均值聚類模型對該批數據進行聚類分析。

setwd("C:\\Users\\Administrator\\Desktop\\project")
df2<-read.csv("data2_cluster.csv")
str(df2)
library(factoextra)  
df2<-df2[,-1]  
b<-scale(df2)  
#設置隨機種子,保證試驗客重複進行  
set.seed(1234)  
#確定最佳聚類個數,使用組內平方誤差和法  
fviz_nbclust(b,kmeans,method="wss")+geom_vline(xintercept=4,linetype=2)
#根據最佳聚類個數,進行kmeans聚類
res<-kmeans(b,4)
#將分類結果放入原數據集中
res1<-cbind(df2,res$cluster)
#導出最終結果
write.csv(res1,file='res1.csv')
#查看最終聚類圖形
fviz_cluster(res,data=df2)

在這裏插入圖片描述

圖:最佳聚類個數判斷
這裏函數直觀給出最佳分類個數:4。因此數據聚成4類。聚類結果圖形爲:
在這裏插入圖片描述
圖: 聚類結果圖形

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章