如何计算随机森林的班级权重

时间:2019-07-17 13:05:50

标签: r machine-learning classification random-forest

我有2个类别的数据集,必须在其上执行二进制分类。我选择随机森林作为分类器,因为它使我在其他模型中具有最高的准确性。 数据集1中的数据点数为462,数据集2中包含735个数据点。我注意到我的数据存在很小的班级失衡,因此我尝试优化我的训练模型并通过提供班级权重来重新训练我的模型。我提供了以下班级权重的值。

cwt <- c(0.385,0.614) # Class weights
ss <- c(300,300) # Sample size

我使用以下代码训练了模型

tr_forest <- randomForest(output ~., data = train,
          ntree=nt, mtry=mt,importance=TRUE, proximity=TRUE,
          maxnodes=mn,sampsize=ss,classwt=cwt,
          keep.forest=TRUE,oob.prox=TRUE,oob.times= oobt,
          replace=TRUE,nodesize=ns, do.trace=1
          )

使用选定的班级权重可以提高模型的准确性,但是我仍然怀疑我的方法是正确的还是偶然的。如何确保我的班级体重选择是完美的?

我使用以下公式计算班级权重:

  

正类的类权重=(   数据集1)/(总数据点)

     

否定类别的类别权重=(   数据集2)/(总数据点))

 For dataset-1 462/1197 = 0.385
 For dataset-2 735/1197 = 0.614

这是可以接受的方法吗?如果不是,为什么它可以提高模型的准确性。请帮助我了解课堂权重的细微差别。

1 个答案:

答案 0 :(得分:2)

  

如何确保我的班级体重选择是完美的?

好吧,您当然不能- perfect 是绝对错误的单词;我们正在寻找有用的启发式,它们既可以提高性能,又可以使代码有意义(即,它们感觉不像魔术)。

鉴于这一点,我们确实有一种独立的方法来交叉检查您的选择(确实听起来不错),尽管在Python中而不是在R中:compute_class_weight的scikit-learn方法;我们甚至不需要确切的数据-只需提供您已经提供的每个类别的样本号即可:

import numpy as np
from sklearn.utils.class_weight import compute_class_weight

y_1 = np.ones(462)     # dataset-1
y_2 = np.ones(735) + 1 # dataset-2
y = np.concatenate([y_1, y_2])
len(y)
# 1197

classes=[1,2]
cw = compute_class_weight('balanced', classes, y)
cw
# array([ 1.29545455,  0.81428571])

实际上,这些是您的数字乘以〜2.11,即:

cw/2.11
# array([ 0.6139595,  0.3859174])

看起来不错(乘以常数不会影响结果),请保留一个细节:似乎scikit-learn建议我们使用您的数字转置,即对于1类和0.386,权重为0.614对于第2类,而不是根据您的计算相反。

我们刚刚输入了确切定义的细微之处,实际上是什么是类权重的,而在各个框架和库中不一定相同。 scikit-learn使用这些权重对错误分类成本进行不同的加权,因此将更大权重分配给 minority 类是有意义的;这是RF的发明人Breiman和randomForest R软件包的维护者Andy Liaw在draft paper中提出的想法:

  

我们为每个类别分配一个权重,而少数类别的权重更大(即,错误分类的成本更高)。

尽管如此,这不是不是classwt R方法中的randomForest参数似乎是;来自docs

  

classwt 课程的优先级。无需加一。忽略回归。

类的先决条件”实际上是类存在的类比,也就是说,正是您在此处计算的内容;这种用法似乎是一个相关(且获得高度评价)的SO线程What does the parameter 'classwt' in RandomForest function in RandomForest package in R stand for?的共识;另外,安迪·利奥(Andy Liaw)本人还stated(强调我):

  

randomForest软件包中的当前“ classwt”选项与官方的Fortran代码(版本4及更高版本)实现类权重的方式不同

我猜想官方的Fortran实施与草案草稿的前引文中所述(即scikit-learn-like)一样。

大约6年前,我在理学硕士论文期间就使用RF来处理不平衡的数据,据我所知,我发现sampsize参数比classwt有用, Andy Liaw(再次...)拥有advised(强调我):

  

在R-help归档文件中搜索以查看其他选项,以及为什么不应使用classwt的原因。

此外,在已经很“黑暗”的详细说明中,完全不清楚同时使用 sampsize到底有什么作用? em> classwt个参数,就像您在这里所做的一样……


总结:

  • 您所做的事情似乎确实是正确且合乎逻辑的
  • 您应尝试单独使用classwtsampsize参数 (而不是一起使用),以确保应将提高的精度归因于
  • >