在随机森林中传递 Class_weight 参数时出错

Posted

技术标签:

【中文标题】在随机森林中传递 Class_weight 参数时出错【英文标题】:Getting error while passing Class_weight parameter in Random Forest 【发布时间】:2018-05-27 17:50:08 【问题描述】:

我正在做二进制分类器。由于我的数据不平衡,我正在使用班级权重。我在传递值时遇到错误如何解决这个问题。

错误:ValueError: class_weight must be dict, 'balanced', or None, got: [0: 0.4, 1: 0.6]"

代码

rf=RandomForestClassifier(n_estimators=1000,oob_score=True,min_samples_leaf=500,class_weight=[0:.4, 1:.6])
    fit_rf=rf.fit(X_train_res,y_train_res)

错误

\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\class_weight.py in compute_class_weight(class_weight, classes, y)
     60         if not isinstance(class_weight, dict):
     61             raise ValueError("class_weight must be dict, 'balanced', or None,"
---> 62                              " got: %r" % class_weight)
     63         for c in class_weight:
     64             i = np.searchsorted(classes, c)

ValueError: class_weight must be dict, 'balanced', or None, got: [0: 0.4, 1: 0.6]

如何解决这个问题。

【问题讨论】:

因为你只有一个类权重的字典,试着去掉括号,只传递字典。 class_weight=0:0.4, 1:0.6. @ScottBoston,谢谢它的工作,你能简要解释一下类权重是如何工作的。我的目标基本上是减少 1 类被错误分类为 0 类。我的数据高度不平衡,80% 来自 0 类,20% 来自 1 类 【参考方案1】:

根据documentation

class_weight : 字典,字典列表,“平衡”,

因此,class_weight 参数接受字典、字典列表或字符串“balanced”。您收到的错误消息表明它需要一本字典,并且由于您只有一本字典,因此不需要列表。

那么,让我们试试吧:

rf=RandomForestClassifier(n_estimators=1000,
                          oob_score=True,
                          min_samples_leaf=500,
                          class_weight=0:.4, 1:.6)

fit_rf=rf.fit(X_train_res,y_train_res)

【讨论】:

以上是关于在随机森林中传递 Class_weight 参数时出错的主要内容,如果未能解决你的问题,请参考以下文章

随机森林中的 class_weight 超参数改变了混淆矩阵中的样本数量

ScikitLearn 随机森林中的欠采样与 class_weight

随机森林:平衡测试集?

随机森林中的 tuneGrid 参数问题

sklearn随机森林中的引导参数

随机森林算法demo python spark