如何使用SVM对不平衡数据集进行分类

时间:2020-06-06 11:03:31

标签: python svm imbalanced-data

我正在使用SVM,并且我的数据集不平衡。我得到的结果是将0类归为99%,将1类归为1%。有什么方法可以使用SVM对不平衡数据集进行正确分类。

2 个答案:

答案 0 :(得分:0)

可以使用多种方法来处理不平衡的数据集。我最常使用其中的几个:

  1. 对错误输出进行惩罚:如果类B的样本数少于类A,则可以增加因类def grid(row, col): x = ('+----' * col + '+') y = ('\n' +'| ' * (col+1)) return ((x + 4*y) +'\n')*row + x print(grid(3,2)) Result : +----+----+ | | | | | | | | | | | | +----+----+ | | | | | | | | | | | | +----+----+ | | | | | | | | | | | | +----+----+ 的分类错误而带来的损失。

  2. p>
  3. 使用SMOTE模块。它基本上采用给定类中两个点的凸组合,并为其指定与两个选定点相同的标签。

其他可能的选择包括查看不同的评估指标和验证策略,例如Stratified K Fold

答案 1 :(得分:0)

有多种方法可以调整不平衡数据集以将其用于回归/分类。在这里,我将描述过采样和欠采样的方法。

过采样中,即使少数几行中的数据完全相同,也要复制少数类的数据。在欠采样中,选择所有具有1类的数据,并选择相同数量的带有标签0的样本(这是一个好选择,如果您有大量的样本)。

您也可以将两者混合使用。像这样:

def obtain_equal_idx(idx_0, idx_1, n_samples, ratio_unbalance):
    idx_1_repeated = np.repeat(idx_1, (n_samples // len(idx_1)) + 1)

    idx_0s = np.random.choice(idx_0, ratio_unbalance * (n_samples // 2), replace=False)
    idx_delay = np.random.choice(idx_1_repeated, n_samples // 2, replace=False)
    return np.concatenate([idx_0s, idx_delay])

idx_0是标记为0的整个数据集的索引,idx_1与标记为1的数据是相同的,n_samples是要获取的样本数, ratio_unbalance是一个数字(通常为2或3),它使您得到的数据有些不平衡,因此您的模型知道数据没有完全平衡。