我正在尝试对某些不平衡数据(约20:1比率)执行二进制分类,并且已经获得了几乎完美的交叉验证准确性,但是在训练/测试中未使用数据的预测率很差。有几千个负面例子和几百个正面例子。这些数据已经标准化,SMOTE用于平衡类分布。
使用RandomForests分类器,KFold交叉验证几乎是完美的,但召回/准确度值介于0.1-0.3之间。我尝试了不同的平衡方法,PCA(大约有80个原始特征),多个分类器,CV网格优化,甚至在8次训练后组合树,但这些都没有显着改善结果。
与新鲜数据相比,我对培训的进展情况感到有些惊讶。是否有可能是因为过度训练?我希望树木的结合有助于缓解这种情况,但事实并非如此。 这些数据可能很难用可用的功能进行分类,但有哪些东西显而易见我缺少?
答案 0 :(得分:1)
解决方案实际上非常简单。对于不平衡的分类,您需要权重您的分类,以便您的模型学会如何平等地分类真假,而不必丢弃大量数据!
尝试类似这样的快速示例:
def calculate_class_weights(train_classifications):
one_count = 0
zero_count = 0
one_weight = 0
for i in train_classifications:
if i == 1:
one_count += 1.0
if i == 0:
zero_count += 1.0
if one_count > zero_count:
one_weight = one_count / zero_count
if one_count < zero_count:
one_weight = zero_count / one_count
return one_weight
这将给出相对重量&#39;与阴性分类相比,阳性分类。然后,您可以像这样调用您的模型:
classifier = svm.SVC(probability=True, class_weight={1: one_weight})
classifier.fit(training_set, train_classifiers)
所以这里负数的权重是1,而正数的权重是先前计算的。例如,如果有正数的两倍,则可以是0.5,例如。
祝你好运!