H2O randomForest中的多类分类

Posted

技术标签:

【中文标题】H2O randomForest中的多类分类【英文标题】:Multiclass classification in H2O randomForest 【发布时间】:2020-06-13 23:07:57 【问题描述】:

我正在尝试在 R 中使用 H20 randomForest 进行多类分类,但是当我运行代码时,randomForest 总是作为回归模型出现 - 尽管目标变量是一个因素。我正在尝试通过另一个具有 4 个级别和 21 个数值预测变量的因子“周期”来预测“梯度”,一个具有 5 个级别的因子。

任何帮助将不胜感激。下面的代码......

>str(df)

Class 'H2OFrame' <environment: 0x000001f6b361abe0>

 - attr(*, "op")= chr ":="
 - attr(*, "eval")= logi TRUE
 - attr(*, "id")= chr "RTMP_sid_aecc_35"
 - attr(*, "nrow")= int 63878
 - attr(*, "ncol")= int 22
 - attr(*, "types")=List of 22
 - attr(*, "data")='data.frame':    10 obs. of  22 variables:

  ..$ Gradient: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1

  ..$ Period  : Factor w/ 4 levels "Dawn","Day","Dusk",..: 2 2 2 2 2 2 2 2 2 2

  ..$ AC1     : num  1792 1793 1790 1790 1797 ...
  ..$ AC2     : num  316 316 318 317 324 ...
  ..$ AC3     : num  972 972 974 975 979 ...

剩余的数值预测器等。

>splits <- h2o.splitFrame(df,  c(0.6,0.2),  seed=1234)
>train <- h2o.assign(splits[[1]], "train.hex")  
>valid <- h2o.assign(splits[[2]], "valid.hex")   
>test <- h2o.assign(splits[[3]], "test.hex")   

>str(train)
        Class 'H2OFrame' <environment: 0x000002266fac7d40> 
     - attr(*, "op")= chr "assign"
     - attr(*, "id")= chr "train.hex"
     - attr(*, "nrow")= int 38259
     - attr(*, "ncol")= int 22
     - attr(*, "types")=List of 22
    - attr(*, "data")='data.frame': 10 obs. of  22 variables:
      ..$ Gradient: Factor w/ 5 levels "LB","LU","PB",..: 1 1 1 1 1 1 1 1 1 1
      ..$ Period  : Factor w/ 4 levels "Dawn","Day","Dusk",..: 2 2 2 2 2 2 2 2 2 2
      ..$ AC1     : num  1793 1797 1796 1805 1803 ...
      ..$ AC2     : num  316 324 322 322 323 ...
      ..$ AC3     : num  972 979 979 988 986 ...
      ..$ AC4     : num  663 662 664 673 670 ...
      ..$ AC5     : num  828 825 824 824 825 ...
      ..$ AD1     : num  1.22 1.42 1.73 2.25 1.99 ...
      ..$ AD2     : num  1.1 1.27 1.35 1.38 1.38 ...
      ..$ AD3     : num  1.22 1.42 1.72 2.24 1.99 ...
      ..$ AD4     : num  1.87 1.53 2.07 2.03 1.78 ...
      ..$ AD5     : num  2.33 2.33 2.33 2.33 2.33 ...
      ..$ AE1     : num  0.877 0.849 0.794 0.636 0.72 ...
      ..$ AE2     : num  0.3687 0.2332 0.1369 0.0433 0.0546 ...
      ..$ AE3     : num  0.774 0.723 0.624 0.335 0.487 ...
      ..$ AE4     : num  0.574 0.697 0.44 0.477 0.605 ...
      ..$ AE5     : num  0.542 0.542 0.554 0.543 0.542 ...
      ..$ BI1     : num  53 71.9 64 75.4 74.6 ...
      ..$ BI2     : num  6.51 5.88 4.54 2.3 2.34 ...
      ..$ BI3     : num  22.2 26 21.5 27.9 28 ...
      ..$ BI4     : num  7.86 9.58 8.59 12.17 12.5 ...
      ..$ BI5     : num  11.3 17.9 16.4 18.1 17.5 ...



 > train[1:5,]   ## rows 1-5, all columns
  Gradient Period     AC1      AC2      AC3      AC4      AC5      AD1      AD2      AD3      AD4      AD5      AE1      AE2      AE3      AE4      AE5
