python - 在对多数类进行欠采样后,让训练集 < 测试集是否可行?
问题描述
我有一个包含 1500 条记录的数据集,其中有两个不平衡的类。0 类是 1300 条记录,而 1 类是 200 条记录,因此比率为 6.5:1。
我用这个数据集构建了一个随机森林进行分类。我从过去的经验中知道,如果我使用整个数据集,召回率非常低,这可能是由于类别不平衡造成的。
所以我决定对0类进行欠采样。我的步骤如下:
将数据集随机分成比例为 7:3 的训练和测试集(因此 1050 用于训练,450 用于测试。)
现在,训练集有约 900 个 0 类数据 ~100 类 1 类数据。我对 0 类约 900 个数据进行聚类,并将其(按比例)欠采样到约 100 条记录。
所以现在训练集 ~100 Class 0 + ~100 Class 1 = ~200 条记录,而测试集是 70 Class 0 + 380 Class 1 = 450 条记录。
我的问题来了:
1) 我的步骤有效吗?我首先拆分训练/测试,然后对训练集的多数类进行欠采样。
2)现在我的训练集(~200)<测试集(450)。是否有意义?
3) 性能仍然不是很好。精度为 0.34,召回率为 0.72,f1 得分为 0.46。有什么方法可以改善吗?我应该使用简历吗?
非常感谢您的帮助!
解决方案
1) 我的步骤有效吗?我首先拆分训练/测试,然后对训练集的多数类进行欠采样。
您应该拆分train
,test
因此在两者中都保留了类平衡。如果在您的整个数据集中,比率在和6.5:1
中应该相同。train
test
是的,您应该在欠采样之前对其进行拆分(无需对test
案例进行欠采样),只需记住监控多个指标(例如f1 score
,已经提到过,您应该可以接受这些指标),因为您正在训练recall
与.precision
test
2)现在我的训练集(~200)<测试集(450)。是否有意义?
是的,它确实。您也可以选择oversampling
训练数据集(例如minority
随机重复类以匹配来自 的示例数量majority
)。在这种情况下,您也必须先拆分,否则您可能会test
用样本破坏您的集合,training
这将是更加灾难性的。
3) 性能仍然不是很好。精度为 0.34,召回率为 0.72,f1 得分为 0.46。有什么方法可以改善吗?我应该使用简历吗?
这取决于具体问题,我会做什么:
oversampling
而不是undersampling
- 神经网络需要大量数据,你现在没有很多样本- 尝试其他非 DL 算法(
SVM
如果你有很多功能?RandomForest
否则可能也是一个不错的选择) - 否则微调你的神经网络(特别关注
learning rate
,如果你有时间,使用 CV 或相关方法) - 如果可用于手头的任务,请尝试使用一些预训练的神经网络
推荐阅读
- r - 如何使用 grep 提取日期?我需要为每一个匹配“,”,“/”,“.”,“-”
- python - Python中的Hash Map只是一个字典吗?
- java - Java 函数到递归函数问题
- php - ZipArchive::addFile() 在 Windows 中创建树形结构的 zip 文件,但在 Linux 中是扁平的
- java - 如何将项目插入列表的前面?
- r - omu_anova 错误:提供的行名长度错误
- python - 如何将python日期时间修剪到最接近某个频率?
- error-handling - 标注范围 Input TextField Material
- java - SingletonCluster Actor 未正确初始化(无法发送消息/向接待员注册)
- html - 如何在 HTML 表单上制作所需的复选框和单选按钮