python - 如何处理分类器中不平衡的类?

标签 python machine-learning

我正在使用 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))

最佳答案

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

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

  2. 您可以更改损失函数(即初始化 LinearSVC() 的方式以解决类不平衡问题。对于 example :model = LinearSVC(class_weight='平衡')。这将使模型学习考虑类别不平衡的损失函数。

关于python - 如何处理分类器中不平衡的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822729/

相关文章:

python - 修改python的字符串Formatter

python - tkinter 中是否可以有清晰/透明的标签?

hash - 特征哈希

python - 如何从 Pandas 数据框中删除特定列中包含任何字符串的行

machine-learning - 激活函数的导数与偏导数。损失函数

machine-learning - LightGBM:Sklearn 和 Native API 等效项

python - 避免从计算字段更改类的状态 - Odoo v8

python - 面向开发者/企业的 Box Python SDK : Clarifying JWT Authentication

python - 在 Python 中列出具有指定深度的目录

python - 在倾斜数据集的训练中使用精度和召回率