【发布时间】:2020-09-25 13:42:00
【问题描述】:
我正在使用 SVM,但我的数据集不平衡。我得到的结果是将 0 级分类为 99%,将 1 级分类为 1%。有什么方法可以使用 SVM 正确分类不平衡数据集。
【问题讨论】:
标签: python svm imbalanced-data
我正在使用 SVM,但我的数据集不平衡。我得到的结果是将 0 级分类为 99%,将 1 级分类为 1%。有什么方法可以使用 SVM 正确分类不平衡数据集。
【问题讨论】:
标签: python svm imbalanced-data
您可以通过多种方式处理不平衡的数据集。我最常用的有几个:
错误输出的惩罚:如果A类的样本比B类少得多,那么你可以增加对错误分类A的惩罚。
使用SMOTE 模块。它基本上采用给定类中两个点的凸组合,并为其分配与两个选定点相同的标签。
其他可能的选项包括查看不同的评估指标和验证策略,例如Stratified K Fold。
【讨论】:
有多种方法可以调整不平衡数据集以将其用于回归/分类。这里我将描述过采样和欠采样的方法。
在过采样中,您会复制少数类的数据,即使您的数据中有完全相同的行也是如此。在欠采样中,您选择所有具有类 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),允许您获得的数据有点不平衡,以便您的模型知道数据不完全平衡。
【讨论】: