R语言基础| 机器学习

写在前面

R语言中基础的机器学习主要有:分类、聚类、降维、回归(预测,自变量和因变量)这积累问题。拿到数据和问题首先要会判定是这4类中的哪一种。

此前我们也用专门的教程介绍过在Python中的机器学习:机器学习基础手册

本章学习Logistic 回归、决策树、随机森林、支持向量机

1) 概念

监督机器学习基于一组包含自变量和因变量的观测值。将全部数据集分为一个训练集和一个测试集;训练集用于预测模型,测试集用于测试模型的准确度。

本章将会用到rpart,rpart.plot和partykit包进行决策树模型及可视化;randomForest包拟合随机森林;通过e1071包构造支持向量机。

2) 机器学习乳腺数据癌步骤:

1.读取数据和预处理(筛选需要的变量)

2.拆分数据集:训练集和预测集(7:3或8:2)

3.建模,数据单位一致则不需要标准化,否则需要scale

4.预测结果不好则重新调整算法

5.预测结果好则应用于新数据(新观测值)

**16.1 数据准备 **

本章数据集使用威斯康星州乳腺癌数据集,该数据集共11个变量:ID、肿块厚度clumpThickness、细胞大小的均匀性sizeUniformity、细胞形状的均匀性shapeUniformity、边际附着力maginalAdhesion、单个上皮细胞大小singleEpithelialCellSize、裸核bareNuclei、乏味染色体blandChromatin、正常核normalNucleoli、有丝分裂mitosis和类别class.

16.1.1 数据在MASS包中,数据集名字为biopsy

library(MASS)head(biopsy)
##        ID V1 V2 V3 V4 V5 V6 V7 V8 V9     class## 1 1000025  5  1  1  1  2  1  3  1  1    benign## 2 1002945  5  4  4  5  7 10  3  2  1    benign## 3 1015425  3  1  1  1  2  2  3  1  1    benign## 4 1016277  6  8  8  1  3  4  3  7  1    benign## 5 1017023  4  1  1  3  2  1  3  1  1    benign## 6 1017122  8 10 10  8  7 10  9  7  1 malignant
df <- biopsydf <- df[-1]head(df)
##   V1 V2 V3 V4 V5 V6 V7 V8 V9     class## 1  5  1  1  1  2  1  3  1  1    benign## 2  5  4  4  5  7 10  3  2  1    benign## 3  3  1  1  1  2  2  3  1  1    benign## 4  6  8  8  1  3  4  3  7  1    benign## 5  4  1  1  3  2  1  3  1  1    benign## 6  8 10 10  8  7 10  9  7  1 malignant
names(df) <- c("clumpThickness","sizeUniformity","shapeUniformity","maginalAdhesion","singleEpithelialCellSize","bareNuclei","blandChromatin","normalNucleoli","mitosis","class")

class中benign为良性,malignant为恶性。

16.1.2 去除NA值

df <- na.omit(df)

16.1.3 抽样(sample),抽训练集(train)和测试集(test)

抽样前先加一个set.seed(1234),可以确保每次运行程序时生成的随机数序列是相同的,从而实现结果的可重复性。需要注意的是,set.seed()函数应该在随机数生成之前调用,以确保种子在生成随机数之前被设置。

只有set.seed()函数中的设置的数字相同则随机抽样的结果相同

set.seed(1234)train <- sample(nrow(df),0.7*nrow(df),replace = F)df.train <- df[train,]View(df.train)df.test <- df[-train,]View(df.test)

这里的0.7也可以改成0.8。一般是7:3或8:2

16.1.4 table检查数据的拆分情况

table(df.train$class)
## ##    benign malignant ##       302       176
table(df.test$class)
## ##    benign malignant ##       142        63

这步骤还有一个作用,可与后面模型预测的结果对比,观察模型预测的效果。

16.2 建模

16.2.1 方法一:Logistic回归(glm())

Logistic回归即逻辑回归,属于广义线性回归的一种。根据一组变量预测二元输出(例如是否,好和坏)。

  • 16.2.1.1 建模

fit.logit <- glm(class~.,data = df.train,family = binomial())summary(fit.logit)
## ## Call:## glm(formula = class ~ ., family = binomial(), data = df.train)## ## Coefficients:##                          Estimate Std. Error z value Pr(>|z|)    ## (Intercept)              -9.68650    1.29722  -7.467 8.20e-14 ***## clumpThickness            0.48002    0.15244   3.149  0.00164 ** ## sizeUniformity            0.05643    0.29272   0.193  0.84714    ## shapeUniformity           0.13180    0.31643   0.417  0.67703    ## maginalAdhesion           0.40721    0.14038   2.901  0.00372 ** ## singleEpithelialCellSize -0.03274    0.18095  -0.181  0.85643    ## bareNuclei                0.44744    0.11176   4.004 6.24e-05 ***## blandChromatin            0.48257    0.19220   2.511  0.01205 *  ## normalNucleoli            0.23550    0.12903   1.825  0.06798 .  ## mitosis                   0.66184    0.28785   2.299  0.02149 *  ## ---## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## ## (Dispersion parameter for binomial family taken to be 1)## ##     Null deviance: 629.040  on 477  degrees of freedom## Residual deviance:  80.054  on 468  degrees of freedom## AIC: 100.05## ## Number of Fisher Scoring iterations: 8

注:AIC(Akaike Information Criterion)是一种模型选择准则,用于比较不同模型的拟合优度和复杂度。在统计学中,AIC值是一种用于评估统计模型的相对优劣的指标。

AIC值越低,表示模型对数据的拟合越好且复杂度较低,因此更优于AIC值较高的模型。

结果中显示9个自变量的P值并不都小于0.05,因此可以将不显著的sizeUniformity和shapeUniformity、singleEpithelialCellSize去除后再次拟合模型。

  • 16.2.1.2 验证模型predict()

具体用法可以参考?predict()-predict.glm

