【问题标题】:How do I handle unbalanced classes in my classifier?如何处理分类器中的不平衡类?
【发布时间】:2016-06-19 18:18:46
【问题描述】:

我正在使用 LinearSVM 将我的文档分类。但是,我的数据集不平衡,有些类别下有 48,000 个文档,有些只有 100 个。当我训练我的模型时,即使使用 Stratified KFold,我发现具有 48,000 个文档的类别获得了更大的文档部分(3300)与其他人相比。在这种情况下,它肯定会给我有偏见的预测。如何确保此选择没有偏见?

kf=StratifiedKFold(labels, n_folds=10, shuffle=True)

for train_index, test_index in kf:
     X_train, X_test = docs[train_index],docs[test_index]
     Y_train, Y_test = labels[train_index],labels[test_index] 

然后我将这些(X_train, Y_train) 写入文件,计算特征矩阵并将它们传递给分类器,如下所示:

model1 = LinearSVC()
model1 = model1.fit(matrix, label_tmp)
pred = model1.predict(matrix_test)
print("Accuracy is:")
print(metrics.accuracy_score(label_test, pred))
print(metrics.classification_report(label_test, pred))

【问题讨论】:

    标签: python machine-learning


    【解决方案1】:

    默认情况下,StratifiedKFold 方法会考虑所有类中标签的比率,这意味着每个折叠将具有该样本中每个标签的精确(或接近精确)比率。是否要对此进行调整在某种程度上取决于您 - 您可以让分类器为具有更多样本的标签学习某种偏差(就像您现在一样),或者您可以做以下两件事之一:

    1. 构造一个单独的训练/测试集,其中训练集在每个标签中具有相同数量的样本(因此在您的情况下,训练集中的每个类标签可能只有 50 个示例,这并不理想) .然后,您可以在训练集上进行训练并在其余部分上进行测试。如果您对不同的样本多次执行此操作,则本质上是在进行 k 折交叉验证,只是以不同的方式选择样本大小。

    2. 1234563考虑到不平衡。

    【讨论】:

    • 嗨,我认为我的 scikit 版本不支持平衡,所以我将其设置为“自动”。所以我看到准确率已经从 70%(之前)下降到现在的 53%。那是不是不利呢?
    • (1) 你应该更新你的 scikit-learn 版本。没有理由使用旧的。如果您阅读文档,“自动”在新版本中变成了“平衡”。 (2) 预计精度下降。想想这个场景:你有 9 个 A 类的例子和一个 B 类的例子。如果你的分类器总是猜测一个样本属于 A 类,那么你的准确率是 90%。如果你学习了一个平衡分类器,你实际上可能会猜测事物同时属于 A 和 B,但你可能会得到更多错误。因此,准确度不是使用正确的指标 - 而是查看准确度或平均准确度。
    猜你喜欢
    • 2023-03-17
    • 2013-12-26
    • 2020-06-27
    • 2019-11-22
    • 2017-04-19
    • 2020-09-04
    • 2021-06-28
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多