过度训练与不平衡的数据

时间:2017-06-07 15:45:51

标签: python machine-learning scikit-learn data-science

我正在尝试对某些不平衡数据(约20:1比率)执行二进制分类,并且已经获得了几乎完美的交叉验证准确性,但是在训练/测试中未使用数据的预测率很差。有几千个负面例子和几百个正面例子。这些数据已经标准化,SMOTE用于平衡类分布。

使用RandomForests分类器,KFold交叉验证几乎是完美的,但召回/准确度值介于0.1-0.3之间。我尝试了不同的平衡方法,PCA(大约有80个原始特征),多个分类器,CV网格优化,甚至在8次训练后组合树,但这些都没有显着改善结果。

与新鲜数据相比,我对培训的进展情况感到有些惊讶。是否有可能是因为过度训练?我希望树木的结合有助于缓解这种情况,但事实并非如此。 这些数据可能很难用可用的功能进行分类,但有哪些东西显而易见我缺少?

1 个答案:

答案 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,例如。

祝你好运!

相关问题