prob <- predict(object = fit.logit,newdata = df.test,type = "response")prob
##            3            5            6            8            9           16 ## 0.0112449317 0.0258431337 0.9999625461 0.0051061434 0.0236199749 0.4672106476 ##           17           21           25           27           28           30 ## 0.0071994974 0.9997948553 0.0027758628 0.0048816533 0.0115838020 0.0013782551 ##           33           38           39           46           49           50 ## 0.9973585454 0.1877874448 0.9975955959 0.0033190843 0.0258431337 0.9814047180 ##           57           58           59           64           71           74 ## 0.9629829469 0.8156184585 0.7715802512 0.3224788592 0.0150250656 0.9997623868 ##           75           82           83           84           87           92 ## 0.8789463614 0.0107790970 0.0196950113 0.0726793680 0.7845629625 0.0041441570 ##           93           94           95           98          111          112 ## 0.0116130282 0.0017150684 0.0044784421 0.0186346093 0.0563315554 0.9205175298 ##          113          114          119          126          130          131 ## 0.9999639103 0.9980298628 0.0024243798 0.0017150684 0.0008153674 0.0150250656 ##          132          134          135          136          139          142 ## 0.0044784421 0.0056466030 0.0043238397 0.0454130370 0.0082054400 0.0017107090 ##          143          152          155          157          163          173 ## 0.9807771867 0.9871222852 0.0010592254 0.0020695344 0.0072177426 0.0017150684 ##          178          179          182          186          191          193 ## 0.9402769641 0.0116130282 0.0010592254 0.0046267909 0.9999560154 0.0115838020 ##          196          199          203          206          210          215 ## 0.0116130282 0.0010592254 0.0027758628 0.9999906580 0.0192428183 0.9999956479 ##          228          231          232          239          240          244 ## 0.9967019235 0.9928787724 0.9993185258 0.9999986898 0.9953604613 0.0419223255 ##          245          246          253          254          255          261 ## 0.0027758628 0.0427263017 0.9916847043 0.9979190679 0.9521833608 0.9999275421 ##          272          274          275          277          284          287 ## 0.0186346093 0.3161619709 0.0091169000 0.0044670902 0.9912296828 0.9999999001 ##          288          291          297          299          301          304 ## 0.0043238397 0.0010592254 0.7268339179 0.0284488362 0.9969425517 0.0027758628 ##          311          312          313          314          317          319 ## 0.0026798777 0.0010592254 0.9240485470 0.0010592254 0.8887971682 0.0025168532 ##          326          329          332          335          339          341 ## 0.0086003882 0.8792851364 0.0354998923 0.9912165606 0.0017720431 0.9973941797 ##          343          344          346          351          354          368 ## 0.0017107090 0.0010592254 0.0010592254 0.0160692402 0.9996650004 0.9999796693 ##          369          373          381          383          395          405 ## 0.0013782551 0.0082054400 0.0010592254 0.0164146326 0.0023604022 0.0031955036 ##          407          408          413          416          417          425 ## 0.0086776181 0.0017150684 0.9987294489 0.3017208118 0.9981615411 0.0027617842 ##          426          429          430          431          434          437 ## 0.9999965519 0.0017150684 0.0027688146 0.0024280604 0.0074914917 0.7622791536 ##          448          450          452          453          463          466 ## 0.0071812979 0.9998347506 0.0071812979 0.0062141459 0.0257150794 0.9998549548 ##          467          469          470          479          480          481 ## 0.9996824181 0.0044557670 0.0019562146 0.0075949935 0.9992835627 0.0074185118 ##          488          498          502          505          509          511 ## 0.9999971016 0.0047131973 0.0071994974 0.0010592254 0.0071812979 0.0010592254 ##          519          520          522          524          529          532 ## 0.0047252271 0.9888878694 0.0043128780 0.9990358935 0.0223519515 0.0086776181 ##          536          539          540          546          548          551 ## 0.0054147208 0.0071994974 0.0185880445 0.0115838020 0.0017675392 0.0044670902 ##          554          557          560          564          566          570 ## 0.1021246709 0.0214925224 0.0115838020 0.0044670902 0.9999763468 0.9998813632 ##          573          574          575          578          579          580 ## 0.0044670902 0.0017150684 0.9854868522 0.0017150684 0.0017150684 0.0027758628 ##          583          596          598          600          601          603 ## 0.9987812279 0.0115838020 0.0241193817 0.0116066211 0.0044670902 0.0071994974 ##          605          606          608          609          611          613 ## 0.9978381918 0.9998157200 0.0010592254 0.9998041683 0.9998905908 0.9999999873 ##          628          629          632          638          640          641 ## 0.0101570805 0.0017107090 0.0115838020 0.0386856158 0.0160692402 0.0100044442 ##          646          648          655          656          658          660 ## 0.0044670902 0.0023884049 0.0072177426 0.0044670902 0.0922590347 0.0010592254 ##          665          667          668          670          672          676 ## 0.0100297260 0.0248002530 0.0072177426 0.9982067529 0.0114264349 0.0066024464 ##          678          679          680          681          684          686 ## 0.0071812979 0.0010592254 0.0017107090 0.9999999658 0.0010592254 0.0010592254 ##          694 ## 0.0086227000

type= “response” 返回一个概率值。结果得到了预测肿瘤为恶性的概率,概率大于0.5的病例被分为恶性肿瘤,概率小于或等于0.5的被分为良性。

prob>0.5
##     3     5     6     8     9    16    17    21    25    27    28    30    33 ## FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE ##    38    39    46    49    50    57    58    59    64    71    74    75    82 ## FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE ##    83    84    87    92    93    94    95    98   111   112   113   114   119 ## FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE ##   126   130   131   132   134   135   136   139   142   143   152   155   157 ## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE ##   163   173   178   179   182   186   191   193   196   199   203   206   210 ## FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE ##   215   228   231   232   239   240   244   245   246   253   254   255   261 ##  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE ##   272   274   275   277   284   287   288   291   297   299   301   304   311 ## FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE ##   312   313   314   317   319   326   329   332   335   339   341   343   344 ## FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE ##   346   351   354   368   369   373   381   383   395   405   407   408   413 ## FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE ##   416   417   425   426   429   430   431   434   437   448   450   452   453 ## FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE ##   463   466   467   469   470   479   480   481   488   498   502   505   509 ## FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE ##   511   519   520   522   524   529   532   536   539   540   546   548   551 ## FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ##   554   557   560   564   566   570   573   574   575   578   579   580   583 ## FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE ##   596   598   600   601   603   605   606   608   609   611   613   628   629 ## FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE ##   632   638   640   641   646   648   655   656   658   660   665   667   668 ## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ##   670   672   676   678   679   680   681   684   686   694 ##  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
logit.pred <- factor(prob>0.5,levels = c(FALSE,TRUE),labels=c("benign","malignant"))

转换为因子,并且用良性和恶性作为标签来标记

比较真实和预测的结果:

data.frame(Actual=df.test$class,Predict=logit.pred)#比较真实的和预测的结果
##        Actual   Predict## 3      benign    benign## 5      benign    benign## 6   malignant malignant## 8      benign    benign## 9      benign    benign## 16  malignant    benign## 17     benign    benign## 21  malignant malignant## 25     benign    benign## 27     benign    benign## 28     benign    benign## 30     benign    benign## 33  malignant malignant## 38     benign    benign## 39  malignant malignant## 46     benign    benign## 49     benign    benign## 50  malignant malignant## 57  malignant malignant## 58  malignant malignant## 59  malignant malignant## 64  malignant    benign## 71     benign    benign## 74  malignant malignant## 75  malignant malignant## 82     benign    benign## 83     benign    benign## 84     benign    benign## 87  malignant malignant## 92     benign    benign## 93     benign    benign## 94     benign    benign## 95     benign    benign## 98     benign    benign## 111    benign    benign## 112 malignant malignant## 113 malignant malignant## 114 malignant malignant## 119    benign    benign## 126    benign    benign## 130    benign    benign## 131    benign    benign## 132    benign    benign## 134    benign    benign## 135    benign    benign## 136    benign    benign## 139    benign    benign## 142    benign    benign## 143 malignant malignant## 152 malignant malignant## 155    benign    benign## 157    benign    benign## 163    benign    benign## 173    benign    benign## 178 malignant malignant## 179    benign    benign## 182    benign    benign## 186    benign    benign## 191 malignant malignant## 193    benign    benign## 196    benign    benign## 199    benign    benign## 203    benign    benign## 206 malignant malignant## 210    benign    benign## 215 malignant malignant## 228 malignant malignant## 231 malignant malignant## 232 malignant malignant## 239 malignant malignant## 240 malignant malignant## 244    benign    benign## 245    benign    benign## 246    benign    benign## 253    benign malignant## 254 malignant malignant## 255 malignant malignant## 261 malignant malignant## 272    benign    benign## 274 malignant    benign## 275    benign    benign## 277    benign    benign## 284 malignant malignant## 287 malignant malignant## 288    benign    benign## 291    benign    benign## 297    benign malignant## 299    benign    benign## 301 malignant malignant## 304    benign    benign## 311    benign    benign## 312    benign    benign## 313 malignant malignant## 314    benign    benign## 317 malignant malignant## 319    benign    benign## 326    benign    benign## 329 malignant malignant## 332    benign    benign## 335 malignant malignant## 339    benign    benign## 341 malignant malignant## 343    benign    benign## 344    benign    benign## 346    benign    benign## 351    benign    benign## 354 malignant malignant## 368 malignant malignant## 369    benign    benign## 373    benign    benign## 381    benign    benign## 383    benign    benign## 395    benign    benign## 405    benign    benign## 407    benign    benign## 408    benign    benign## 413 malignant malignant## 416    benign    benign## 417 malignant malignant## 425    benign    benign## 426 malignant malignant## 429    benign    benign## 430    benign    benign## 431    benign    benign## 434    benign    benign## 437 malignant malignant## 448    benign    benign## 450 malignant malignant## 452    benign    benign## 453    benign    benign## 463    benign    benign## 466 malignant malignant## 467 malignant malignant## 469    benign    benign## 470    benign    benign## 479    benign    benign## 480 malignant malignant## 481    benign    benign## 488 malignant malignant## 498    benign    benign## 502    benign    benign## 505    benign    benign## 509    benign    benign## 511    benign    benign## 519    benign    benign## 520 malignant malignant## 522    benign    benign## 524 malignant malignant## 529    benign    benign## 532    benign    benign## 536    benign    benign## 539    benign    benign## 540    benign    benign## 546    benign    benign## 548    benign    benign## 551    benign    benign## 554    benign    benign## 557    benign    benign## 560    benign    benign## 564    benign    benign## 566 malignant malignant## 570 malignant malignant## 573    benign    benign## 574    benign    benign## 575 malignant malignant## 578    benign    benign## 579    benign    benign## 580    benign    benign## 583 malignant malignant## 596    benign    benign## 598    benign    benign## 600    benign    benign## 601    benign    benign## 603    benign    benign## 605 malignant malignant## 606 malignant malignant## 608    benign    benign## 609 malignant malignant## 611 malignant malignant## 613 malignant malignant## 628    benign    benign## 629    benign    benign## 632    benign    benign## 638    benign    benign## 640    benign    benign## 641    benign    benign## 646    benign    benign## 648    benign    benign## 655    benign    benign## 656    benign    benign## 658    benign    benign## 660    benign    benign## 665    benign    benign## 667    benign    benign## 668    benign    benign## 670 malignant malignant## 672    benign    benign## 676    benign    benign## 678    benign    benign## 679    benign    benign## 680    benign    benign## 681 malignant malignant## 684    benign    benign## 686    benign    benign## 694    benign    benign
logistic.pref <- table(df.test$class,logit.pred,dnn = c("Acutal","Predict"))#生成混淆矩阵logistic.pref
##            Predict## Acutal      benign malignant##   benign       140         2##   malignant      3        60

