我正在使用 RandomForest 进行多类分类。我想使用 oob_decision_function 来探索精度/召回率,但我不了解 OOB 结果。
我正在使用 25,000 棵树(n_estimators=25000),可能的类值为 0,1 或 2。
我的结果是(截断到前 10 行):
y_train = [1 2 1 1 0 0 2 2 2 2]
y_pred = [2 2 2 1 0 2 2 2 2 2]
oob_decision_function:
[[ 0.25377529 0.28080796 0.46541674]
[ 0.32162915 0.3250808 0.35329005]
[ 0.34463485 0.27709584 0.3782693 ]
[ 0.31091392 0.2982096 0.39087648]
[ 0.34932553 0.28632762 0.36434685]
[ 0.31535905 0.19570567 0.48893528]
[ 0.25472683 0.35845451 0.38681866]
[ 0.32521156 0.31721116 0.35757728]
[ 0.30706625 0.32703203 0.36590172]
[ 0.29785305 0.22490485 0.4772421 ]]
数据集不统一:
class 0: 32% of samples
class 1: 27% of samples
class 2: 41% of samples
预测似乎与决策函数不一致。例如,参见第 4 个样本:预测 (y_pred[3]) 是第 1 类,但 OOB 值为 0.3109(第 0 类)、0.2982(第 1 类)和 0.3908(第 2 类)。为什么预测是 1 类而不是 2 类?我认为在 25,000 棵树之后,预测应该与 OOB 概率密切匹配,还是我没有正确理解 OOB?
几个问题:
OOB 值是如何计算的?我认为它是这样的:为 25,000 棵树中的每一棵树创建一个新的袋装训练集。假设一个给定的样本不包括在 6000 棵树中(即袋外)。当样本在袋外时,当前树用于预测该样本的类别。因此,对于我们给定的样本,估计为 6000 次,假设预测是 0 类(1000 次)、1 类(2000 次)和 2 类(3000 次)。因此,OOB 值为 1000/6000(0 类)、2000/6000(1 类)和 3000/6000(2 类)。它是否正确?
OOB 值是使用单个树的预测结果计算的(如上所述),但输出预测(即 y_pred)来自最终的树集合。它是否正确?
随着树木数量的增加,OOB 值是否应该收敛到交叉验证值?AFAIK k折交叉验证将数据拆分为k个子集,并在每个子集上使用整个森林。
是否应用了某种加权(例如,如果我的数据不是均匀分布的)?