当前位置:   article > 正文

MachineLearning 30. 机器学习之特征选择森林之神 (Boruta)

MachineLearning 30. 机器学习之特征选择森林之神 (Boruta)

952f59ae6a2f9a3dba48225718760915.png


简      介

机器学习方法通常用于对由数百个属性描述的对象进行分类。在许多这类应用中,很大一部分属性可能与分类问题完全无关。更重要的是,通常人们不能先验地决定哪些属性是相关的。

为什么变量选择很重要?

  1. 删除冗余变量有助于提高准确性。同样,纳入相关变量对模型精度也有积极影响。

  2. 太多的变量可能导致过拟合,这意味着模型不能泛化模式。

  3. 太多的变量导致计算速度慢,反过来又需要更多的内存和硬件。

R中有很多用于功能选择的包,为什么选择 Boruta ?

有以下使用 Boruta 进行特性选择的原因。

  1. 对分类和回归问题都有很好的效果。

  2. 考虑了多变量关系。

  3. 是对随机森林变量重要性测度的改进,随机森林变量重要性测度是一种常用的变量选择方法。

  4. 遵循一种全相关变量选择方法,其中考虑与结果变量相关的所有特征。然而,大多数其他变量选择算法遵循最小最优方法,它们依赖于一小部分特征,从而在选择的分类器上产生最小的错误。

  5. 可以处理变量之间的相互作用,

  6. 可以处理随机森林重要性度量的波动性。

Boruta算法是如何工作的?

  1. 创建所有独立变量的副本。当原始数据中的自变量数小于5个时,使用现有变量至少创建5个副本。

  2. 打乱添加的重复副本的值,以删除它们与目标变量的相关性。被称为影子特征或排列副本。

  3. 将原件与洗过的副本合并。

  4. 在组合数据集上运行随机森林分类器,并执行变量重要性度量(默认为Mean reduce Accuracy)来评估每个变量的重要性,其中越高意味着越重要。

  5. 然后计算Z分数。即精度损失的均值除以精度损失的标准差。

  6. 找出阴影属性中的最大Z值(MZSA)

  7. 当变量的重要性显著低于MZSA时,将其标记为“不重要”。然后永久地把它们从这个过程中移除。

  8. 当变量的重要性显著高于MZSA时,将其标记为“重要”。

  9. 按照预定义的迭代次数(随机森林运行)重复上述步骤,或者直到所有属性都标记为“不重要”或“重要”,以先到者为准。

Boruta 拒绝和接受区域之间没有硬性规定

相反,有3个区域:

拒绝区域(红色区域):此处结束的要素被视为噪音,因此将其丢弃;一个无法解决的区域(蓝色区域):Boruta对于该区域中的特征犹豫不决;可接受区域(绿色区域):此处的特征被认为是可预测的,因此将其保留。

53d2f5407145db8592c70f65f7c4091a.png

软件包安装

安装很简单直接安装即可。

  1. if(!require(Boruta))
  2. install.packages("Boruta")

实例操作

我们分布选择了两组临床数据一种是分类类型,一种是生存数据,基于这两种数据类型进行变量特征的筛选。

一. 分类变量特征筛选