1       LB    Day 1792.97 316.4038 972.4288 663.2612 827.6400 1.217491 1.104860 1.217491 1.866627 2.332115 0.876794 0.368712 0.774123 0.574168 0.541993
2       LB    Day 1796.78 324.3562 979.2218 662.2341 824.6436 1.421910 1.274373 1.421910 1.526506 2.331810 0.848660 0.233177 0.722544 0.696906 0.542409
3       LB    Day 1796.09 321.9081 978.7464 664.1776 824.4437 1.726798 1.345030 1.721740 2.066543 2.326278 0.794230 0.136892 0.624107 0.440458 0.553766
4       LB    Day 1805.14 322.0390 987.9472 673.2841 824.3146 2.248474 1.381644 2.239061 2.028538 2.331881 0.636007 0.043267 0.334964 0.477149 0.542572
5       LB    Day 1803.15 323.1540 985.6376 669.7603 824.6003 1.992025 1.380468 1.992004 1.782532 2.331971 0.720153 0.054578 0.486951 0.604876 0.542420
       BI1      BI2      BI3       BI4      BI5
1 53.03567 6.506536 22.23446  7.862767 11.32708
2 71.94775 5.879407 26.04130  9.579798 17.94337
3 63.98763 4.535041 21.50727  8.590985 16.38780
4 75.38319 2.301110 27.89600 12.165991 18.06316
5 74.60517 2.342853 28.02568 12.499122 17.52902


rf1 <- h2o.randomForest(         
  training_frame = train,        
  validation_frame = valid,      
  x=2:22,                        
  y=1,                          
  ntrees = 200,                 
  stopping_rounds = 2,          
  score_each_iteration = T,     
  seed = 1000000) `
>perf <- h2o.performance(rf1, valid)
>h2o.mcc(perf)
Error in h2o.metric(object, thresholds, "absolute_mcc") : 
      No absolute_mcc for H2OMultinomialMetrics
    h2o.accuracy(perf)
Error in h2o.metric(object, thresholds, "accuracy") : 
  No accuracy for H2OMultinomialMetrics

以及模型摘要中的摘要:

    H2OMultinomialMetrics: drf
** Reported on training data. **
** Metrics reported on Out-Of-Bag training samples **

Training Set Metrics: 
=====================

Extract training frame with `h2o.getFrame("train.hex")`
MSE: (Extract with `h2o.mse`) 0.2499334
RMSE: (Extract with `h2o.rmse`) 0.4999334
Logloss: (Extract with `h2o.logloss`) 0.9987891
Mean Per-Class Error: 0.2941914
R^2: (Extract with `h2o.r2`) 0.8683096

【问题讨论】:

你能显示中间的代码吗:从dfsplits。或者在调用h2o.randomForest() 之前显示train 中的列实际上是什么(几乎可以肯定y 不是您认为的因子列,这将是由于H2O 被数字标签混淆了。 ) 感谢您的回复,我已经编辑了原始回复,并包含了更多详细信息。 抱歉,我找错树了。一旦我看到所有代码,我就不得不考虑其他一些解释:看看我的答案。 【参考方案1】:

mcc 专门用于 binary 分类器;您的因子有 2 个以上的水平。

您可以说您已成功完成多项分类,而不是回归,因为错误消息显示“No absolute_mcc for H2OMultinomialMetrics”。

h2o.accuracy()h2o.logloss() 可用于多项式模型。

更新: ...好吧,the docs 说h2o.accuracy() 可用,但是快速检查 iris 数据集给了我你看到的同样的错误;必须与文档中的警告相关(我不明白)。

反正比较有用的可能是h2o.confusionMatrix(rf1);右下角显示的总体错误是1 - accuracy。还有h2o.confusionMatrix(rf1,valid=T)h2o.confusionMatrix(rf1, test)

【讨论】:

您好,感谢您的回答,但它仍然对我不起作用?我添加了来自 h2o.accuracy() 的错误消息和模型摘要的 sn-p,这表明它正在进行回归而不是分类。

以上是关于H2O randomForest中的多类分类的主要内容,如果未能解决你的问题,请参考以下文章

Pipeline 和 GridSearchCV,以及 XGBoost 和 RandomForest 的多类挑战

h2o randomForest 变量重要性

R 中 h2o 包中的 predict.H2OModel() 是不是为 h2o.randomForest() 模型提供 OOB 预测?

Encog中的多类SVM分类

R:从 h2o.randomForest() 和 h2o.gbm() 绘制树

使用 H2O 在 R 中平衡随机森林