前面机器学习第18篇 - Boruta特征变量筛选(2)已经完成了特征变量筛选,下面看下基于筛选的特征变量构建的模型准确性怎样?

定义一个函数生成一些列用来测试的mtry (一系列不大于总变量数的数值)。

generateTestVariableSet <- function(num_toal_variable){max_power <- ceiling(log10(num_toal_variable))tmp_subset <- unique(unlist(sapply(1:max_power, function(x) (1:10)^x, simplify = F)))sort(tmp_subset[tmp_subset<num_toal_variable])
}

选择关键特征变量相关的数据

# withTentative=F: 不包含tentative变量
boruta.confirmed <- getSelectedAttributes(boruta, withTentative = F)# 提取训练集的特征变量子集
boruta_train_data <- train_data[, boruta.confirmed]
boruta_mtry <- generateTestVariableSet(length(boruta.confirmed))

使用 Caret 进行调参和建模

library(caret)
# Create model with default parameters
trControl <- trainControl(method="repeatedcv", number=10, repeats=5)# train model
if(file.exists('rda/borutaConfirmed_rf_default.rda')){borutaConfirmed_rf_default <- readRDS("rda/borutaConfirmed_rf_default.rda")
} else {# 设置随机数种子,使得结果可重复seed <- 1set.seed(seed)# 根据经验或感觉设置一些待查询的参数和参数值tuneGrid <- expand.grid(mtry=boruta_mtry)borutaConfirmed_rf_default <- train(x=boruta_train_data, y=train_data_group, method="rf", tuneGrid = tuneGrid, # metric="Accuracy", #metric='Kappa'trControl=trControl)saveRDS(borutaConfirmed_rf_default, "rda/borutaConfirmed_rf_default.rda")
}
print(borutaConfirmed_rf_default)

在使用Boruta选择的特征变量后,模型的准确性和Kappa值都提升了很多。

## Random Forest
##
## 59 samples
## 56 predictors
##  2 classes: 'DLBCL', 'FL'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 53, 54, 53, 54, 53, 52, ...
## Resampling results across tuning parameters:
##
##   mtry  Accuracy   Kappa
##    1    0.9862857  0.9565868
##    2    0.9632381  0.8898836
##    3    0.9519048  0.8413122
##    4    0.9519048  0.8413122
##    5    0.9519048  0.8413122
##    6    0.9519048  0.8413122
##    7    0.9552381  0.8498836
##    8    0.9519048  0.8413122
##    9    0.9547619  0.8473992
##   10    0.9519048  0.8413122
##   16    0.9479048  0.8361174
##   25    0.9519048  0.8413122
##   36    0.9450476  0.8282044
##   49    0.9421905  0.8199691
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 1.

提取最终选择的模型,并绘制 ROC 曲线。

borutaConfirmed_rf_default_finalmodel <- borutaConfirmed_rf_default$finalModel

采用训练数据集评估构建的模型,Accuracy=1; Kappa=1,训练的非常完美。

模型的预测显著性P-Value [Acc > NIR] : 3.044e-08。其中NIRNo Information Rate,其计算方式为数据集中最大的类包含的数据占总数据集的比例。如某套数据中,分组A80个样品,分组B20个样品,我们只要猜A,正确率就会有80%,这就是NIR。如果基于这套数据构建的模型准确率也是80%,那么这个看上去准确率较高的模型也没有意义。

confusionMatrix使用binom.test函数检验模型的准确性Accuracy是否显著优于NIR,若P-value<0.05,则表示模型预测准确率显著高于随便猜测。

# 获得模型结果评估矩阵(`confusion matrix`)predictions_train <- predict(borutaConfirmed_rf_default_finalmodel, newdata=train_data)
confusionMatrix(predictions_train, train_data_group)
## Confusion Matrix and Statistics
##
##           Reference
## Prediction DLBCL FL
##      DLBCL    44  0
##      FL        0 15
##
##                Accuracy : 1
##                  95% CI : (0.9394, 1)
##     No Information Rate : 0.7458
##     P-Value [Acc > NIR] : 3.044e-08
##
##                   Kappa : 1
##
##  Mcnemar's Test P-Value : NA
##
##             Sensitivity : 1.0000
##             Specificity : 1.0000
##          Pos Pred Value : 1.0000
##          Neg Pred Value : 1.0000
##              Prevalence : 0.7458
##          Detection Rate : 0.7458
##    Detection Prevalence : 0.7458
##       Balanced Accuracy : 1.0000
##
##        'Positive' Class : DLBCL
##

