我正在使用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
方法会考虑所有类别中标签的比率,这意味着每一折将具有该样品中每个标签的准确(或接近准确)比率。是否要对此进行调整取决于您的情况-您可以让分类器了解带有更多样本的标签的某种偏差(如您现在所述),或者可以执行以下两项操作之一:
构造一个单独的训练/测试集,其中训练集的每个标签中样本的数量相等(因此,在您的情况下,训练集中的每个班级标签可能只有50个示例,这是不理想的)。然后,您可以训练自己的训练集并测试其余部分。如果您对不同的样品多次进行此操作,则实际上是在进行k倍交叉验证,只是以不同的方式选择样品大小。
您可以更改损失函数(即初始化LinearSVC()
的方法以解决类不平衡问题。对于example:model = LinearSVC(class_weight='balanced')
。这将使模型学习考虑类不平衡的损失函数。
关于python - 如何处理分类器中不平衡的类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35822729/