R语言数据挖掘:随机森林(1)

时间:2024-04-04 13:52:15

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集,heart_learning.csv是训练数据集,heart_test.csv是测试数据集。要求:target和target2为因变量,其他诸变量为自变量。用决策树模型对target和target2做预测,并与实际值比较来验证预测情况。变量说明:pain,ekg,slope,thal是分类变量,在做模型训练前需要对其进行转换为因子型变量。target是定类多值因变量,target2是二值变量,文中分别对其进行预测。

变量名称 变量说明
age 年龄
sex 性别,取值1代表男性,0代表女性
pain  胸痛的类型,取值1,2,3,4,代表4种类型
bpress 入院时的静息血压(单位:毫米汞柱)
chol 血清胆固醇(单位:毫克/分升)
bsugar 空腹血糖是否大于120毫克/公升,1代表是,0代表否
ekg 静息心电图结果,取值0,1,2代表3中不同的结果
thalach 达到的最大心率
exang 是否有运动性心绞痛,1代表是0代表否
oldpeak 运动引起的ST段压低
slope 锻炼高峰期ST段的斜率,取值1代表上斜,2代表平坦,3代表下斜
ca 荧光染色的大血管数目,取值为0,1,2,3
thal 取值3代表正常,取值6代表固定缺陷,取值7代表可逆缺陷
target 因变量,直径减少50%以上的大血管数目,取值0,1,2,3,4
target2 因变量,取值1表示target大于0,取值0表示target等于0

在本文中我们使用tuneRF()函数,为训练数据集选择最优调节参数mtry来建立随机森林模型,并把模型应用于测试数据集进行预测。

二、对二元因变量target2进行预测

1、导入分析包和数据集

library(rpart)
library(dplyr)
library(randomForest)

并对heart_learning和heart_test数据集各分类变量转换为因子变量

heart_learning<-read.csv('F:/桌面/练习表格/heart_learning.csv',
                         colClasses=rep('numeric',15)) %>% mutate(pain=as.factor((pain))) %>% 
  mutate(ekg=as.factor(ekg)) %>% mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))
heart_test<-read.csv('F:/桌面/练习表格/heart_test.csv',
                     colClasses=rep('numeric',15)) %>% mutate(pain=as.factor((pain))) %>% 
  mutate(ekg=as.factor(ekg)) %>% mutate(slope=as.factor(slope)) %>% mutate(thal=as.factor(thal))

2、建立随机森林模型,使用tuneRF()函数,为训练数据集选择最优调节参数mtry

fit.RandomForest<-tuneRF(x=heart_learning[,1:13], y=as.factor(heart_learning$target2),
                         doBest = T)  

运行得到:最优mtry为3.

3、显示随机森林模型fit.RandomForest模型细节

4、显示fit.RandomForest模型结果与包括生成项目

attributes(fit.RandomForest)

5、根据随机森林fit.RandomForest生成的不同树,来绘制误差率

plot(fit.RandomForest)

6、得到随机森林各变量的重要程度

importance(fit.RandomForest)
varImpPlot(fit.RandomForest)

importance(fit.RandomForest)
        MeanDecreaseGini
age             9.168844
sex             2.641959
pain           12.301841
bpress          7.065327
chol            7.962259
bsugar          1.020983
ekg             1.866126
thalach        14.721451
exang           5.268893
oldpeak        12.147604
slope           4.348458
ca              8.667818
thal           13.389062

7、训练数据集heart_learning拟合效果

table(predict(fit.RandomForest),heart_learning$target2)

 table(predict(fit.RandomForest),heart_learning$target2)
   
     0  1
  0 98 25
  1 14 69

8、把得到的随机森林模型运用到测试数据集中heart_test.

prob.RandomForest.tuned<-predict(fit.RandomForest,heart_test[,1:13],type = 'prob')[,2]
class.RandomForest<-1*(prob.RandomForest.tuned>0.5)
conmat.RandomForest<-table(heart_test$target2,class.RandomForest)
conmat.RandomForest

运行得到:

conmat.RandomForest
   class.RandomForest
     0  1
  0 42  6
  1  9 34

或者

pred.RandomForest.tuned<-predict(fit.RandomForest,heart_test[,1:13])
pred.RandomForest.tuned
table(pred.RandomForest.tuned,heart_test$target2)

table(pred.RandomForest.tuned,heart_test$target2)
                       
pred.RandomForest.tuned  0  1
                      0 42  9
                      1  6 34

得到同样的结果

9、图形表示随机森林的测试效果,

plot(margin(fit.RandomForest,heart_test$target2))

数据点的边距为正确分类的比率减去被分到其他类别的最大比率,边距为正数说明数据划分正确。

help("margin")参考图形的具体含义

三、对多值因变量target进行预测

1、建立模型

fit.RandomForest <- tuneRF(x = heart_learning[,1:13], 
                           y = as.factor(heart_learning$target), 
                           doBest = T)

2、使用建立的随机森林模型对数据集进行预测,预测分类概率和预测类别

prob.RandomForest <-predict(fit.RandomForest,heart_test[,1:13],type="prob")

class.RandomForest <- apply(prob.RandomForest,1,which.max)-1

3、数据集的预测的效果

分类准确率

accu.1 <- 
  length(which(class.RandomForest==heart_test$target))/length(heart_test$target)

距离概念的分类准确率

accu2 <- mean(1-abs(class.RandomForest-heart_test$target)/(4-0))
accu.target1
accu.target2

运行得到:

accu.target2 <- 
+   mean(1-abs(class.RandomForest-heart_test$target)/(4-0))
> accu.target1
[1] 0.5274725
> accu.target2
[1] 0.8214286

4、真实值与预测值的列联表

table(class.RandomForest,heart_test$target)

table(class.RandomForest,heart_test$target)
                  
class.RandomForest  0  1  2  3  4
                 0 47 12  5  3  1
                 1  1  0  3  3  1
                 2  0  3  1  4  1
                 3  0  2  2  0  1
                 4  0  0  0  1  0

5、图形表示随机森林的测试效果

plot(margin(fit.RandomForest,heart_test$target))