建议和想法赞赏 - 机器学习单人项目

数据挖掘 机器学习 Python scikit-学习 数据集 交叉验证
2022-03-10 07:59:36

我有一个项目,我应该从头开始学习机器学习的工作原理。到目前为止,一切都比预期的要好,但我觉得我有很多方法可供选择。

我的项目:
我有 700 行和 108 列的数据作为我的特征,使用RandomForestClassifier.
到目前为止,我正在使用train_test_split拆分我的数据,但我正在阅读很多文章,其中建议将数据拆分为 3 个集合(训练、开发、测试)。
由于我没有那么多数据,我想使用交叉验证。

我的问题:
所以我实现了它,但无法真正找到CV带有 shuffle的train_test_split之间的区别。
在这样做之前,我以为我知道这些与模型选择策略之间的区别,但现在我有点困惑。

我的知识和问题:
1. train_test_split 存在集合不平衡的问题,所以如果我不走运,我只用正面或负面的例子训练我的模型。
--> 不能通过使用来解决stratify=True吗?
2. train_test_split 不会一直以相同的方式拆分集合,因此结果无法比较
--> 设置random_state=0解决了问题?
3. 我什么时候可以使用简历
4、如何理解下面这张图,它有什么好处: 训练测试和简历相结合?

  1. 什么是继续的好方法?

非常感谢您提前提供的所有帮助和时间!干杯!

2个回答
  1. train_test_split 的问题是集合可能不平衡,所以如果我不走运,我只用正面或负面的例子训练我的模型。--> 不能通过使用stratify=True 来解决吗?--> 是的,这就是 stratify=True 的用途。但是,您仍然只使用训练集的数据进行训练并使用测试集中的数据进行测试

  2. train_test_split 不会一直以相同的方式拆分集合,因此结果无法比较--> 设置 random_state=0 可以解决问题吗?--> 确实...请记住,只要您保持种子(即随机状态)相同,random_state= 就可以正常工作

对于 3. 和 4. 让我确保您了解 CV 和 TTS 之间的区别。TTS 将您的数据拆分一次,在现在“固定”的训练集上进行训练并在“固定”测试集上进行测试。但是,这会给您的评估带来一种偏见,因为您没有对所有观察结果进行训练或测试。通过获取简历,您可以确保所有观察结果都用于测试和培训。这减少了设置“固定”训练和测试集的偏差。

现在是 3.:如果有疑问,请使用 CV。但是……有时这没有意义。考虑时间序列数据以及 cv 将如何工作以及结果将是什么。话虽这么说……现在想想带有分层或随机的 TTS 将如何工作以及这些将意味着什么。CV 通常是一个不错的选择,但是您始终必须考虑评估方法是否适合您的问题。TTS 在时间序列以及使用大型数据集的性能方面有其优点。

和 4.:图片将 TTS 和 CV 可视化。首先,您有 CV,它拆分您的训练数据,以便将每个小数据集用作测试数据。然后使用“测试”集来衡量模型的泛化。这称为保持方法

显示“数据许可”的图表演示了 TTS 以及用于测量泛化的附加“测试”集。您在“Training”上进行训练,在“Validation”上验证模型,并且与 holdout 方法一样,您保留一个“测试”集来衡量您的模型对未知数据的泛化程度。

最后但并非最不重要的...5.:如果您通过使用 TTS 获得良好的结果和泛化...去吧。如果您遇到过拟合/欠拟合或泛化问题,请尝试使用 CV,看看它是否有帮助。当然,与数据科学和机器学习中的所有内容一样,您也可以在 TTS 和 CV 之上添加多个级别的复杂性。例如,您可以阅读有关 K-Fold 或 LOOCV 等的信息。但我认为这没有必要。

回答问题,

  1. 事实上,如果您在创建数据集分区时不小心,最终可能会出现不平衡的分区。在那种情况下,正如你所说,使用分层抽样可以缓解这个问题。另一种选择是在特征空间上执行数据增强(即 SMOTE [1])。

  2. 对于可比较的结果,您应该使用种子/随机状态。这取决于您的实现(例如,对于 numpy,通常使用 np.random.seed(0))。

  3. 这是一个重要的问题。测试集的目的是查看您的模型如何对看不见的数据进行泛化(因为模型通常对训练数据持乐观态度),以便您可以检测例如过度拟合问题。然而,验证集还有另一个目的:在调整超参数时,建议使用火车上不存在的另一个分区,也不测试数据集。考虑到这一点,除非您正在调整参数,否则有效分区等同于测试分区。

  4. 交叉验证策略用于模型选择/评估。在该方案中,您在整个数据集中创建 N 个分区(训练 + 测试),例如{Tj}j=1N. 你的模型将在 N - 1 个分区上进行训练,同时留下一个特定的分区,比如说Ti, 供测试用。您对每个重复此过程i=1,,N. 在评估结束时,您将获得N估计您的指标(即准确性),以便您可以估计它们的预期值,以及您对该值的信心。

  5. 我建议您采用分层抽样,为您的伪随机数生成器提供种子,并且不要使用验证数据,除非您正在为您的模型调整超参数。

参考

[1] Chawla, NV, Bowyer, KW, Hall, LO 和 Kegelmeyer, WP (2002)。SMOTE:合成少数过采样技术。人工智能研究杂志,16,321-357。