我有一个数据集,其中类别不平衡。类别分为'1'或'0',其中'1'类和'0'类比例为5:1。如何在使用sklearn的随机森林算法中计算每个类别的预测误差并相应地重新平衡权重,类似于以下链接中所示的操作:http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#balance
我有一个数据集,其中类别不平衡。类别分为'1'或'0',其中'1'类和'0'类比例为5:1。如何在使用sklearn的随机森林算法中计算每个类别的预测误差并相应地重新平衡权重,类似于以下链接中所示的操作:http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#balance
您可以将样本权重参数传递给随机森林的拟合方法
sample_weight : array-like, shape = [n_samples] or None
样本权重。如果为None,则样本权重相等。在搜索每个节点的分裂时,忽略会创建带有净零或负权重的子节点的分裂。对于分类问题,如果任何一个单一类在任一子节点中具有负权重,则也会忽略分裂。
在旧版本中,有一个preprocessing.balance_weights
方法,用于生成给定样本的平衡权重,使得类变得均匀分布。它仍然存在于内部但仍然可用的preprocessing._weights模块中,但已被弃用,并将在未来版本中删除。不知道具体原因。
更新
作为澄清,当你感到困惑时,sample_weight
的使用是直截了当的,只要你记住它的目的是平衡训练数据集中的目标类。也就是说,如果你有X
作为观察值和y
作为类(标签),那么len(X)==len(y)==len(sample_wight)
,每个1-D数组sample witght
的元素表示对应的(observation, label)
对的权重。对于你的情况,如果1类被表示为5次,而0类只有一次,如果你平衡类分布,你可以使用简单的
sample_weight = np.array([5 if i == 0 else 1 for i in y])
将所有的0
实例分配权值为5
,将所有的1
实例分配权值为1
。请参见上面的链接以了解更加巧妙的balance_weights
权重评估函数。
使用参数 class_weight='balanced'
来自sklearn文档:使用平衡模式,根据输入数据中类别频率的倒数自动调整权重,公式为n_samples / (n_classes * np.bincount(y))
如果多数类为1,少数类为0,并且它们的比例为5:1,则sample_weight
数组应为:
sample_weight = np.array([5 if i == 1 else 1 for i in y])
class_weights
。较大的数字与多数类相关联。sample_weight = np.array([5 if i == 0 else 1 for i in y])
- agent18
sample_weights
使用的信息。对于y = [1,1,0,0,0,0,0,0,0,0]
,可以使用sw = [1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
。 - alko