我在 CARET 包中使用随机森林以 1/10 的比率标记二进制结果,因此我需要平衡数据集。
我知道两种方法:
使用 SMOTE 作为独立函数,然后将其传递给训练。
sampling='smote'在 CARET 的培训中使用
据我了解,第一种方法应该更好,因为它使用整个数据集来合成新样本(我知道它默认只使用 5 个最近的邻居,但仍有更多数据点可供选择),而第二种方法仅使用 CV 的每个分区中可用的数据点。
但是,在 CV 内部进行平衡有什么好处吗?
我在 CARET 包中使用随机森林以 1/10 的比率标记二进制结果,因此我需要平衡数据集。
我知道两种方法:
使用 SMOTE 作为独立函数,然后将其传递给训练。
sampling='smote'在 CARET 的培训中使用
据我了解,第一种方法应该更好,因为它使用整个数据集来合成新样本(我知道它默认只使用 5 个最近的邻居,但仍有更多数据点可供选择),而第二种方法仅使用 CV 的每个分区中可用的数据点。
但是,在 CV 内部进行平衡有什么好处吗?
第二种方法应该是首选的,因为你给出的理由来证明第一种是正确的。第一种方法使用整个数据集来合成新样本。交叉验证是从训练中排除点,以准确评估新数据的错误率。如果您首先使用 SMOTE,来自排除点的信息将泄漏到训练数据中,并会污染 XV 测试。
不应使用方法 1,因为它会在交叉验证的每一折中将信息从测试分区泄漏到训练集中。这是因为合成示例可能位于真实训练模式和真实测试模式之间或两个真实测试模式之间。考虑一个由随机机会生成的合成示例,该示例非常接近最终在训练集中的真实测试模式。
看待它的方式是,交叉验证是一种评估拟合模型的过程性能的方法,而不是模型本身。因此,整个过程必须在交叉验证的每个折叠中独立、完整地实施。因此,如果 SMOTE 是模型拟合过程的一部分,则需要在每个折叠中单独完成。