我正在使用SVM,并且我的数据集不平衡。我得到的结果是将0类归为99%,将1类归为1%。有什么方法可以使用SVM对不平衡数据集进行正确分类。
答案 0 :(得分:0)
可以使用多种方法来处理不平衡的数据集。我最常使用其中的几个:
对错误输出进行惩罚:如果类B
的样本数少于类A
,则可以增加因类def grid(row, col):
x = ('+----' * col + '+')
y = ('\n' +'| ' * (col+1))
return ((x + 4*y) +'\n')*row + x
print(grid(3,2))
Result :
+----+----+
| | |
| | |
| | |
| | |
+----+----+
| | |
| | |
| | |
| | |
+----+----+
| | |
| | |
| | |
| | |
+----+----+
的分类错误而带来的损失。
使用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),它使您得到的数据有些不平衡,因此您的模型知道数据没有完全平衡。