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

时间:2016-03-06 03:21:28

标签: python machine-learning

我正在使用LinearSVM将我的文档分类。但是,我的数据集是不平衡的,有些类别下有48,000个文档,有些只有100个。当我训练我的模型时,即使使用分层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))

1 个答案:

答案 0 :(得分:1)

默认情况下,StratifiedKFold方法会考虑所有类别中标签的比例,这意味着每个折叠都会具有该样本中每个标签的精确(或接近精确)比率。无论你是否想要调整,都取决于你 - 你可以让分类器学习一些带有更多样本的标签的偏见(就像你现在一样),或者你可以做两件事之一:

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

  2. 您可以更改损失功能(即初始化LinearSVC()以解决类不平衡问题的方式。对于examplemodel = LinearSVC(class_weight='balanced')。这将导致模型学习考虑到阶级不平衡的损失函数。