数据读取
  1. BreastCancer <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
  2. str(BreastCancer)
  3. ## 'data.frame': 568 obs. of 32 variables:
  4. ## $ id : int 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 845636 ...
  5. ## $ diagnosis : chr "M" "M" "M" "M" ...
  6. ## $ radius_mean : num 20.6 19.7 11.4 20.3 12.4 ...
  7. ## $ texture_mean : num 17.8 21.2 20.4 14.3 15.7 ...
  8. ## $ perimeter_mean : num 132.9 130 77.6 135.1 82.6 ...
  9. ## $ area_mean : num 1326 1203 386 1297 477 ...
  10. ## $ smoothness_mean : num 0.0847 0.1096 0.1425 0.1003 0.1278 ...
  11. ## $ compactne_mean : num 0.0786 0.1599 0.2839 0.1328 0.17 ...
  12. ## $ concavity_mean : num 0.0869 0.1974 0.2414 0.198 0.1578 ...
  13. ## $ concave_points_mean : num 0.0702 0.1279 0.1052 0.1043 0.0809 ...
  14. ## $ symmetry_mean : num 0.181 0.207 0.26 0.181 0.209 ...
  15. ## $ fractal_dimension_mean : num 0.0567 0.06 0.0974 0.0588 0.0761 ...
  16. ## $ radius_se : num 0.543 0.746 0.496 0.757 0.335 ...
  17. ## $ texture_se : num 0.734 0.787 1.156 0.781 0.89 ...
  18. ## $ perimeter_se : num 3.4 4.58 3.44 5.44 2.22 ...
  19. ## $ area_se : num 74.1 94 27.2 94.4 27.2 ...
  20. ## $ smoothness_se : num 0.00522 0.00615 0.00911 0.01149 0.00751 ...
  21. ## $ compactne_se : num 0.0131 0.0401 0.0746 0.0246 0.0335 ...
  22. ## $ concavity_se : num 0.0186 0.0383 0.0566 0.0569 0.0367 ...
  23. ## $ concave_points_se : num 0.0134 0.0206 0.0187 0.0188 0.0114 ...
  24. ## $ symmetry_se : num 0.0139 0.0225 0.0596 0.0176 0.0216 ...
  25. ## $ fractal_dimension_se : num 0.00353 0.00457 0.00921 0.00511 0.00508 ...
  26. ## $ radius_worst : num 25 23.6 14.9 22.5 15.5 ...
  27. ## $ texture_worst : num 23.4 25.5 26.5 16.7 23.8 ...
  28. ## $ perimeter_worst : num 158.8 152.5 98.9 152.2 103.4 ...
  29. ## $ area_worst : num 1956 1709 568 1575 742 ...
  30. ## $ smoothness_worst : num 0.124 0.144 0.21 0.137 0.179 ...
  31. ## $ compactne_worst : num 0.187 0.424 0.866 0.205 0.525 ...
  32. ## $ concavity_worst : num 0.242 0.45 0.687 0.4 0.535 ...
  33. ## $ concave_points_worst : num 0.186 0.243 0.258 0.163 0.174 ...
  34. ## $ symmetry_worst : num 0.275 0.361 0.664 0.236 0.399 ...
  35. ## $ fractal_dimension_worst: num 0.089 0.0876 0.173 0.0768 0.1244 ...
  36. dim(BreastCancer)
  37. ## [1] 568 32
  38. table(BreastCancer$diagnosis)
  39. ##
  40. ## B M
  41. ## 357 211
  42. data = na.omit(BreastCancer)
  43. data = data[, -1]
  44. sum(is.na(data)) # 检测数据是否有缺失
  45. ## [1] 0
  46. data$diagnosis = factor(data$diagnosis)
