Random Forest Python中的Class_Weight

时间:2017-10-29 23:05:58

标签: python random-forest roc

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

2 个答案:

答案 0 :(得分: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倍。

答案 1 :(得分:0)

根据我的经验,改变任何scikit学习分类器的判别阈值最简单的方法是使用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