绘制ROC曲线,计算模型整体的AUC值,并选择最佳阈值。

# 绘制ROC曲线prediction_prob <- predict(borutaConfirmed_rf_default_finalmodel, newdata=test_data, type="prob")
library(pROC)
roc_curve <- roc(test_data_group, prediction_prob[,1])
#roc <- roc(test_data_group, factor(predictions, ordered=T))roc_curve
##
## Call:
## roc.default(response = test_data_group, predictor = prediction_prob[,     1])
##
## Data: prediction_prob[, 1] in 14 controls (test_data_group DLBCL) > 4 cases (test_data_group FL).
## Area under the curve: 0.9821

选择最佳阈值,在控制假阳性率的基础上获得高的敏感性

r是加权系数,默认是1,其计算方式为r=(1−prevalence)/(cost∗prevalence).

best.weights控制加权方式:(cost, prevalence)默认是(1, 0.5),据此算出的r1

  • cost: 假阴性率占假阳性率的比例,容忍更高的假阳性率还是假阴性率

  • prevalence: 关注的类中的个体所占的比例 (n.cases/(n.controls+n.cases)).

best_thresh <- data.frame(coords(roc=roc_curve, x = "best", input="threshold", transpose = F, best.method = "youden"))
best_thresh
##   threshold specificity sensitivity
## 1     0.736   0.9285714           1

准备数据绘制ROC曲线

library(ggrepel)
ROC_data <- data.frame(FPR = 1- roc_curve$specificities, TPR=roc_curve$sensitivities)
ROC_data <- ROC_data[with(ROC_data, order(FPR,TPR)),]best_thresh$best <- apply(best_thresh, 1, function (x) paste0('threshold: ', x[1], ' (', round(1-x[2],3), ", ", round(x[3],3), ")"))p <- ggplot(data=ROC_data, mapping=aes(x=FPR, y=TPR)) +geom_step(color="red", size=1, direction = "vh") +geom_segment(aes(x=0, xend=1, y=0, yend=1))  + theme_classic() + xlab("False positive rate") + ylab("True positive rate") + coord_fixed(1) + xlim(0,1) + ylim(0,1) +annotate('text', x=0.5, y=0.25, label=paste('AUC=', round(roc$auc,2))) +geom_point(data=best_thresh, mapping=aes(x=1-specificity, y=sensitivity), color='blue', size=2) + geom_text_repel(data=best_thresh, mapping=aes(x=1.05-specificity, y=sensitivity ,label=best))
p

基于默认阈值绘制混淆矩阵并评估模型预测准确度显著性,结果不显著P-Value [Acc > NIR]>0.05

# 获得模型结果评估矩阵(`confusion matrix`)predictions <- predict(borutaConfirmed_rf_default_finalmodel, newdata=test_data)
confusionMatrix(predictions, test_data_group)
## Confusion Matrix and Statistics
##
##           Reference
## Prediction DLBCL FL
##      DLBCL    14  1
##      FL        0  3
##
##                Accuracy : 0.9444
##                  95% CI : (0.7271, 0.9986)
##     No Information Rate : 0.7778
##     P-Value [Acc > NIR] : 0.06665
##
##                   Kappa : 0.8235
##
##  Mcnemar's Test P-Value : 1.00000
##
##             Sensitivity : 1.0000
##             Specificity : 0.7500
##          Pos Pred Value : 0.9333
##          Neg Pred Value : 1.0000
##              Prevalence : 0.7778
##          Detection Rate : 0.7778
##    Detection Prevalence : 0.8333
##       Balanced Accuracy : 0.8750
##
##        'Positive' Class : DLBCL
##

