Class_Weight 在随机森林中 Python

Class_Weight in Random Forest Python

我目前正在尝试改变随机森林分类器的阈值以绘制 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)。它实际上在做什么?谢谢!

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

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

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

改变任何 scikit-learn classifier 的辨别阈值的最简单(根据我的经验)方法是使用 predict_proba() 函数。而不是返回单个输出 class,这个 returns 每个 class 中成员的概率(具体来说,它正在做的是输出在 classification,随机森林中所有树的平均数。)一旦你有了这些概率,就很容易通过将每个 class 的概率与某个阈值进行比较来实现你自己的最终 classification 步骤你可以改变。

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