注:

table()函数中的参数dnn代表”dimnames”,它用于指定结果表格的维度名称。在特定情况下,dnn参数允许您为结果表的行和列提供自定义名称,以便更好地描述数据。

这里结果表的行名称将被命名为”Actual”,列名称将被命名为”Predict”。这样,生成的表格将具有更直观的标签来表示实际值和预测值之间的关系。

混淆矩阵解读:

预测中有140个为良性,其中2个预测错了,实际为142个为良性;60个为恶性,其中3个预测错了,实际上63个为恶性。

准确度计算

在该例子中,准确度为(140+60)/205=98%。

  • 16.2.1.3 优化模型

在该例子中模型预测的准确度还不错,可以不用优化。如果要优化,可以将P值不显著的那3个变量删除后重新预测模型。

16.2.2 方法二:决策树 rpart()

决策树的基本思想是对自变量进行二元分离,从而构造一颗可用于预测新观测值所属类别的树。包括经典决策树和条件推断树。

  • 16.2.2.1 经典决策树

1)建模-语法

library(rpart)library(rpart.plot)dtree <- rpart(formula, data=, method = "class", control = rpart.control(), ...)dtree$cptabledtree.pruned <- prune(dtree,cp=)#可选项,用于修剪决策树summary(dtree)rpart.plot(dtree,type=2)

rpart()参数:

formula: 用于指定模型的公式,通常采用自变量和因变量的关系描述。

data: 包含数据的数据框或其他可用于模型拟合的对象。

method: 用于指定分裂规则的方法。默认值为”anova”,表示采用方差分析进行分裂。其他可选值包括”class”(分类问题)和”exp”(指数损失函数)。

control: 控制决策树构建过程的参数设置。可以使用rpart.control()函数创建一个控制参数对象,也可以直接提供参数的值。

…: 其他可选参数,用于进一步控制模型拟合过程。

rpart.plot()参数:

type: 可视化类型的选择。默认值为2,表示绘制带有节点标签和箭头的决策树。其他可选值包括0(只绘制决策树的框架)和1(绘制带有节点标签但没有箭头的决策树)。…: 其他可选参数,用于进一步控制图形的外观和布局。

dtree$cptable

返回的结果中,cp为复杂度参数,用于惩罚过大的树;nsplit为分支的数量,确定树的大小,有n个分支则说明该树有n+1个终端节点;rel error 为训练集中各种树对应的误差率;xerror为交叉验证误差,即基于训练集所得的10折交叉验证误差;xstd为交叉验证误差的标准差。

2)验证模型

方法如上。

3)举例

