【发布时间】:2017-01-05 09:16:26
【问题描述】:
我正在使用 H2O 深度学习前馈深度神经网络进行二进制分类。我的课程高度不平衡,我想使用像
这样的参数balance_classes,class_sampling_factors
任何人都可以给我一个可重复的示例,说明如何专门初始化这些参数以处理类不平衡问题。
【问题讨论】:
标签: r machine-learning deep-learning h2o
我正在使用 H2O 深度学习前馈深度神经网络进行二进制分类。我的课程高度不平衡,我想使用像
这样的参数balance_classes,class_sampling_factors
任何人都可以给我一个可重复的示例,说明如何专门初始化这些参数以处理类不平衡问题。
【问题讨论】:
标签: r machine-learning deep-learning h2o
首先,这是完整的、可重现的示例:
library(h2o)
h2o.init()
data(iris) #Not required?
iris <- iris[1:120,] #Remove 60% of virginica
summary(iris$Species) #50/50/20
d <- as.h2o(iris)
splits = h2o.splitFrame(d,0.8,c("train","test"), seed=77)
train = splits[[1]]
test = splits[[2]]
summary(train$Species) #41/41/14
summary(test$Species) #9/9/6
m1 = h2o.randomForest(1:4, 5, train, model_id ="RF_defaults", seed=1)
h2o.confusionMatrix(m1)
m2 = h2o.randomForest(1:4, 5, train, model_id ="RF_balanced", seed=1,
balance_classes = TRUE)
h2o.confusionMatrix(m2)
m3 = h2o.randomForest(1:4, 5, train, model_id ="RF_balanced", seed=1,
balance_classes = TRUE,
class_sampling_factors = c(1, 1, 2.5)
)
h2o.confusionMatrix(m3)
第一行初始化 H2O,然后我故意修改 iris 数据集以丢弃 3 个类中的一个的 60%,从而造成不平衡。
接下来的几行将该数据加载到 H2O 中,并创建 80%/20% 的训练/测试数据拆分。种子是特意选择的,因此在训练数据 virginica 中占数据的 14.58%,而在原始数据中为 16.67%,在测试数据中为 25%。
然后我训练三个随机森林模型。 m1 都是默认值,它的混淆矩阵是这样的:
setosa versicolor virginica Error Rate
setosa 41 0 0 0.0000 = 0 / 41
versicolor 0 39 2 0.0488 = 2 / 41
virginica 0 1 13 0.0714 = 1 / 14
Totals 41 40 15 0.0312 = 3 / 96
这里没什么可看的:它使用它找到的数据。
现在m2 的输出相同,它打开balance_classes。您可以看到它对 virginica 类进行了过度采样,以使它们尽可能平衡。 (最右边的列是 41,41,40,而不是之前输出中的 41,41,14。)
setosa versicolor virginica Error Rate
setosa 41 0 0 0.0000 = 0 / 41
versicolor 0 41 0 0.0000 = 0 / 41
virginica 0 2 38 0.0500 = 2 / 40
Totals 41 43 38 0.0164 = 2 / 122
在m3我们还是打开balance_classes,但也告诉它实情。 IE。实际数据是 16.67% virginica,而不是它在 train 数据中看到的 14.58%。 m3 的混淆矩阵显示它因此将 14 个 virginica 样本变成了 37 个样本,而不是 40 个样本。
setosa versicolor virginica Error Rate
setosa 41 0 0 0.0000 = 0 / 41
versicolor 0 41 0 0.0000 = 0 / 41
virginica 0 2 35 0.0541 = 2 / 37
Totals 41 43 35 0.0168 = 2 / 119
我怎么知道写c(1, 1, 2.5),而不是c(2.5, 1, 1) 或c(1, 2.5, 1)?文档说它必须是“字典顺序”。您可以了解该订单的内容:
h2o.levels(train$Species)
告诉我:
[1] "setosa" "versicolor" "virginica"
意见位:balance_classes 可以开启,但 class_sampling_factors 只有在您有充分理由相信您的训练数据不具代表性时才应使用。
注意:代码和解释改编自我即将出版的书,Practical Machine Learning with H2O。
【讨论】:
class_sampling_factors?例如,如果我的数据集包含来自正类的 1000 个数据点和来自负类的 50000 个数据点,那么这里的采样因子是什么,我将如何计算它?
class_sampling_factors = c(50, 1)(假设“积极”是第一类)。但请注意:这是设置balance_classes 的默认行为!如果您需要不同的比率,只需设置class_sampling_factors。