Boruta 特征筛选
  1. library(Boruta)
  2. set.seed(123456)
  3. # Boruta on the 'small redundant XOR' problem; read ?srx for details
  4. Boruta.srx <- Boruta(diagnosis ~ ., data = data)
  5. # Results summary
  6. print(Boruta.srx)
  7. ## Boruta performed 99 iterations in 4.828853 secs.
  8. ## 28 attributes confirmed important: area_mean, area_se, area_worst,
  9. ## compactne_mean, compactne_se and 23 more;
  10. ## No attributes deemed unimportant.
  11. ## 2 tentative attributes left: smoothness_se, symmetry_se;
  12. getSelectedAttributes(Boruta.srx, withTentative = F)
  13. ## [1] "radius_mean" "texture_mean"
  14. ## [3] "perimeter_mean" "area_mean"
  15. ## [5] "smoothness_mean" "compactne_mean"
  16. ## [7] "concavity_mean" "concave_points_mean"
  17. ## [9] "symmetry_mean" "fractal_dimension_mean"
  18. ## [11] "radius_se" "texture_se"
  19. ## [13] "perimeter_se" "area_se"
  20. ## [15] "compactne_se" "concavity_se"
  21. ## [17] "concave_points_se" "fractal_dimension_se"
  22. ## [19] "radius_worst" "texture_worst"
  23. ## [21] "perimeter_worst" "area_worst"
  24. ## [23] "smoothness_worst" "compactne_worst"
  25. ## [25] "concavity_worst" "concave_points_worst"
  26. ## [27] "symmetry_worst" "fractal_dimension_worst"
  27. getConfirmedFormula(Boruta.srx)
  28. ## diagnosis ~ radius_mean + texture_mean + perimeter_mean + area_mean +
  29. ## smoothness_mean + compactne_mean + concavity_mean + concave_points_mean +
  30. ## symmetry_mean + fractal_dimension_mean + radius_se + texture_se +
  31. ## perimeter_se + area_se + compactne_se + concavity_se + concave_points_se +
  32. ## fractal_dimension_se + radius_worst + texture_worst + perimeter_worst +
  33. ## area_worst + smoothness_worst + compactne_worst + concavity_worst +
  34. ## concave_points_worst + symmetry_worst + fractal_dimension_worst
  35. ## <environment: 0x0000018ec9d1da58>

查看下变量重要性鉴定结果(实际上面的输出中也已经有体现了),重要的变量(Confirmed),可能重要的变量 (Tentative, 重要性得分与最好的影子变量得分无统计差异),不重要的变量(Rejected)。

  1. # Attribute statistics
  2. attStats(Boruta.srx)
  3. ## meanImp medianImp minImp maxImp normHits
  4. ## radius_mean 10.071099 10.020482 8.89346761 11.433229 1.0000000
  5. ## texture_mean 10.892140 10.786118 8.98909647 12.846505 1.0000000
  6. ## perimeter_mean 10.223638 10.176604 8.94580870 11.534818 1.0000000
  7. ## area_mean 10.860116 10.852067 9.41161564 12.279282 1.0000000
  8. ## smoothness_mean 6.783699 6.832254 4.80767802 8.277114 1.0000000
  9. ## compactne_mean 6.264837 6.325530 4.85415252 7.554644 1.0000000
  10. ## concavity_mean 11.285933 11.260715 10.27740089 12.885148 1.0000000
  11. ## concave_points_mean 14.322787 14.220415 12.84816023 15.764685 1.0000000
  12. ## symmetry_mean 3.527213 3.593182 1.77659293 5.113061 0.8888889
  13. ## fractal_dimension_mean 3.573217 3.659878 1.58723946 5.240371 0.8686869
  14. ## radius_se 9.618961 9.577086 7.73723164 11.406974 1.0000000
  15. ## texture_se 3.268693 3.272174 0.75825557 5.816369 0.7575758
  16. ## perimeter_se 8.924915 8.870981 7.33077155 10.456411 1.0000000
  17. ## area_se 12.997349 13.009021 11.12331299 14.533677 1.0000000
  18. ## smoothness_se 2.470768 2.482660 0.54746529 4.488274 0.5050505
  19. ## compactne_se 4.405955 4.460622 2.87506010 5.779804 0.9696970
  20. ## concavity_se 5.521887 5.564202 4.01514226 6.516104 1.0000000
  21. ## concave_points_se 4.526428 4.625969 2.27646296 5.575703 0.9696970
  22. ## symmetry_se 2.441335 2.430235 0.36753495 5.328948 0.5151515
  23. ## fractal_dimension_se 3.346859 3.401471 -0.01172355 5.516967 0.7979798
  24. ## radius_worst 16.251607 16.217142 14.76565032 18.315129 1.0000000
  25. ## texture_worst 12.166592 12.219712 10.25806869 13.636629 1.0000000
  26. ## perimeter_worst 16.660151 16.580006 15.07094801 18.003991 1.0000000
  27. ## area_worst 16.802971 16.853102 15.16086916 18.559157 1.0000000
  28. ## smoothness_worst 9.643527 9.598221 8.58943124 11.163587 1.0000000
  29. ## compactne_worst 8.278087 8.348195 7.11928867 9.600703 1.0000000
  30. ## concavity_worst 12.681600 12.804867 11.12062428 14.198925 1.0000000
  31. ## concave_points_worst 17.189034 17.230931 15.54955351 18.633487 1.0000000
  32. ## symmetry_worst 7.355968 7.372868 5.65925679 8.603888 1.0000000
  33. ## fractal_dimension_worst 5.223650 5.215871 3.61622636 6.661654 0.9797980
  34. ## decision
  35. ## radius_mean Confirmed
  36. ## texture_mean Confirmed
  37. ## perimeter_mean Confirmed
  38. ## area_mean Confirmed
  39. ## smoothness_mean Confirmed
  40. ## compactne_mean Confirmed
  41. ## concavity_mean Confirmed
  42. ## concave_points_mean Confirmed
  43. ## symmetry_mean Confirmed
  44. ## fractal_dimension_mean Confirmed
  45. ## radius_se Confirmed
  46. ## texture_se Confirmed
  47. ## perimeter_se Confirmed
  48. ## area_se Confirmed
  49. ## smoothness_se Tentative
  50. ## compactne_se Confirmed
  51. ## concavity_se Confirmed
  52. ## concave_points_se Confirmed
  53. ## symmetry_se Tentative
  54. ## fractal_dimension_se Confirmed
  55. ## radius_worst Confirmed
  56. ## texture_worst Confirmed
  57. ## perimeter_worst Confirmed
  58. ## area_worst Confirmed
  59. ## smoothness_worst Confirmed
  60. ## compactne_worst Confirmed
  61. ## concavity_worst Confirmed
  62. ## concave_points_worst Confirmed
  63. ## symmetry_worst Confirmed
  64. ## fractal_dimension_worst Confirmed

