过度训练数据不平衡的数据



我正在尝试对某些不平衡数据(〜20:1比率(进行二进制分类,并且获得了几乎完美的交叉验证精度,但可怕的预测速率与培训中未使用的数据有关/测试。有几千个负面例子和几百个积极的例子。该数据已被标准化,并使用SMOTE来平衡类分布。

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

我有点惊讶培训与新数据相比的表现如何。这可能是因为过度训练吗?我希望树木的结合能帮助减轻这种情况,但事实并非如此。这些数据可能很难与可用功能进行分类,但是我缺少一些明显的东西吗?

解决方案实际上很简单。通过分类,这种不平衡您需要 stright 您的分类,因此您的模型学习了如何平等地对真实和错误进行分类,而不必丢弃大量数据!

尝试类似此快速示例的东西:

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

与负分类相比,这将给出阳性分类的相对"权重"。然后,您可以这样调用您的模型:

classifier = svm.SVC(probability=True, class_weight={1: one_weight})
classifier.fit(training_set, train_classifiers)

因此,在这里,负的加权为1,而正的加权是先前计算的。例如,如果有底片的阳性数量的两倍,则可能是0.5。

祝你好运!

最新更新