在对多数类进行欠采样后,训练集是否可以小于测试集?

我有一个包含1500条记录的数据集,分为两个类别,且类别不平衡。类别0有1300条记录,而类别1有200条记录,因此比例约为6.5:1。

我使用这个数据集构建了一个随机森林进行分类。根据过去的经验,如果使用整个数据集,召回率会很低,这可能是由于类别不平衡造成的。

因此,我决定对类别0进行欠采样。我的步骤如下:

  1. 随机将数据集按7:3的比例分割为训练集和测试集(因此训练集有1050条记录,测试集有450条记录)。

  2. 现在训练集中有大约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) 我的步骤是否有效?我先分割了训练集和测试集,然后对训练集的多数类进行了欠采样。

你应该分割traintest,以便在两者中保持类别平衡。如果在你的整个数据集中的比例是6.5:1,那么在traintest中也应该是相同的。

是的,你应该在欠采样之前进行分割(不需要对test进行欠采样),只需记住在训练过程中监控多个指标(例如已经提到的F1分数召回率精确率,这些指标应该足够),因为你是在与test不同的分布上进行训练。

2) 现在我的训练集(约200)小于测试集(450)。这合理吗?

是的,这是合理的。你也可以对训练数据集进行过采样(例如,随机重复少数类以匹配多数类的样本数量)。在这种情况下,你也必须先进行分割,否则你可能会用训练样本污染测试集,这会更加灾难性。

3) 性能仍然不是很好。精确率为0.34,召回率为0.72,F1分数为0.46。有没有改进的方法?我应该使用交叉验证吗?

这取决于具体问题,我的建议如下:

  • 使用过采样代替欠采样 – 神经网络需要大量数据,你目前的样本数量不多
  • 尝试其他非深度学习算法(如果有很多特征,可以尝试SVM;否则RandomForest也可能是一个不错的选择)
  • 否则,微调你的神经网络(特别关注学习率,如果有时间,可以使用交叉验证或相关方法)
  • 尝试使用一些预训练的神经网络,如果对于手头的任务有可用的

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注