library(rpart)library(rpart.plot)
## Warning: 程辑包'rpart.plot'是用R版本4.3.2 来建造的
dtree <- rpart(class~., data=df.train, method = "class")dtree$cptable
##           CP nsplit  rel error    xerror       xstd## 1 0.79545455      0 1.00000000 1.0000000 0.05991467## 2 0.07954545      1 0.20454545 0.2386364 0.03516748## 3 0.01704545      2 0.12500000 0.1818182 0.03104673## 4 0.01000000      5 0.07386364 0.1647727 0.02965484
summary(dtree)
## Call:## rpart(formula = class ~ ., data = df.train, method = "class")##   n= 478 ## ##           CP nsplit  rel error    xerror       xstd## 1 0.79545455      0 1.00000000 1.0000000 0.05991467## 2 0.07954545      1 0.20454545 0.2386364 0.03516748## 3 0.01704545      2 0.12500000 0.1818182 0.03104673## 4 0.01000000      5 0.07386364 0.1647727 0.02965484## ## Variable importance##           sizeUniformity          shapeUniformity           blandChromatin ##                       21                       18                       15 ## singleEpithelialCellSize           normalNucleoli          maginalAdhesion ##                       14                       14                       13 ##               bareNuclei           clumpThickness ##                        4                        2 ## ## Node number 1: 478 observations,    complexity param=0.7954545##   predicted class=benign     expected loss=0.3682008  P(node) =1##     class counts:   302   176##    probabilities: 0.632 0.368 ##   left son=2 (320 obs) right son=3 (158 obs)##   Primary splits:##       sizeUniformity           < 3.5 to the left,  improve=155.9749, (0 missing)##       shapeUniformity          < 3.5 to the left,  improve=152.4471, (0 missing)##       bareNuclei               < 2.5 to the left,  improve=141.3332, (0 missing)##       blandChromatin           < 3.5 to the left,  improve=139.3239, (0 missing)##       singleEpithelialCellSize < 2.5 to the left,  improve=132.7007, (0 missing)##   Surrogate splits:##       shapeUniformity          < 3.5 to the left,  agree=0.937, adj=0.810, (0 split)##       blandChromatin           < 3.5 to the left,  agree=0.900, adj=0.696, (0 split)##       singleEpithelialCellSize < 3.5 to the left,  agree=0.893, adj=0.677, (0 split)##       normalNucleoli           < 2.5 to the left,  agree=0.879, adj=0.633, (0 split)##       maginalAdhesion          < 3.5 to the left,  agree=0.874, adj=0.620, (0 split)## ## Node number 2: 320 observations,    complexity param=0.07954545##   predicted class=benign     expected loss=0.084375  P(node) =0.6694561##     class counts:   293    27##    probabilities: 0.916 0.084 ##   left son=4 (294 obs) right son=5 (26 obs)##   Primary splits:##       bareNuclei      < 4.5 to the left,  improve=26.54631, (0 missing)##       normalNucleoli  < 3.5 to the left,  improve=20.08477, (0 missing)##       clumpThickness  < 6.5 to the left,  improve=17.48577, (0 missing)##       shapeUniformity < 3.5 to the left,  improve=17.19825, (0 missing)##       blandChromatin  < 3.5 to the left,  improve=15.97866, (0 missing)##   Surrogate splits:##       clumpThickness           < 7.5 to the left,  agree=0.944, adj=0.308, (0 split)##       shapeUniformity          < 4.5 to the left,  agree=0.938, adj=0.231, (0 split)##       normalNucleoli           < 4.5 to the left,  agree=0.938, adj=0.231, (0 split)##       blandChromatin           < 4.5 to the left,  agree=0.931, adj=0.154, (0 split)##       singleEpithelialCellSize < 3.5 to the left,  agree=0.928, adj=0.115, (0 split)## ## Node number 3: 158 observations##   predicted class=malignant  expected loss=0.05696203  P(node) =0.3305439##     class counts:     9   149##    probabilities: 0.057 0.943 ## ## Node number 4: 294 observations,    complexity param=0.01704545##   predicted class=benign     expected loss=0.02380952  P(node) =0.6150628##     class counts:   287     7##    probabilities: 0.976 0.024 ##   left son=8 (272 obs) right son=9 (22 obs)##   Primary splits:##       bareNuclei      < 2.5 to the left,  improve=4.121212, (0 missing)##       blandChromatin  < 3.5 to the left,  improve=2.639362, (0 missing)##       normalNucleoli  < 3.5 to the left,  improve=2.349593, (0 missing)##       sizeUniformity  < 2.5 to the left,  improve=2.245614, (0 missing)##       shapeUniformity < 2.5 to the left,  improve=1.924300, (0 missing)##   Surrogate splits:##       mitosis < 2.5 to the left,  agree=0.929, adj=0.045, (0 split)## ## Node number 5: 26 observations,    complexity param=0.01704545##   predicted class=malignant  expected loss=0.2307692  P(node) =0.05439331##     class counts:     6    20##    probabilities: 0.231 0.769 ##   left son=10 (7 obs) right son=11 (19 obs)##   Primary splits:##       shapeUniformity          < 1.5 to the left,  improve=4.478890, (0 missing)##       sizeUniformity           < 1.5 to the left,  improve=4.430769, (0 missing)##       clumpThickness           < 3.5 to the left,  improve=3.591880, (0 missing)##       normalNucleoli           < 2   to the left,  improve=3.230769, (0 missing)##       singleEpithelialCellSize < 2.5 to the left,  improve=2.355769, (0 missing)##   Surrogate splits:##       sizeUniformity           < 1.5 to the left,  agree=0.885, adj=0.571, (0 split)##       singleEpithelialCellSize < 2.5 to the left,  agree=0.885, adj=0.571, (0 split)##       clumpThickness           < 1.5 to the left,  agree=0.846, adj=0.429, (0 split)##       maginalAdhesion          < 1.5 to the left,  agree=0.769, adj=0.143, (0 split)##       blandChromatin           < 1.5 to the left,  agree=0.769, adj=0.143, (0 split)## ## Node number 8: 272 observations##   predicted class=benign     expected loss=0  P(node) =0.5690377##     class counts:   272     0##    probabilities: 1.000 0.000 ## ## Node number 9: 22 observations,    complexity param=0.01704545##   predicted class=benign     expected loss=0.3181818  P(node) =0.0460251##     class counts:    15     7##    probabilities: 0.682 0.318 ##   left son=18 (14 obs) right son=19 (8 obs)##   Primary splits:##       clumpThickness           < 4.5 to the left,  improve=7.795455, (0 missing)##       sizeUniformity           < 2.5 to the left,  improve=5.964502, (0 missing)##       shapeUniformity          < 2.5 to the left,  improve=5.964502, (0 missing)##       blandChromatin           < 2.5 to the left,  improve=4.454545, (0 missing)##       singleEpithelialCellSize < 2.5 to the left,  improve=2.366883, (0 missing)##   Surrogate splits:##       sizeUniformity  < 1.5 to the left,  agree=0.864, adj=0.625, (0 split)##       shapeUniformity < 2.5 to the left,  agree=0.864, adj=0.625, (0 split)##       normalNucleoli  < 1.5 to the left,  agree=0.864, adj=0.625, (0 split)##       maginalAdhesion < 3.5 to the left,  agree=0.818, adj=0.500, (0 split)##       blandChromatin  < 3.5 to the left,  agree=0.818, adj=0.500, (0 split)## ## Node number 10: 7 observations##   predicted class=benign     expected loss=0.2857143  P(node) =0.01464435##     class counts:     5     2##    probabilities: 0.714 0.286 ## ## Node number 11: 19 observations##   predicted class=malignant  expected loss=0.05263158  P(node) =0.03974895##     class counts:     1    18##    probabilities: 0.053 0.947 ## ## Node number 18: 14 observations##   predicted class=benign     expected loss=0  P(node) =0.0292887##     class counts:    14     0##    probabilities: 1.000 0.000 ## ## Node number 19: 8 observations##   predicted class=malignant  expected loss=0.125  P(node) =0.0167364##     class counts:     1     7##    probabilities: 0.125 0.875
rpart.plot(dtree,type=2)
1.webp (2).jpg
class <- predict(object = dtree,newdata = df.test,type = "class")data.frame(Actual=df.test$class,Predict=class)#比较真实的和预测的结果
##        Actual   Predict## 3      benign    benign## 5      benign    benign## 6   malignant malignant## 8      benign    benign## 9      benign    benign## 16  malignant malignant## 17     benign    benign## 21  malignant malignant## 25     benign    benign## 27     benign    benign## 28     benign    benign## 30     benign    benign## 33  malignant malignant## 38     benign    benign## 39  malignant malignant## 46     benign    benign## 49     benign    benign## 50  malignant malignant## 57  malignant malignant## 58  malignant    benign## 59  malignant malignant## 64  malignant    benign## 71     benign    benign## 74  malignant malignant## 75  malignant malignant## 82     benign    benign## 83     benign    benign## 84     benign    benign## 87  malignant malignant## 92     benign    benign## 93     benign    benign## 94     benign    benign## 95     benign    benign## 98     benign    benign## 111    benign    benign## 112 malignant malignant## 113 malignant malignant## 114 malignant malignant## 119    benign    benign## 126    benign    benign## 130    benign    benign## 131    benign    benign## 132    benign    benign## 134    benign    benign## 135    benign    benign## 136    benign    benign## 139    benign    benign## 142    benign    benign## 143 malignant malignant## 152 malignant malignant## 155    benign    benign## 157    benign    benign## 163    benign    benign## 173    benign    benign## 178 malignant malignant## 179    benign    benign## 182    benign    benign## 186    benign    benign## 191 malignant malignant## 193    benign    benign## 196    benign    benign## 199    benign    benign## 203    benign    benign## 206 malignant malignant## 210    benign    benign## 215 malignant malignant## 228 malignant malignant## 231 malignant malignant## 232 malignant malignant## 239 malignant malignant## 240 malignant malignant## 244    benign    benign## 245    benign    benign## 246    benign    benign## 253    benign malignant## 254 malignant malignant## 255 malignant malignant## 261 malignant malignant## 272    benign    benign## 274 malignant malignant## 275    benign    benign## 277    benign    benign## 284 malignant malignant## 287 malignant malignant## 288    benign    benign## 291    benign    benign## 297    benign malignant## 299    benign    benign## 301 malignant malignant## 304    benign    benign## 311    benign    benign## 312    benign    benign## 313 malignant malignant## 314    benign    benign## 317 malignant malignant## 319    benign    benign## 326    benign    benign## 329 malignant malignant## 332    benign    benign## 335 malignant malignant## 339    benign    benign## 341 malignant malignant## 343    benign    benign## 344    benign    benign## 346    benign    benign## 351    benign    benign## 354 malignant malignant## 368 malignant malignant## 369    benign    benign## 373    benign    benign## 381    benign    benign## 383    benign    benign## 395    benign    benign## 405    benign    benign## 407    benign    benign## 408    benign    benign## 413 malignant malignant## 416    benign    benign## 417 malignant malignant## 425    benign    benign## 426 malignant malignant## 429    benign    benign## 430    benign    benign## 431    benign    benign## 434    benign    benign## 437 malignant malignant## 448    benign    benign## 450 malignant malignant## 452    benign    benign## 453    benign    benign## 463    benign    benign## 466 malignant malignant## 467 malignant malignant## 469    benign    benign## 470    benign    benign## 479    benign    benign## 480 malignant malignant## 481    benign    benign## 488 malignant malignant## 498    benign    benign## 502    benign    benign## 505    benign    benign## 509    benign    benign## 511    benign    benign## 519    benign    benign## 520 malignant malignant## 522    benign    benign## 524 malignant malignant## 529    benign    benign## 532    benign    benign## 536    benign    benign## 539    benign    benign## 540    benign    benign## 546    benign    benign## 548    benign    benign## 551    benign    benign## 554    benign malignant## 557    benign    benign## 560    benign    benign## 564    benign    benign## 566 malignant malignant## 570 malignant malignant## 573    benign    benign## 574    benign    benign## 575 malignant malignant## 578    benign    benign## 579    benign    benign## 580    benign    benign## 583 malignant malignant## 596    benign    benign## 598    benign    benign## 600    benign    benign## 601    benign    benign## 603    benign    benign## 605 malignant malignant## 606 malignant malignant## 608    benign    benign## 609 malignant malignant## 611 malignant malignant## 613 malignant malignant## 628    benign    benign## 629    benign    benign## 632    benign    benign## 638    benign    benign## 640    benign    benign## 641    benign    benign## 646    benign    benign## 648    benign    benign## 655    benign    benign## 656    benign    benign## 658    benign malignant## 660    benign    benign## 665    benign    benign## 667    benign    benign## 668    benign    benign## 670 malignant malignant## 672    benign    benign## 676    benign    benign## 678    benign    benign## 679    benign    benign## 680    benign    benign## 681 malignant malignant## 684    benign    benign## 686    benign    benign## 694    benign    benign
dtree.pref <- table(df.test$class,class,dnn = c("Acutal","Predict"))#生成混淆矩阵acc <- sum(diag(dtree.pref))/nrow(df.test)*100 #计算准确度print(acc)
## [1] 97.07317

