我目前正在学习和应用机器学习,我从研究中发现,如果您将数据分成训练集和测试集,并且如果您的训练集小于测试集,那么您的模型会有不好的预测性能。另一方面,如果你在测试集中放置了太少的数据点并加强了你的训练集,那么你的泛化误差就会很差。没有完美的方法来分割你的训练集和测试集,但一般的经验法则是训练误差太大,无法很好地近似泛化误差,你希望将其余数据留在测试集中。这可以用 60% 训练和 40% 测试或 70% 训练和 30% 测试或 90% 训练数据和 10% 测试数据的拆分来表示。如果您有一个非常大的数据集,这就足够了。
现在,如果您有少量数据并且您没有能力避免我前面提到的两种情况,那么 k 折交叉验证可能是您问题的答案,但首先让我解释另一种方法拆分您的数据。早些时候,我向您展示了一种将数据拆分为训练集和测试集的方法。但我想向您介绍一种叫做验证集的东西。
回归(以及机器学习中的所有其他主题)中最重要的两个任务是选择特定的模型复杂度,因此如果您使用多项式回归,您会担心什么度您的工作,最后,对于您选择的模型,您需要评估其性能。现在,对于第一个任务,选择一个特定的模型,让 λ 代表一个调整参数,控制我们模型的复杂性。例如,如果我要使用多项式回归,λ 将指定我的多项式的次数。现在让我们想象一下我将数据集分成训练集和测试集的假设情况,并让我们执行我之前提到的两个任务。
------------------------------------------
| Training set | Test set |
------------------------------------------
-
模型选择:
- 对于您考虑的每个模型复杂性:λ
- i.估计你在训练集上的权重
- 二。使用您的测试集评估性能
- 三。选择测试误差最小的模型复杂度 λ
评估性能:当您找到最佳模型复杂度或一般模型(将其表示为 λ*)时,我们只需通过以下方式评估性能计算它的测试错误。
这是只有一个训练集和一个测试集的问题。这种只使用训练集和测试集的方法过于乐观。当我们考虑选择特定的模型复杂度时,我们使用我们的测试集/数据来比较不同的 λ 值,我们选择了最小化测试误差的 λ。但这意味着我们正在使用测试错误来估计我们将如何处理新数据。问题是我们的测试数据并不能代表我们可能在世界上看到的一切(即我们的模型可能遇到的所有可能的数据)。我们的模型是专门选择在测试数据上表现良好的。更好的解决方案是拥有两个“测试集”:训练集、验证集和测试集。
---------------------------------------------------------------
| Training set | Validation set | Test set |
---------------------------------------------------------------
现在的问题是我们如何选择模型并使用第二个测试集评估它的性能?我们可以这样做。
- 在我们的训练集/数据上拟合我们正在考虑的每个模型复杂度 (λ) 的模型。
- 我们将根据哪个模型最小化验证集上的误差来选择最佳模型/模型复杂度/λ。
- 最后,我们在测试集上评估最佳模型/模型复杂度/λ 的性能。现在测试集可以被认为是我们的泛化误差的近似值,因为它从未被使用过。
现在您可能想知道,既然我有两个测试集,我该如何拆分这组数据?以下是最典型的拆分:
- 80% 训练集,10% 验证集,10% 测试集
- 50% 训练集,25% 验证集,25% 测试集
如果您有足够的数据量,建议使用这些拆分。现在,如果您没有足够的数据将数据分成这 3 组。使用我们所有数据来评估模型性能的一种方法是使用 K-Fold 交叉验证,如果您的数据集较小,我建议您使用此方法。在撰写这篇文章时,我还没有使用过你所描述的那么大的数据集,但是尝试一下 K-Fold Validation 并将其与其他方法进行比较以查看最适合你的模型的方法并没有什么坏处.
我希望这会有所帮助。