mlo*_*mlo 32 python classification machine-learning random-forest scikit-learn
我有一个数据集,其中类是不平衡的.类为'1'或'0',其中类'1':'0'的比例为5:1.你如何计算每个类的预测误差和相应的重新平衡权重在sklearn中随机森林,类似于以下链接:http: //www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#平衡
alk*_*lko 45
您可以将样本权重参数传递给随机森林拟合方法
sample_weight : array-like, shape = [n_samples] or None
Run Code Online (Sandbox Code Playgroud)
样品重量.如果为None,则样本的权重相等.在每个节点中搜索拆分时,将忽略将创建具有净零或负权重的子节点的拆分.在分类的情况下,如果它们将导致在任一子节点中携带负权重的任何单个类,则也忽略分裂.
在旧版本中,有一种preprocessing.balance_weights方法可以为给定的样本生成平衡权重,从而使类变得均匀分布.它仍在那里,在内部但仍然可用的preprocessing._weights模块中,但已弃用,将在以后的版本中删除.不知道具体原因.
更新
一些澄清,因为你似乎很困惑.sample_weight一旦你记住它的目的是平衡训练数据集中的目标类,用法很简单.也就是说,如果你有X观察和y类(标签),那么len(X) == len(y) == len(sample_wight),sample witght1-d数组的每个元素代表相应(observation, label)对的权重.对于您的情况,如果1类被表示为0类的5倍,并且您平衡类分布,则可以使用简单
sample_weight = np.array([5 if i == 0 else 1 for i in y])
Run Code Online (Sandbox Code Playgroud)
重量分配的5所有0实例和重量的1所有1实例.请参阅上面的链接,了解更多狡猾的balance_weights权重评估功能.
sklearn的"适合"方法不允许指定要优化的性能度量,这实在令人遗憾.在解决分类任务时,当人们在数据样本上调用拟合方法时,周围没有人似乎理解或质疑或对实际发生的事情感兴趣.
我们(scikit学习包的用户)默默地建议间接使用交叉验证网格搜索和适用于不平衡数据集的特定评分方法,希望偶然发现产生适当AUC或F1分数的参数/元参数集.
但想想看:看起来像引擎盖下的"适合"方法每次都会优化准确性.因此,在最终效果中,如果我们的目标是最大化F1得分,GridSearchCV为我们提供了"具有最佳准确度的所有模式中最佳F1的模型".那不是傻吗?直接优化模型参数以获得最大F1分数不是更好吗?记住旧的好的Matlab人工神经网络包,在这里你可以设置所需的性能指标到RMSE,MAE,以及任何你想要的梯度计算算法定义.为什么从sklearn中默认选择性能指标?
至少,为什么没有简单的选项来自动分配类实例权重来弥补不平衡的数据集问题?为什么我们必须手动计算人体?此外,在许多机器学习书籍/文章中,我看到作者赞扬sklearn的手册,如果不是最好的主题信息来源,那就太棒了.不完全是?为什么不平衡的数据集问题(这显然对数据科学家来说非常重要)在文档中甚至没有涉及到它们?如果他们读到这个,我会向sklearn的贡献者提出这些问题.或者任何知道这样做的理由欢迎评论和澄清事情.
UPDATE
由于scikit-learn 0.17,有class_weight ='balanced'选项,你可以至少传递给一些分类器:
"平衡"模式使用y的值来自动调整与输入数据中的类频率成反比的权重,如n_samples /(n_classes*np.bincount(y)).
使用参数class_weight='balanced'
来自 sklearn 文档:平衡模式使用 y 的值自动调整权重,与输入数据中的类别频率成反比,如下所示n_samples / (n_classes * np.bincount(y))