我有一个类不平衡的数据集,类不是0就是1或者2。如何计算每个类的预测误差,然后在scikit-learn中相应地重新平衡weights?
0
1
2
weights
3qpi33ja1#
如果你想完全平衡(对每个类都同等重要),你可以简单地传递class_weight='balanced',正如docs中所述:平衡”模式使用y值自动调整权重,权重与输入数据中n_samples / (n_classes * np.bincount(y))的类频率成反比
class_weight='balanced'
n_samples / (n_classes * np.bincount(y))
kq0g1dla2#
如果类A的频率为10%,类B的频率为90%,则类B将成为主导类,决策树将偏向主导类在这种情况下,您可以向模型传递一个dic {A:9,B:1}来指定每个类的权重,如下所示
{A:9,B:1}
clf = tree.DecisionTreeClassifier(class_weight={A:9,B:1})
class_weight='balanced'也可以,它只是根据每个类频率的比例自动调整权重
在我使用class_weight='balanced'之后,每个类的记录号都变得相同(大约88923)
zte4gxcn3#
你可以使用class_weight,但是它似乎不太擅长处理严重不平衡的类,还有其他方法:我在这里用二进制分类作为一个例子...0类(任职人数不足):记录数x第1类(比例过高):记录数y过采样:如果有x个代表性不足的班级的记录,y个代表性过高的班级的记录,那么你取所有的y,加上x个重复的(y/x)采样不足:如果有x个代表性不足的类的记录,y个代表性过高的类的记录,那么你取所有的x加上代表性过高的类的y大小的样本还有一个SMOTE,它试图为代表性不足的类创建合成记录:https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.SMOTE.html
3条答案
按热度按时间3qpi33ja1#
如果你想完全平衡(对每个类都同等重要),你可以简单地传递
class_weight='balanced'
,正如docs中所述:平衡”模式使用y值自动调整权重,权重与输入数据中
n_samples / (n_classes * np.bincount(y))
的类频率成反比kq0g1dla2#
如果类A的频率为10%,类B的频率为90%,则类B将成为主导类,决策树将偏向主导类
在这种情况下,您可以向模型传递一个dic
{A:9,B:1}
来指定每个类的权重,如下所示class_weight='balanced'
也可以,它只是根据每个类频率的比例自动调整权重在我使用
class_weight='balanced'
之后,每个类的记录号都变得相同(大约88923)zte4gxcn3#
你可以使用class_weight,但是它似乎不太擅长处理严重不平衡的类,还有其他方法:
我在这里用二进制分类作为一个例子...
0类(任职人数不足):记录数x
第1类(比例过高):记录数y
过采样:如果有x个代表性不足的班级的记录,y个代表性过高的班级的记录,那么你取所有的y,加上x个重复的(y/x)
采样不足:如果有x个代表性不足的类的记录,y个代表性过高的类的记录,那么你取所有的x加上代表性过高的类的y大小的样本
还有一个SMOTE,它试图为代表性不足的类创建合成记录:https://imbalanced-learn.org/stable/references/generated/imblearn.over_sampling.SMOTE.html