基于选定的最优阈值制作混淆矩阵并评估模型预测准确度显著性,结果还是不显著 P-Value [Acc > NIR]>0.05

predict_result <- data.frame(Predict_status=c(T,F), Predict_class=colnames(prediction_prob))head(predict_result)
##   Predict_status Predict_class
## 1           TRUE         DLBCL
## 2          FALSE            FL
predictions2 <- plyr::join(data.frame(Predict_status=prediction_prob[,1] > best_thresh[1,1]), predict_result)predictions2 <- as.factor(predictions2$Predict_class)confusionMatrix(predictions2, test_data_group)
## Confusion Matrix and Statistics
##
##           Reference
## Prediction DLBCL FL
##      DLBCL    13  0
##      FL        1  4
##
##                Accuracy : 0.9444
##                  95% CI : (0.7271, 0.9986)
##     No Information Rate : 0.7778
##     P-Value [Acc > NIR] : 0.06665
##
##                   Kappa : 0.8525
##
##  Mcnemar's Test P-Value : 1.00000
##
##             Sensitivity : 0.9286
##             Specificity : 1.0000
##          Pos Pred Value : 1.0000
##          Neg Pred Value : 0.8000
##              Prevalence : 0.7778
##          Detection Rate : 0.7222
##    Detection Prevalence : 0.7222
##       Balanced Accuracy : 0.9643
##
##        'Positive' Class : DLBCL
##

筛选完特征变量后,模型的准确性和Kappa值都提高了很多。但统计检验却还是提示不显著,这可能是数据不平衡的问题,我们后续继续优化。

机器学习系列教程

从随机森林开始,一步步理解决策树、随机森林、ROC/AUC、数据集、交叉验证的概念和实践。

文字能说清的用文字、图片能展示的用、描述不清的用公式、公式还不清楚的写个简单代码,一步步理清各个环节和概念。

再到成熟代码应用、模型调参、模型比较、模型评估,学习整个机器学习需要用到的知识和技能。

  1. 机器学习算法 - 随机森林之决策树初探(1)

  2. 机器学习算法-随机森林之决策树R 代码从头暴力实现(2)

  3. 机器学习算法-随机森林之决策树R 代码从头暴力实现(3)

  4. 机器学习算法-随机森林之理论概述

  5. 随机森林拖了这么久,终于到实战了。先分享很多套用于机器学习的多种癌症表达数据集 https://file.biolab.si/biolab/supp/bi-cancer/projections/。

  6. 机器学习算法-随机森林初探(1)

  7. 机器学习 模型评估指标 - ROC曲线和AUC值

  8. 机器学习 - 训练集、验证集、测试集

  9. 机器学习 - 随机森林手动10 折交叉验证

  10. 一个函数统一238个机器学习R包,这也太赞了吧

  11. 基于Caret和RandomForest包进行随机森林分析的一般步骤 (1)

  12. Caret模型训练和调参更多参数解读(2)

  13. 机器学习相关书籍分享

  14. 基于Caret进行随机森林随机调参的4种方式

  15. 送你一个在线机器学习网站,真香!

  16. UCI机器学习数据集

  17. 机器学习第17篇 - 特征变量筛选(1)

  18. 机器学习第18篇 - 基于随机森林的Boruta特征变量筛选(2)

  19. 机器学习系列补充:数据集准备和更正YSX包