绘制Boruta算法运行过程中各个变量的重要性得分的变化 (绿色是重要的变量,红色是不重要的变量,蓝色是影子变量,黄色是Tentative变量)。

# Result plotpar(mar=c(10,4,4,4))plot(Boruta.srx, las = 2,xlab = "")

78d3bbdfa0d4bcbe40accf74a67199f0.png

Boruta运行期间属性Z-Score的演变。查看是否有必要增加迭代的次数以便再次确认Tentative变量中是否有一部分为有意义的特征变量。从下图来看,黄色变量部分随着迭代还是有部分可能高于最高值,可以继续尝试增加迭代次数。

plotImpHistory(Boruta.srx)

27c9117e40343f9ac71f8ea619915e67.png

二. 特征筛选应用于生存分析

数据读取

我们同样使用TCGA-LUSC的整理后的数据,带有生存分析 time和status,如下:

  1. library(survival)
  2. library(survminer)
  3. data(myeloma)
  4. myeloma <- na.omit(myeloma)
Boruta 特征筛选

进行基于生存分析的特征选择,需要使用Surv()函数,如下:

  1. set.seed(123456)
  2. Y = Surv(myeloma$time, myeloma$event)
  3. Boruta_myeloma <- Boruta(y = Y, x = myeloma[, c(3, 6:11)])
  4. getSelectedAttributes(Boruta_myeloma, withTentative = F)
  5. ## [1] "WHSC1"

查看下变量重要性鉴定结果

  1. # Attribute statistics
  2. attStats(Boruta_myeloma)
  3. ## meanImp medianImp minImp maxImp normHits decision
  4. ## treatment 0.0000000 0.0000000 0.000000 0.0000000 0.00000000 Rejected
  5. ## CCND1 -0.6973991 -0.6388310 -2.328181 1.0746954 0.01010101 Rejected
  6. ## CRIM1 -0.4276388 -0.3696783 -1.906432 0.8617213 0.01010101 Rejected
  7. ## DEPDC1 2.9113813 2.8826225 -1.501727 7.1419334 0.46464646 Tentative
  8. ## IRF4 -2.1927083 -2.4296892 -4.416328 0.7547158 0.02020202 Rejected
  9. ## TP53 0.4520237 0.1772435 -2.935493 3.8682161 0.12121212 Rejected
  10. ## WHSC1 3.9403418 3.9254756 0.562233 10.7607458 0.62626263 Confirmed