结果显示准确率达到97%

  • 16.2.2.2 条件决策树Conditional Inference Tree(ctree)

1)建模-语法

library(partykit)fit.ctree <- ctree(formula, data=, control = rpart.control(), ...)plot(fit.ctree)

2)举例

library(partykit)
## Warning: 程辑包'partykit'是用R版本4.3.2 来建造的
## 载入需要的程辑包:libcoin
## Warning: 程辑包'libcoin'是用R版本4.3.2 来建造的
fit.ctree <- ctree(class~., data=df.train)plot(fit.ctree)
1.webp (3).jpg
pred <- predict(object = fit.ctree,newdata = df.test,type = "response")pred
##         3         5         6         8         9        16        17        21 ##    benign    benign malignant    benign    benign malignant    benign malignant ##        25        27        28        30        33        38        39        46 ##    benign    benign    benign    benign malignant    benign malignant    benign ##        49        50        57        58        59        64        71        74 ##    benign malignant malignant    benign malignant    benign    benign malignant ##        75        82        83        84        87        92        93        94 ## malignant    benign    benign    benign malignant    benign    benign    benign ##        95        98       111       112       113       114       119       126 ##    benign    benign    benign malignant malignant malignant    benign    benign ##       130       131       132       134       135       136       139       142 ##    benign    benign    benign    benign    benign    benign    benign    benign ##       143       152       155       157       163       173       178       179 ## malignant malignant    benign    benign    benign    benign malignant    benign ##       182       186       191       193       196       199       203       206 ##    benign    benign malignant    benign    benign    benign    benign malignant ##       210       215       228       231       232       239       240       244 ##    benign malignant malignant malignant malignant malignant malignant    benign ##       245       246       253       254       255       261       272       274 ##    benign    benign malignant malignant malignant malignant    benign malignant ##       275       277       284       287       288       291       297       299 ##    benign    benign malignant malignant    benign    benign malignant    benign ##       301       304       311       312       313       314       317       319 ## malignant    benign    benign    benign malignant    benign malignant    benign ##       326       329       332       335       339       341       343       344 ##    benign malignant    benign malignant    benign malignant    benign    benign ##       346       351       354       368       369       373       381       383 ##    benign    benign malignant malignant    benign    benign    benign    benign ##       395       405       407       408       413       416       417       425 ##    benign    benign    benign    benign malignant    benign malignant    benign ##       426       429       430       431       434       437       448       450 ## malignant    benign    benign    benign    benign malignant    benign malignant ##       452       453       463       466       467       469       470       479 ##    benign    benign    benign malignant malignant    benign    benign    benign ##       480       481       488       498       502       505       509       511 ## malignant    benign malignant    benign    benign    benign    benign    benign ##       519       520       522       524       529       532       536       539 ##    benign malignant    benign malignant    benign    benign    benign    benign ##       540       546       548       551       554       557       560       564 ##    benign    benign    benign    benign malignant    benign    benign    benign ##       566       570       573       574       575       578       579       580 ## malignant malignant    benign    benign malignant    benign    benign    benign ##       583       596       598       600       601       603       605       606 ## malignant    benign    benign    benign    benign    benign malignant malignant ##       608       609       611       613       628       629       632       638 ##    benign malignant malignant malignant    benign    benign    benign    benign ##       640       641       646       648       655       656       658       660 ##    benign    benign    benign    benign    benign    benign malignant    benign ##       665       667       668       670       672       676       678       679 ##    benign    benign    benign malignant    benign    benign    benign    benign ##       680       681       684       686       694 ##    benign malignant    benign    benign    benign ## Levels: benign malignant
data.frame(Actual=df.test$class,Predict=pred)#比较真实的和预测的结果
##        Actual   Predict## 3      benign    benign## 5      benign    benign## 6   malignant malignant## 8      benign    benign## 9      benign    benign## 16  malignant malignant## 17     benign    benign## 21  malignant malignant## 25     benign    benign## 27     benign    benign## 28     benign    benign## 30     benign    benign## 33  malignant malignant## 38     benign    benign## 39  malignant malignant## 46     benign    benign## 49     benign    benign## 50  malignant malignant## 57  malignant malignant## 58  malignant    benign## 59  malignant malignant## 64  malignant    benign## 71     benign    benign## 74  malignant malignant## 75  malignant malignant## 82     benign    benign## 83     benign    benign## 84     benign    benign## 87  malignant malignant## 92     benign    benign## 93     benign    benign## 94     benign    benign## 95     benign    benign## 98     benign    benign## 111    benign    benign## 112 malignant malignant## 113 malignant malignant## 114 malignant malignant## 119    benign    benign## 126    benign    benign## 130    benign    benign## 131    benign    benign## 132    benign    benign## 134    benign    benign## 135    benign    benign## 136    benign    benign## 139    benign    benign## 142    benign    benign## 143 malignant malignant## 152 malignant malignant## 155    benign    benign## 157    benign    benign## 163    benign    benign## 173    benign    benign## 178 malignant malignant## 179    benign    benign## 182    benign    benign## 186    benign    benign## 191 malignant malignant## 193    benign    benign## 196    benign    benign## 199    benign    benign## 203    benign    benign## 206 malignant malignant## 210    benign    benign## 215 malignant malignant## 228 malignant malignant## 231 malignant malignant## 232 malignant malignant## 239 malignant malignant## 240 malignant malignant## 244    benign    benign## 245    benign    benign## 246    benign    benign## 253    benign malignant## 254 malignant malignant## 255 malignant malignant## 261 malignant malignant## 272    benign    benign## 274 malignant malignant## 275    benign    benign## 277    benign    benign## 284 malignant malignant## 287 malignant malignant## 288    benign    benign## 291    benign    benign## 297    benign malignant## 299    benign    benign## 301 malignant malignant## 304    benign    benign## 311    benign    benign## 312    benign    benign## 313 malignant malignant## 314    benign    benign## 317 malignant malignant## 319    benign    benign## 326    benign    benign## 329 malignant malignant## 332    benign    benign## 335 malignant malignant## 339    benign    benign## 341 malignant malignant## 343    benign    benign## 344    benign    benign## 346    benign    benign## 351    benign    benign## 354 malignant malignant## 368 malignant malignant## 369    benign    benign## 373    benign    benign## 381    benign    benign## 383    benign    benign## 395    benign    benign## 405    benign    benign## 407    benign    benign## 408    benign    benign## 413 malignant malignant## 416    benign    benign## 417 malignant malignant## 425    benign    benign## 426 malignant malignant## 429    benign    benign## 430    benign    benign## 431    benign    benign## 434    benign    benign## 437 malignant malignant## 448    benign    benign## 450 malignant malignant## 452    benign    benign## 453    benign    benign## 463    benign    benign## 466 malignant malignant## 467 malignant malignant## 469    benign    benign## 470    benign    benign## 479    benign    benign## 480 malignant malignant## 481    benign    benign## 488 malignant malignant## 498    benign    benign## 502    benign    benign## 505    benign    benign## 509    benign    benign## 511    benign    benign## 519    benign    benign## 520 malignant malignant## 522    benign    benign## 524 malignant malignant## 529    benign    benign## 532    benign    benign## 536    benign    benign## 539    benign    benign## 540    benign    benign## 546    benign    benign## 548    benign    benign## 551    benign    benign## 554    benign malignant## 557    benign    benign## 560    benign    benign## 564    benign    benign## 566 malignant malignant## 570 malignant malignant## 573    benign    benign## 574    benign    benign## 575 malignant malignant## 578    benign    benign## 579    benign    benign## 580    benign    benign## 583 malignant malignant## 596    benign    benign## 598    benign    benign## 600    benign    benign## 601    benign    benign## 603    benign    benign## 605 malignant malignant## 606 malignant malignant## 608    benign    benign## 609 malignant malignant## 611 malignant malignant## 613 malignant malignant## 628    benign    benign## 629    benign    benign## 632    benign    benign## 638    benign    benign## 640    benign    benign## 641    benign    benign## 646    benign    benign## 648    benign    benign## 655    benign    benign## 656    benign    benign## 658    benign malignant## 660    benign    benign## 665    benign    benign## 667    benign    benign## 668    benign    benign## 670 malignant malignant## 672    benign    benign## 676    benign    benign## 678    benign    benign## 679    benign    benign## 680    benign    benign## 681 malignant malignant## 684    benign    benign## 686    benign    benign## 694    benign    benign
t <- table(df.test$class,pred,dnn = c("Acutal","Predict"))#生成混淆矩阵acc <- sum(diag(t))/nrow(df.test)*100 #计算准确度print(acc)
## [1] 97.07317

