【问题标题】:Class_Weight in Random Forest Python随机森林 Python 中的 Class_Weight
【发布时间】:2018-04-10 21:31:05
【问题描述】:

我目前正在尝试改变随机森林分类器的阈值以绘制 ROC 曲线。我的印象是,对随机森林执行此操作的唯一方法是使用 class_weight 参数。我已经能够成功地做到这一点,提高和降低精度、召回率、真阳性和假阳性率;但是,我不确定我实际上在做什么。目前我有以下;

rfc = RandomForestClassifier(n_jobs=-1, oob_score=True,  n_estimators=50,max_depth=40,min_samples_split=100,min_samples_leaf=80, class_weight={0:.4, 1:.9})

.4 和 .9 实际上也指的是什么。我认为这是 40% 的数据集是 0 和 90% 的 1 但是,这显然没有意义(超过 %100)。它实际上在做什么?谢谢!

【问题讨论】:

    标签: python random-forest roc


    【解决方案1】:

    类权重通常不需要归一化为 1(重要的是类权重的比率,因此要求它们总和为 1 实际上并不是限制)。

    因此将类权重设置为 0.4 和 0.9 相当于假设数据中的类标签拆分为 0.4 / (0.4+0.9) 到 0.9 / (0.4+0.9) [大约 ~30% 属于类 0 和~70% 属于 1 类]。

    查看不同类别权重的另一种方法是,与另一个类别相比,更强烈地惩罚一个类别中的错误,但仍假设数据中的标签数量是平衡的。在您的示例中,将 1 误分类为 0 比将 0 误分类为 1 差 9/4 倍。

    【讨论】:

    • 你说的很有道理,真的帮助我理解了;但是,我的数据集实际上与您所说的相反,因此 70% 的 0 和 30% 的 1,更重要的是,我希望与第二种解释相反,即错误地将 0 分类为 1 的情况要差 9/4 倍(如我正在做客户流失预测)。但是我已经完成了上面展示的内容,这给了我很棒的结果,如果我翻转它,我会得到可怕的结果。你的解释是不是正好相反?即 70% 的 0 和 30% 的 1?
    • 您好 @Paul Rubenstein,您知道 12 类的权重 dic 的设置是什么吗?我的意思是,文档不是很清楚,所以他们提到的符号是 {0:1 , 1:1} {0:1,1:5},我不知道第一个 0:1 代表什么,以及如何设置所有类之间的比率。提前致谢。如果您想分享一些见解,我已经在 Data Science Stack Exchange 中发布了这个问题。 datascience.stackexchange.com/questions/84163/…
    【解决方案2】:

    改变任何 scikit-learn 分类器的区分阈值的最简单(根据我的经验)方法是使用 predict_proba() 函数。这不是返回单个输出类,而是返回每个类中成员资格的概率(具体而言,它正在输出分类期间达到的叶节点中样本的比例,对随机森林中的所有树进行平均。)一旦你有了这些概率,通过将每个类的概率与可以更改的某个阈值进行比较,很容易实现自己的最终分类步骤。

    probs = RF.predict_proba(X)    # output dimension: [num_samples x num_classes]
    for threshold in range(0,100): 
        threshold = threshold / 100.0
        classes = (probs > threshold).astype(int)
        # further analysis here as desired
    

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2017-09-10
      • 2015-08-28
      • 2021-02-01
      • 2018-05-27
      • 2016-05-15
      • 2021-05-29
      • 2020-02-05
      • 2013-06-26
      相关资源
      最近更新 更多