机器学习第20篇 - 基于Boruta选择的特征变量构建随机森林相关推荐

  1. python数据项目分析实战技法_《Python数据分析与机器学习实战-唐宇迪》读书笔记第9章--随机森林项目实战——气温预测(1/2)...

    第9章--随机森林项目实战--气温预测(1/2) 第8章已经讲解过随机森林的基本原理,本章将从实战的角度出发,借助Python工具包完成气温预测任务,其中涉及多个模块,主要包含随机森林建模.特征选择. ...

  2. ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序

    ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序 目录 基于mpg数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特 ...

  3. python天气数据分析论文_《Python数据分析与机器学习实战-唐宇迪》读书笔记第9章--随机森林项目实战——气温预测(2/2)...

    第9章--随机森林项目实战--气温预测(2/2) 第8章已经讲解过随机森林的基本原理,本章将从实战的角度出发,借助Python工具包完成气温预测任务,其中涉及多个模块,主要包含随机森林建模.特征选择. ...

  4. 机器学习实战之分类算法(K-近邻/朴素贝叶斯/决策树/随机森林)

    机器学习分类算法 1. 机器学习算法简介 1.1 按照学习方式分类 1.2 区别 1.3 关于监督学习中的分类与回归区别 1.4 机器学习开发流程 2. 数据集介绍与划分 2.1 sklearn数据集 ...

  5. 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...

    建议:阅读2020.8.7的文章,完全了解GDBT和XGBT的原理. 机器学习- XGBoost,GDBT[过程:决策树,集成学习,随机森林,GDBT,XGBT,LightGBM] 本次实践内容: 数 ...

  6. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 可以通过聚集多个分类器的预测结果提高分类器的分类准确率,这一方法称为集成(Ensemble)学习或分类器组合(Classifier C ...

  7. 各维度 特征 重要程度 随机森林_机器学习算法——随机森林

    随机森林简介 随机森林是一种通用的机器学习方法,能够处理回归和分类问题.它还负责数据降维.缺失值处理.离群值处理以及数据分析的其他步骤.它是一种集成学习方法,将一组一般的模型组合成一个强大的模型 工作 ...

  8. 机器学习:集成学习(ensemble),bootstrap,Bagging,随机森林,Boosting

    文章目录 集成学习的朴素思想 Bootstrap理论 Bagging 随机森林 Boosting 集成学习的朴素思想 集成学习基于这样的思想:对于比较复杂的任务,综合许多人的意见来进行决策会比&quo ...

  9. R语言实战应用精讲50篇(二十七)-R语言实现随机森林(附R语言代码)

    随机森林回归 回归问题指的是因变量或者被预测变量是连续性变量的情形,比如预测身高体重的具体数值是多少的情形.整个代码大致可以分为包.数据.模型.预测评估4个部分,接下来逐一解读. 1.包部分,也就是加 ...

最新文章

  1. 多服务器session共享之memcache共享安装和实现篇(apache+php-windows)
  2. PMCAFF问答精选 | 对于用户反馈,产品经理需要第一时间给出回应吗?
  3. zabbix模板_基于zabbix网页配置自定义tomcat监控模板--监控项、触发器
  4. php读取oracle,php读取oracle中数据库文件
  5. 让元素固定_49种元素对钢铁性能的影响
  6. 【To Understand】程序员面试金典——番外篇之洪水
  7. 抽象高于实现 ——unity框架提取
  8. libaio介绍和使用
  9. 如何通过API接口,获取拼多多商品详情数据
  10. Arduino开发ESP8266之ADS1115模数转换
  11. C++中一维二维数组传参
  12. 香肠派对显示服务器断开怎么解决,香肠派对闪退如何解决 闪退解决方法
  13. 相控非绝缘技术为何是黄金微针效用至高点?深度剖析相控射频微针差异
  14. [转]黄金圣斗士处女座沙加读解
  15. 数据稀疏or特征稀疏
  16. oppo提前批Android开发岗面经(附问题答案)
  17. 实现海报合成工具,自定义背景图、位置、大小等 (html2canvas)
  18. 2020.11.17【读书笔记】丨ONT 测序平台送样指导——DNA 取样要求
  19. 一文明白CDN加速是个啥
  20. macos\Linux下使用fcrackzip破解zip压缩文件密码

热门文章

  1. 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)
  2. 【XML】Java对象数据的XML和JSON表示
  3. 函数式编程语言:LISP/Scheme 小语种简介
  4. OpenStack推出最新版本Newton,显著提升单一云平台 对虚拟化、裸机和容器的管理...
  5. 使用“即时消息服务框架”(iMSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)...
  6. NSA(美国国安局)泄漏Exploit分析
  7. 提交前让所有的option变为选中状态
  8. JavaScript将iframe中控件的值传到主页面控件中
  9. javascript中依赖属性(Dependency Property)的实现
  10. 被定制化开发坑惨了的IT人,不是所有的报表都能满足老板的需求