结果显示条件决策树方法下的结果准确率也是97%

16.2.3 随机森林(random forest, RF)

需要用的R包是randomForest,该包是基于经典决策树生成随机森林。

  • 16.2.3.1 语法

randomForest()函数的用法可以参考??randomForest()-randomForest::randomForest

library(randomForest)set.seed()fit.forest <- randomForest(y~.,data=train, importance= )fit.forestimportance(fit.forest,type=2)forest.pred <- predict(fit.forest,test)data.frame(Actual=test$y,Predict=forest.pred)#比较真实的和预测的结果randomForest.pref <- table(test$y,forest.pred,dnn = c("Acutal","Predict"))#生成混淆矩阵acc <- sum(diag(randomForest.pref))/nrow(test)*100 #计算准确度print(acc)

注:

1)随机森林可以计算/度量变量的重要性,即设置importance=TRUE

importance: 这是一个逻辑值,用于指定是否计算变量的重要性。设置为TRUE表示计算变量的重要性,设置为FALSE表示不计算。变量的重要性指标可以帮助了解哪些变量对于模型的预测性能最为关键。

2)type的设置:

type = 1:使用MeanDecreaseAccuracy方法计算变量重要性。该方法通过对每个决策树进行预测,并比较预测准确率的变化来评估变量的重要性。它衡量的是每个变量在模型预测中对准确率的影响。

type = 2:使用MeanDecreaseGini方法计算变量重要性。该方法通过测量每个变量在决策树节点中用于分割样本的不纯度减少来评估变量的重要性。它衡量的是每个变量在模型中的分割能力。

type = 3:使用MeanDecreaseImpurity方法计算变量重要性。该方法与MeanDecreaseGini方法类似,但在计算每个变量的重要性时,考虑了每个变量在树的分割中使用的权重。

type = “node”:计算每个变量在每个节点上被使用的次数。

  • 16.2.3.2 举例

library(randomForest)
## Warning: 程辑包'randomForest'是用R版本4.3.2 来建造的
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## ## 载入程辑包:'randomForest'
## The following object is masked from 'package:rattle':## ##     importance
## The following object is masked from 'package:psych':## ##     outlier
## The following object is masked from 'package:ggplot2':## ##     margin
## The following object is masked from 'package:dplyr':## ##     combine
set.seed(1234)fit.forest <- randomForest(class~.,data=df.train, importance=TRUE)fit.forest
## ## Call:##  randomForest(formula = class ~ ., data = df.train, importance = TRUE) ##                Type of random forest: classification##                      Number of trees: 500## No. of variables tried at each split: 3## ##         OOB estimate of  error rate: 2.93%## Confusion matrix:##           benign malignant class.error## benign       293         9  0.02980132## malignant      5       171  0.02840909
importance(fit.forest,type = 2)
##                          MeanDecreaseGini## clumpThickness                   9.794852## sizeUniformity                  58.635963## shapeUniformity                 49.754466## maginalAdhesion                  8.373530## singleEpithelialCellSize        16.814313## bareNuclei                      36.621347## blandChromatin                  25.179804## normalNucleoli                  14.177153## mitosis                          2.015803

可以看到sizeUniformity是最重要的变量,mitosis 是最不重要的变量。

