写在前面
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)
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)
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)#生成随机森林的图片
结果显示随机森林预测的准确率达到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个是错误的。
一般我们通过敏感度、特异性、正例命中率、负例命中率和准确度来度量模型预测的好坏:
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
完整教程请查看