我有两个类的数据集,我必须对其执行二进制分类。我选择随机森林作为分类器,因为它在其他模型中给了我最好的精度。dataset-1中的数据点数为462,dataset-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
)使用所选的类权重提高了我的模型的准确性,但我仍然怀疑我的方法是否正确,还是纯属巧合。我如何确保我的班级重量选择是完美的?
我使用以下公式计算类权重:
正类的类权重= (No.数据集中的数据点-1)/(总数据点) 负类的类权重= (No.数据集中的数据点-2/(总数据点)) 数据集-1 462/1197 = 0.385数据集-2 735/1197 = 0.614
这是一个可以接受的方法,如果不是,为什么它正在提高我的模型的准确性。请帮助我理解课堂重量的细微差别。
发布于 2019-07-17 14:58:20
我如何确保我的班级重量选择是完美的?
当然,你不可能--完美是绝对错误的词;我们正在寻找有用的启发式方法,它既能提高性能,又有意义(也就是说,它们感觉不像魔法)。
考虑到这一点,我们确实有一种独立的方法来反复检查您的选择(这听起来确实不错),尽管使用的是Python,而不是R: scikit--compute_class_weight的学习方法;我们甚至不需要确切的数据--只需要每个类的样本编号,您已经提供了:
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])看起来很好(用常数乘法不会影响结果),除了一个细节:似乎科学学习建议我们使用你的数字转换,即0.614的重量为1级和0.386级,而不是反之亦然,根据你的计算。
我们刚刚输入了类权重的确切定义的微妙之处,这些定义在不同的框架和库中不一定相同。scikit-学习使用这些权重来对错误分类的代价进行不同的加权,因此给少数群体类分配更大的权重是有意义的;这正是Breiman (RF的发明者)和Andy ( randomForest R包的维护者)在一个randomForest中的想法:
我们给每个类分配一个权重,少数类赋予更大的权重(即更高的错误分类成本)。
尽管如此,这是而不是在randomForest R方法中的classwt参数似乎是什么;来自文档
类的优先类。不必加到一起。因为回归而被忽略。
“类的先验”实际上是类存在的类推,也就是您在这里所计算的;这种用法似乎是一个相关的(并经过高度表决的)线程R中RandomForest包中的RandomForest函数中的参数'classwt‘代表什么?的共识;此外,Andy自己也有明示 (强调我的):
randomForest包中当前的"classwt“选项.与官方Fortran代码(version 4及更高版本)实现类权重的方式不同。
我猜,正式的Fortran实现就像前面引文中所描述的那样(也就是像scikit那样的学习)。
在我6年前的MSc论文中,我自己使用RF来处理不平衡的数据,据我所记得,我发现sampsize参数比classwt更有用,Andy (再次.)有建议 (重点雷):
搜索R-帮助档案中的其他选项,以及为什么您的不应该使用classwt。
而且,在一个已经相当“黑暗”的关于详细解释的上下文中,我们根本不清楚同时使用sampsize和classwt参数到底有什么影响,就像您在这里所做的那样.
结束:
classwt和sampsize参数(而不是一起使用),以确保您的改进的准确性应该被归因于什么地方。https://stackoverflow.com/questions/57076570
复制相似问题