forest.pred <- predict(fit.forest,df.test)data.frame(Actual=df.test$class,Predict=forest.pred)#比较真实的和预测的结果
##        Actual   Predict## 3      benign    benign## 5      benign    benign## 6   malignant malignant## 8      benign    benign## 9      benign    benign## 16  malignant    benign## 17     benign    benign## 21  malignant malignant## 25     benign    benign## 27     benign    benign## 28     benign    benign## 30     benign    benign## 33  malignant malignant## 38     benign    benign## 39  malignant malignant## 46     benign    benign## 49     benign    benign## 50  malignant malignant## 57  malignant malignant## 58  malignant    benign## 59  malignant malignant## 64  malignant    benign## 71     benign    benign## 74  malignant malignant## 75  malignant malignant## 82     benign    benign## 83     benign    benign## 84     benign    benign## 87  malignant malignant## 92     benign    benign## 93     benign    benign## 94     benign    benign## 95     benign    benign## 98     benign    benign## 111    benign    benign## 112 malignant malignant## 113 malignant malignant## 114 malignant malignant## 119    benign    benign## 126    benign    benign## 130    benign    benign## 131    benign    benign## 132    benign    benign## 134    benign    benign## 135    benign    benign## 136    benign    benign## 139    benign    benign## 142    benign    benign## 143 malignant malignant## 152 malignant malignant## 155    benign    benign## 157    benign    benign## 163    benign    benign## 173    benign    benign## 178 malignant malignant## 179    benign    benign## 182    benign    benign## 186    benign    benign## 191 malignant malignant## 193    benign    benign## 196    benign    benign## 199    benign    benign## 203    benign    benign## 206 malignant malignant## 210    benign    benign## 215 malignant malignant## 228 malignant malignant## 231 malignant malignant## 232 malignant malignant## 239 malignant malignant## 240 malignant malignant## 244    benign    benign## 245    benign    benign## 246    benign    benign## 253    benign malignant## 254 malignant malignant## 255 malignant malignant## 261 malignant malignant## 272    benign    benign## 274 malignant malignant## 275    benign    benign## 277    benign    benign## 284 malignant malignant## 287 malignant malignant## 288    benign    benign## 291    benign    benign## 297    benign malignant## 299    benign    benign## 301 malignant malignant## 304    benign    benign## 311    benign    benign## 312    benign    benign## 313 malignant malignant## 314    benign    benign## 317 malignant malignant## 319    benign    benign## 326    benign    benign## 329 malignant malignant## 332    benign    benign## 335 malignant malignant## 339    benign    benign## 341 malignant malignant## 343    benign    benign## 344    benign    benign## 346    benign    benign## 351    benign    benign## 354 malignant malignant## 368 malignant malignant## 369    benign    benign## 373    benign    benign## 381    benign    benign## 383    benign    benign## 395    benign    benign## 405    benign    benign## 407    benign    benign## 408    benign    benign## 413 malignant malignant## 416    benign    benign## 417 malignant malignant## 425    benign    benign## 426 malignant malignant## 429    benign    benign## 430    benign    benign## 431    benign    benign## 434    benign    benign## 437 malignant malignant## 448    benign    benign## 450 malignant malignant## 452    benign    benign## 453    benign    benign## 463    benign    benign## 466 malignant malignant## 467 malignant malignant## 469    benign    benign## 470    benign    benign## 479    benign    benign## 480 malignant malignant## 481    benign    benign## 488 malignant malignant## 498    benign    benign## 502    benign    benign## 505    benign    benign## 509    benign    benign## 511    benign    benign## 519    benign    benign## 520 malignant malignant## 522    benign    benign## 524 malignant malignant## 529    benign    benign## 532    benign    benign## 536    benign    benign## 539    benign    benign## 540    benign    benign## 546    benign    benign## 548    benign    benign## 551    benign    benign## 554    benign    benign## 557    benign    benign## 560    benign    benign## 564    benign    benign## 566 malignant malignant## 570 malignant malignant## 573    benign    benign## 574    benign    benign## 575 malignant malignant## 578    benign    benign## 579    benign    benign## 580    benign    benign## 583 malignant malignant## 596    benign    benign## 598    benign    benign## 600    benign    benign## 601    benign    benign## 603    benign    benign## 605 malignant malignant## 606 malignant malignant## 608    benign    benign## 609 malignant malignant## 611 malignant malignant## 613 malignant malignant## 628    benign    benign## 629    benign    benign## 632    benign    benign## 638    benign    benign## 640    benign    benign## 641    benign    benign## 646    benign    benign## 648    benign    benign## 655    benign    benign## 656    benign    benign## 658    benign    benign## 660    benign    benign## 665    benign    benign## 667    benign    benign## 668    benign    benign## 670 malignant malignant## 672    benign    benign## 676    benign    benign## 678    benign    benign## 679    benign    benign## 680    benign    benign## 681 malignant malignant## 684    benign    benign## 686    benign    benign## 694    benign    benign
randomForest.pref<- table(df.test$class,forest.pred,dnn = c("Acutal","Predict"))#生成混淆矩阵acc <- sum(diag(randomForest.pref))/nrow(df.test)*100 #计算准确度print(acc)
## [1] 97.56098
plot(fit.forest)#生成随机森林的图片
1.webp (4).jpg

结果显示随机森林预测的准确率达到97%。

16.2.4 支持向量机(support vector machines,SVM)

SVM是一类可用于分类和回归的监督机器学习模型。

SVM 旨在多维空间中找到一个能将全部观测值分成两类的最优平面,这一平面使得两类中距离最近的观测值的间距(margin)尽可能大,在间距边界上的点被称为支持向量,分割的超平面位于间距的中间。

  • 16.2.4.1 语法

kernlab包的ksvm()函数和e1071包中的svm()函数都可以实现SYM,其中ksvm()功能更强大,但svm()相对更简单。

library(e1071)set.seed()fit.svm <- svm(y~.,data= train)fit.svmsvm.pred <- predict(fit.svm,test)#test指训练集data.frame(Actual=test$y,Predict=svm.pred)#比较真实的和预测的结果,y指因变量svm.pref <- table(test$y,svm.pred,dnn = c("Acutal","Predict"))#生成混淆矩阵acc <- sum(diag(svm.pref))/nrow(test)*100 #计算准确度print(acc)
  • 16.2.4.2 举例

