我有一个包含1500条记录的数据集,分为两个类别,且类别不平衡。类别0有1300条记录,而类别1有200条记录,因此比例约为6.5:1。
我使用这个数据集构建了一个随机森林进行分类。根据过去的经验,如果使用整个数据集,召回率会很低,这可能是由于类别不平衡造成的。
因此,我决定对类别0进行欠采样。我的步骤如下:
-
随机将数据集按7:3的比例分割为训练集和测试集(因此训练集有1050条记录,测试集有450条记录)。
-
现在训练集中有大约900条类别0的数据和大约100条类别1的数据。我对类别0的约900条数据进行聚类,并按比例欠采样至约100条记录。
因此,现在训练集大约有100条类别0的数据和100条类别1的数据,总共约200条记录,而测试集有70条类别0的数据和380条类别1的数据,总共450条记录。
我的问题来了:
1) 我的步骤是否有效?我先分割了训练集和测试集,然后对训练集的多数类进行了欠采样。
2) 现在我的训练集(约200)小于测试集(450)。这合理吗?
3) 性能仍然不是很好。精确率为0.34,召回率为0.72,F1分数为0.46。有没有改进的方法?我应该使用交叉验证吗?
非常感谢您的帮助!
回答:
1) 我的步骤是否有效?我先分割了训练集和测试集,然后对训练集的多数类进行了欠采样。
你应该分割train
和test
,以便在两者中保持类别平衡
。如果在你的整个数据集
中的比例是6.5:1
,那么在train
和test
中也应该是相同的。
是的,你应该在欠采样之前进行分割(不需要对test
进行欠采样),只需记住在训练过程中监控多个指标(例如已经提到的F1分数
、召回率
、精确率
,这些指标应该足够),因为你是在与test
不同的分布上进行训练。
2) 现在我的训练集(约200)小于测试集(450)。这合理吗?
是的,这是合理的。你也可以对训练数据集进行过采样
(例如,随机重复少数类
以匹配多数类
的样本数量)。在这种情况下,你也必须先进行分割,否则你可能会用训练
样本污染测试
集,这会更加灾难性。
3) 性能仍然不是很好。精确率为0.34,召回率为0.72,F1分数为0.46。有没有改进的方法?我应该使用交叉验证吗?
这取决于具体问题,我的建议如下:
- 使用
过采样
代替欠采样
– 神经网络需要大量数据,你目前的样本数量不多 - 尝试其他非深度学习算法(如果有很多特征,可以尝试
SVM
;否则RandomForest
也可能是一个不错的选择) - 否则,微调你的神经网络(特别关注
学习率
,如果有时间,可以使用交叉验证或相关方法) - 尝试使用一些预训练的神经网络,如果对于手头的任务有可用的