2 r classification machine-learning random-forest
我有 2 个类的数据集,我必须对其执行二进制分类。我选择随机森林作为分类器,因为它在其他模型中给了我最好的准确性。数据集 1 中的数据点数为 462,数据集 2 包含 735 个数据点。我注意到我的数据有轻微的类不平衡,所以我尝试优化我的训练模型并通过提供类权重来重新训练我的模型。我提供了以下类权重值。
cwt <- c(0.385,0.614) # Class weights
ss <- c(300,300) # Sample size
Run Code Online (Sandbox Code Playgroud)
我使用以下代码训练了模型
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
)
Run Code Online (Sandbox Code Playgroud)
使用选定的类权重提高了我的模型的准确性,但我仍然怀疑我的方法是正确的还是只是巧合。我如何确保我选择的班级体重是完美的?
我使用以下公式计算了班级权重:
正类的类权重 =(数据集 1 中的数据点数)/(总数据点)
负类的类权重 =(数据集 2 中的数据点数)/(总数据点))
Run Code Online (Sandbox Code Playgroud)For dataset-1 462/1197 = 0.385 For dataset-2 735/1197 = 0.614
这是一种可以接受的方法,如果不是为什么它可以提高我的模型的准确性。请帮助我理解类权重的细微差别。
我如何确保我选择的班级体重是完美的?
好吧,你当然不能——完美在这里绝对是错误的词;我们正在寻找有用的启发式方法,它们既能提高性能又有意义(即它们感觉不到魔法)。
鉴于此,我们确实有一种独立的方式来交叉检查您的选择(这似乎确实听起来不错),尽管在 Python 中而不是在 R 中: 的 scikit-learn 方法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])
Run Code Online (Sandbox Code Playgroud)
实际上,这些是您的数字乘以 ~ 2.11,即:
cw/2.11
# array([ 0.6139595, 0.3859174])
Run Code Online (Sandbox Code Playgroud)
看起来不错(乘以常数不会影响结果),保存一个细节:似乎 scikit-learn 建议我们使用您的数字转置,即类 1 的权重为 0.614,类 2 的权重为 0.386,而不是反之亦然你的计算。
我们刚刚进入了类权重实际定义的微妙之处,这些定义在框架和库中不一定相同。scikit-learn 使用这些权重对错误分类成本进行不同的加权,因此为少数类分配更大的权重是有意义的;这正是Breiman(RF 的发明者)和 Andy Liaw(R 包的维护者)在一篇论文草稿中的想法:randomForest
我们为每个类分配一个权重,少数类被赋予更大的权重(即更高的误分类成本)。
然而,这似乎不是R 方法中的classwt参数randomForest;从文档:
classwt 类的先验。不必加起来一。忽略回归。
“类的先验”实际上是类存在的类比,也就是你在这里计算的;这种用法似乎是相关(并获得高度投票)SO 线程的共识,R 中 RandomForest 包中的 RandomForest 函数中的参数“classwt”代表什么?; 此外,Andy Liaw 本人也说过(强调我的):
在随机森林包目前的“classwt”选项[...]是不同的,从如何官方Fortran代码(4版及更高版本)工具类的权重。
我猜 Fortran 的官方实现是在之前的论文草稿引用中描述的(即 scikit-learn-like)。
大约 6 年前,我在我的硕士论文期间自己使用 RF 处理不平衡数据,据我所知,我发现该sampsize参数更有用,classwtAndy Liaw(再次......)建议(强调我的) ):
在 R-help 存档中搜索以查看其他选项以及您可能不应该使用 classwt 的原因。
更重要的是,在关于详细解释的已经相当“黑暗”的上下文中,完全不清楚同时 使用sampsize 和 classwt参数的效果究竟是什么,就像你在这里所做的那样......
总结:
classwt和sampsize参数在隔离(而不是一起),以确保您的提高了精度,应归功于| 归档时间: |
|
| 查看次数: |
6965 次 |
| 最近记录: |