library(e1071)
## Warning: 程辑包'e1071'是用R版本4.3.2 来建造的
## ## 载入程辑包:'e1071'
## The following object is masked from 'package:flexclust':## ##     bclust
## The following object is masked from 'package:Hmisc':## ##     impute
set.seed(1234)fit.svm <- svm(class~.,data= df.train)fit.svm
## ## Call:## svm(formula = class ~ ., data = df.train)## ## ## Parameters:##    SVM-Type:  C-classification ##  SVM-Kernel:  radial ##        cost:  1 ## ## Number of Support Vectors:  84
svm.pred <- predict(fit.svm,df.test)svm.pred
##         3         5         6         8         9        16        17        21 ##    benign    benign malignant    benign    benign malignant    benign malignant ##        25        27        28        30        33        38        39        46 ##    benign    benign    benign    benign malignant    benign malignant    benign ##        49        50        57        58        59        64        71        74 ##    benign malignant malignant malignant malignant malignant    benign malignant ##        75        82        83        84        87        92        93        94 ## malignant    benign    benign    benign malignant    benign    benign    benign ##        95        98       111       112       113       114       119       126 ##    benign    benign    benign malignant malignant malignant    benign    benign ##       130       131       132       134       135       136       139       142 ## malignant    benign    benign    benign    benign    benign    benign    benign ##       143       152       155       157       163       173       178       179 ## malignant malignant    benign    benign    benign    benign malignant    benign ##       182       186       191       193       196       199       203       206 ##    benign    benign malignant    benign    benign    benign    benign malignant ##       210       215       228       231       232       239       240       244 ##    benign malignant malignant malignant malignant malignant malignant    benign ##       245       246       253       254       255       261       272       274 ##    benign    benign malignant malignant malignant malignant    benign malignant ##       275       277       284       287       288       291       297       299 ##    benign    benign malignant malignant    benign    benign malignant    benign ##       301       304       311       312       313       314       317       319 ## malignant    benign    benign    benign malignant    benign malignant    benign ##       326       329       332       335       339       341       343       344 ##    benign malignant    benign malignant    benign malignant    benign    benign ##       346       351       354       368       369       373       381       383 ##    benign    benign malignant malignant    benign    benign    benign    benign ##       395       405       407       408       413       416       417       425 ##    benign    benign    benign    benign malignant    benign malignant    benign ##       426       429       430       431       434       437       448       450 ## malignant    benign    benign    benign    benign malignant    benign malignant ##       452       453       463       466       467       469       470       479 ##    benign    benign    benign malignant malignant    benign    benign    benign ##       480       481       488       498       502       505       509       511 ## malignant    benign malignant    benign    benign    benign    benign    benign ##       519       520       522       524       529       532       536       539 ##    benign malignant    benign malignant    benign    benign    benign    benign ##       540       546       548       551       554       557       560       564 ##    benign    benign    benign    benign    benign    benign    benign    benign ##       566       570       573       574       575       578       579       580 ## malignant malignant    benign    benign malignant    benign    benign    benign ##       583       596       598       600       601       603       605       606 ## malignant    benign    benign    benign    benign    benign malignant malignant ##       608       609       611       613       628       629       632       638 ##    benign malignant malignant malignant    benign    benign    benign    benign ##       640       641       646       648       655       656       658       660 ##    benign    benign    benign    benign    benign    benign malignant    benign ##       665       667       668       670       672       676       678       679 ##    benign    benign    benign malignant    benign    benign    benign    benign ##       680       681       684       686       694 ##    benign malignant    benign    benign    benign ## Levels: benign malignant
data.frame(Actual=df.test$class,Predict=svm.pred)#比较真实的和预测的结果
##        Actual   Predict## 3      benign    benign## 5      benign    benign## 6   malignant malignant## 8      benign    benign## 9      benign    benign## 16  malignant malignant## 17     benign    benign## 21  malignant malignant## 25     benign    benign## 27     benign    benign## 28     benign    benign## 30     benign    benign## 33  malignant malignant## 38     benign    benign## 39  malignant malignant## 46     benign    benign## 49     benign    benign## 50  malignant malignant## 57  malignant malignant## 58  malignant malignant## 59  malignant malignant## 64  malignant malignant## 71     benign    benign## 74  malignant malignant## 75  malignant malignant## 82     benign    benign## 83     benign    benign## 84     benign    benign## 87  malignant malignant## 92     benign    benign## 93     benign    benign## 94     benign    benign## 95     benign    benign## 98     benign    benign## 111    benign    benign## 112 malignant malignant## 113 malignant malignant## 114 malignant malignant## 119    benign    benign## 126    benign    benign## 130    benign malignant## 131    benign    benign## 132    benign    benign## 134    benign    benign## 135    benign    benign## 136    benign    benign## 139    benign    benign## 142    benign    benign## 143 malignant malignant## 152 malignant malignant## 155    benign    benign## 157    benign    benign## 163    benign    benign## 173    benign    benign## 178 malignant malignant## 179    benign    benign## 182    benign    benign## 186    benign    benign## 191 malignant malignant## 193    benign    benign## 196    benign    benign## 199    benign    benign## 203    benign    benign## 206 malignant malignant## 210    benign    benign## 215 malignant malignant## 228 malignant malignant## 231 malignant malignant## 232 malignant malignant## 239 malignant malignant## 240 malignant malignant## 244    benign    benign## 245    benign    benign## 246    benign    benign## 253    benign malignant## 254 malignant malignant## 255 malignant malignant## 261 malignant malignant## 272    benign    benign## 274 malignant malignant## 275    benign    benign## 277    benign    benign## 284 malignant malignant## 287 malignant malignant## 288    benign    benign## 291    benign    benign## 297    benign malignant## 299    benign    benign## 301 malignant malignant## 304    benign    benign## 311    benign    benign## 312    benign    benign## 313 malignant malignant## 314    benign    benign## 317 malignant malignant## 319    benign    benign## 326    benign    benign## 329 malignant malignant## 332    benign    benign## 335 malignant malignant## 339    benign    benign## 341 malignant malignant## 343    benign    benign## 344    benign    benign## 346    benign    benign## 351    benign    benign## 354 malignant malignant## 368 malignant malignant## 369    benign    benign## 373    benign    benign## 381    benign    benign## 383    benign    benign## 395    benign    benign## 405    benign    benign## 407    benign    benign## 408    benign    benign## 413 malignant malignant## 416    benign    benign## 417 malignant malignant## 425    benign    benign## 426 malignant malignant## 429    benign    benign## 430    benign    benign## 431    benign    benign## 434    benign    benign## 437 malignant malignant## 448    benign    benign## 450 malignant malignant## 452    benign    benign## 453    benign    benign## 463    benign    benign## 466 malignant malignant## 467 malignant malignant## 469    benign    benign## 470    benign    benign## 479    benign    benign## 480 malignant malignant## 481    benign    benign## 488 malignant malignant## 498    benign    benign## 502    benign    benign## 505    benign    benign## 509    benign    benign## 511    benign    benign## 519    benign    benign## 520 malignant malignant## 522    benign    benign## 524 malignant malignant## 529    benign    benign## 532    benign    benign## 536    benign    benign## 539    benign    benign## 540    benign    benign## 546    benign    benign## 548    benign    benign## 551    benign    benign## 554    benign    benign## 557    benign    benign## 560    benign    benign## 564    benign    benign## 566 malignant malignant## 570 malignant malignant## 573    benign    benign## 574    benign    benign## 575 malignant malignant## 578    benign    benign## 579    benign    benign## 580    benign    benign## 583 malignant malignant## 596    benign    benign## 598    benign    benign## 600    benign    benign## 601    benign    benign## 603    benign    benign## 605 malignant malignant## 606 malignant malignant## 608    benign    benign## 609 malignant malignant## 611 malignant malignant## 613 malignant malignant## 628    benign    benign## 629    benign    benign## 632    benign    benign## 638    benign    benign## 640    benign    benign## 641    benign    benign## 646    benign    benign## 648    benign    benign## 655    benign    benign## 656    benign    benign## 658    benign malignant## 660    benign    benign## 665    benign    benign## 667    benign    benign## 668    benign    benign## 670 malignant malignant## 672    benign    benign## 676    benign    benign## 678    benign    benign## 679    benign    benign## 680    benign    benign## 681 malignant malignant## 684    benign    benign## 686    benign    benign## 694    benign    benign
svm.pref <- table(df.test$class,svm.pred,dnn = c("Acutal","Predict"))#生成混淆矩阵svm.pref
##            Predict## Acutal      benign malignant##   benign       138         4##   malignant      0        63
acc <- sum(diag(svm.pref))/nrow(df.test)*100 #计算准确度print(acc)
## [1] 98.04878

结果显示预测准确度达到98%。

16.3 选择预测效果最好的模型

首先,与混淆矩阵对应的也有一个2x2矩阵,分别为第一行:TP(True positive)、FN(False negative);第二行:FP(False positive)和TN(True negative)。在这2x2矩阵中,只有对角线的TP和TN是正确的,另外2个是错误的。

一般我们通过敏感度、特异性、正例命中率、负例命中率和准确度来度量模型预测的好坏:

1.webp (5).jpg

16.3.1 语法

performance <- function(table,n=2){  if(!all(dim(table)==c(2,2)))    stop("Must be a 2x2 table")  tn=table[1,1]  fp=table[1,2]  fn=table[2,1]  tp=table[2,2]  sensitivity=tp/(tp+fn)  specificity=tn/(tn+fp)  ppp=tp/(tp+fp)  npp=tn/(tn+fn)  hitrate=(tp+tn)/(tp+tn+fp+fn)  result <- paste("sensitivity= ",round(sensitivity,n),                  "\nspecificity= ",round(specificity,n),                  "\nPositive Predictive Value= ",round(ppp,n),                  "\nNegative Predictive Value= ",round(npp,n),                  "\nAccuracy= ",round(hitrate,n),"\n",sep = "")  cat(result)}performance()

这段代码中的tn tp fp fn等在表格中的位置是根据前面数据集预测得到的混淆矩阵进行一一对应的,在这一数据集预测中,benign良性为真阴性(tn),malignant恶性为真阳性(tp),因为我们要检测恶性的占比。

cat() 是一个用于将文本或表达式输出到控制台的函数。它的作用类似于 print() 函数,但在输出时不会自动添加换行符。在这段代码中,cat(result) 用于将计算结果 result 输出到控制台。这样,当你调用 performance() 函数时,会将计算结果打印到控制台上,而不是返回一个值。

16.3.2 举例

performance <- function(table,n=2){  if(!all(dim(table)==c(2,2)))    stop("Must be a 2x2 table")  tn=table[1,1]  fp=table[1,2]  fn=table[2,1]  tp=table[2,2]  sensitivity=tp/(tp+fn)  specificity=tn/(tn+fp)  ppp=tp/(tp+fp)  npp=tn/(tn+fn)  hitrate=(tp+tn)/(tp+tn+fp+fn)  result <- paste("sensitivity= ",round(sensitivity,n),                  "\nspecificity= ",round(specificity,n),                  "\nPositive Predictive Value= ",round(ppp,n),                  "\nNegative Predictive Value= ",round(npp,n),                  "\nAccuracy= ",round(hitrate,n),"\n",sep = "")  cat(result)}performance(logistic.pref)
## sensitivity= 0.95## specificity= 0.99## Positive Predictive Value= 0.97## Negative Predictive Value= 0.98## Accuracy= 0.98
performance(dtree.pref)
## sensitivity= 0.97## specificity= 0.97## Positive Predictive Value= 0.94## Negative Predictive Value= 0.99## Accuracy= 0.97
performance(randomForest.pref)
## sensitivity= 0.95## specificity= 0.99## Positive Predictive Value= 0.97## Negative Predictive Value= 0.98## Accuracy= 0.98
performance(svm.pref)
## sensitivity= 1## specificity= 0.97## Positive Predictive Value= 0.94## Negative Predictive Value= 1## Accuracy= 0.98

完整教程请查看

R语言基础学习手册

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容