绘制Boruta算法运行过程中各个变量的重要性得分的变化 (绿色是重要的变量,红色是不重要的变量,蓝色是影子变量,黄色是Tentative变量)。

  1. # Result plot
  2. plot(Boruta_myeloma, las = 2, xlab = "")

2a49a96224f5aa13f8929286da776b68.png

Boruta运行期间属性Z-Score的演变。查看是否有必要增加迭代的次数以便再次确认Tentative变量中是否有一部分为有意义的特征变量。从下图来看,黄色变量部分随着迭代还是有部分可能高于最高值,可以继续尝试增加迭代次数。

plotImpHistory(Boruta_myeloma)

a440b111ac71f485ac18bab75440711d.png

我们已经看到了如何使用Boruta对数据集执行可靠的,基于统计的特征选择。实际上,对特征做出重大决策对于确保预测模型的成功至关重要。

Reference

Miron B. Kursa, Witold R. Rudnicki (2010). Feature Selection with the Boruta Package. Journal of Statistical Software, 36(11), p. 1-13. URL: tools:::Rd_expr_doi("10.18637/jss.v036.i11")



基于机器学习构建临床预测模型

MachineLearning 1. 主成分分析(PCA)

MachineLearning 2. 因子分析(Factor Analysis)

MachineLearning 3. 聚类分析(Cluster Analysis)

MachineLearning 4. 癌症诊断方法之 K-邻近算法(KNN)

MachineLearning 5. 癌症诊断和分子分型方法之支持向量机(SVM)

MachineLearning 6. 癌症诊断机器学习之分类树(Classification Trees)

MachineLearning 7. 癌症诊断机器学习之回归树(Regression Trees)

MachineLearning 8. 癌症诊断机器学习之随机森林(Random Forest)

MachineLearning 9. 癌症诊断机器学习之梯度提升算法(Gradient Boosting)

MachineLearning 10. 癌症诊断机器学习之神经网络(Neural network)

MachineLearning 11. 机器学习之随机森林生存分析(randomForestSRC)

MachineLearning 12. 机器学习之降维方法t-SNE及可视化(Rtsne)

MachineLearning 13. 机器学习之降维方法UMAP及可视化 (umap)

MachineLearning 14. 机器学习之集成分类器(AdaBoost)

MachineLearning 15. 机器学习之集成分类器(LogitBoost)

MachineLearning 16. 机器学习之梯度提升机(GBM)

MachineLearning 17. 机器学习之围绕中心点划分算法(PAM)

MachineLearning 18. 机器学习之贝叶斯分析类器(Naive Bayes)

MachineLearning 19. 机器学习之神经网络分类器(NNET)

MachineLearning 20. 机器学习之袋装分类回归树(Bagged CART)

MachineLearning 21. 机器学习之临床医学上的生存分析 (xgboost)

MachineLearning 22. 机器学习之有监督主成分分析筛选基因 (SuperPC)

MachineLearning 23. 机器学习之岭回归预测基因型和表型 (Ridge)

MachineLearning 24. 机器学习之似然增强Cox 比例风险模型筛选变量及预后估计 (CoxBoost)

MachineLearning 25. 机器学习之支持向量机应用于生存分析 (survivalsvm)

MachineLearning 26. 机器学习之弹性网络算法应用于生存分析 (Enet)

MachineLearning 27. 机器学习之逐步Cox回归筛选变量 (StepCox)

MachineLearning 28. 机器学习之偏最小二乘回归应用于生存分析 (plsRcox)

MachineLearning 29. 机器学习之嵌套交叉验证 (Nested CV)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/324306
推荐阅读
相关标签
  

闽ICP备14008679号