Python 随机森林中的类_权重

Python 随机森林中的类_权重,python,random-forest,roc,Python,Random Forest,Roc,我目前正在尝试改变随机森林分类器的阈值,以便绘制ROC曲线。我的印象是,对随机林执行此操作的唯一方法是使用class_权重参数。我成功地做到了这一点,提高和降低了准确率、召回率、真阳性率和假阳性率;然而,我不确定我到底在做什么。目前我有以下几点: rfc = RandomForestClassifier(n_jobs=-1, oob_score=True, n_estimators=50,max_depth=40,min_samples_split=100,min_samples_leaf=8

我目前正在尝试改变随机森林分类器的阈值,以便绘制ROC曲线。我的印象是,对随机林执行此操作的唯一方法是使用class_权重参数。我成功地做到了这一点,提高和降低了准确率、召回率、真阳性率和假阳性率;然而,我不确定我到底在做什么。目前我有以下几点:

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%)。它到底在做什么?谢谢

类权重通常不需要归一化为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倍。

根据我的经验,改变任何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

你说的很有道理,真的帮助我理解了;然而,我的数据集实际上与您所说的相反,因此70%的0和30%的1,更重要的是,我希望与第二种解释相反,即错误地将0分类为1(因为我正在进行客户流失预测)是9/4倍。但我已经完成了我上面展示的,这给了我梦幻般的结果,如果我翻动它,我会得到可怕的结果。你的解释有可能是相反的吗?i、 70%0和30%1?你好@Paul Rubenstein,你知道12个类的权重dic的设置是什么吗,我的意思是,文档不是很清楚,所以他们提到的符号是{0:1,1:1}{0:1,1:5},我不知道第一个0:1代表什么,我如何设置所有类之间的比率。提前谢谢。如果您想分享一些见解,我已经在Data Science Stack Exchange上发布了这个问题。