【问题标题】:H2O deeplearning with class imbalance具有类不平衡的 H2O 深度学习
【发布时间】:2017-01-05 09:16:26
【问题描述】:

我正在使用 H2O 深度学习前馈深度神经网络进行二进制分类。我的课程高度不平衡,我想使用像

这样的参数

balance_classes,class_sampling_factors

任何人都可以给我一个可重复的示例,说明如何专门初始化这些参数以处理类不平衡问题。

【问题讨论】:

    标签: r machine-learning deep-learning h2o


    【解决方案1】:

    首先,这是完整的、可重现的示例:

    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 个数据点,那么这里的采样因子是什么,我将如何计算它?
    • @Newbie 它们就是您想要对每个类进行过度采样(或低于 1.0 时采样不足)的程度。那么,就您而言,我想您想对每个“阳性”样本进行 50 次过度采样?所以你给class_sampling_factors = c(50, 1)(假设“积极”是第一类)。但请注意:这是设置balance_classes 的默认行为!如果您需要不同的比率,只需设置class_sampling_factors
    猜你喜欢
    • 2017-11-19
    • 2016-07-25
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多