为什么模型无法学习这个填充整数的游戏
Why does the model fail to learn this game of filling up integers
我的问题:为什么我的模型无法学会玩这个只从部分填充的数组中生成 1 到 5 的唯一元素数组的游戏?
===
我正在尝试训练模型来执行此任务:
给定一个包含 5 个元素的固定数组,其中每个元素最多包含一个来自 (1, 2, 3, 4, 5) 和一个或多个 (0) 的元素,将 0 替换为适当的值,以便最终数组恰好有一个 (1, 2, 3, 4, 5).
所以,它应该是这样玩的:
- [1, 2, 3, 4, 0] => [1, 2, 3, 4, 5]
- [4, 3, 0, 5, 1] => [4, 3, 2, 5, 1]
- [0, 3, 5, 4, 0] => [2, 3, 5, 4, 1] 或 [1, 3, 5, 4, 2]
- ...
这不是一个复杂的游戏(在人类意义上),但我想看看一个模型是否可以识别规则(将 0 替换为 1 到 5,以便最终数组只有一个元素来自(1, 2, 3, 4, 5)).
我这样做的方法是:
- 生成N个以[1, 2, 3, 4, 5]元素为答案的组合配置样例,随机替换部分元素为0
- 例如,一个训练样本是[(0, 3, 5, 4, 0), (2, 3, 5, 4, 1)]。
- 可以有多个相同的输入映射到不同的输出,即 [(0, 3, 5, 4, 0), (2, 3, 5, 4, 1)] 和 [(0, 3, 5 , 4, 0), (1, 3, 5, 4, 2)] 可以作为两个单独的训练实例存在。
- 使用 Scikit-Learn 中的 RandomForestClassifier 将训练数据集分离 10 倍、打乱并进行训练。
- 正确的输出定义为最终配置数组恰好有一个来自 (1, 2, 3, 4, 5) 的元素。所以 (2, 4, 4, 5, 1) 无效。
===
令人惊讶的是,使用 1000、10000、50000 甚至 100000 个训练示例仍然会导致模型仅正确处理约 70% 的测试用例 - 这意味着模型没有学习如何通过增加训练示例来玩游戏.
我在想的一件事是,RandomForestClassifier 不用于此类问题,称为结构化机器学习,其中输出不是单个类别或实值输出,而是输出向量。
更多问题:
- 为什么模型无法学习这个
游戏?
- 这是正确的建模方式吗
这个问题?
- 是不是数据不够
学习这个任务?但增加
从 1000 到 100000 的数据不
似乎完全有帮助。
谢谢!
我确实假设这只是一个思维练习,而不是实际问题,因为显然 - 在此类任务中,基于集合的解决方案比任何 ML 技术都要好。
简而言之 - 因为 classifiers/regressors 不是 组合优化。您的问题具有极强的约束 - 只有极少数值是 "correct" 和 "observable",您寻找输出的 属性,并且不是 值 。这些 不是 用于分类或回归的设置。
你能做什么?
- 在这种受限的情况下,您必须向您的方法提供有关正在发生的事情的知识。显示状态 space。这是简单状态-space AI 的情况,而不是 ML 本身 - 而是任何元优化,如爬山、模拟退火、遗传算法等
- 看看 一般游戏玩法,这在某种程度上是相似的,但重要的区别在于您提供了一套规则。
- 看看 神经图灵机 之类的东西,这些是试图学习如何 操纵数据 而不是 [=51] 的顺序方法=]
总的来说,这是一个在尝试学习机器学习时非常常见的误解。并非每个问题都适合 "just applying" 已知的 ML 技术。大多数问题 "out there" 需要研究人员的大量投入才能发挥 ML 的优势。
非常好,但我想我会添加一些关于 为什么 随机森林在这种情况下失败的直觉。
您必须记住,机器学习并不是将智能传授给计算机的神奇方法;它只是一种将特定模型拟合到您的数据并使用该模型进行概括的方法。俗话说,"all models are wrong, but some are useful"。你碰上了一个模型像往常一样错误的情况,但也恰好没有用!
输出space:随机森林的核心基本上是一种将输入映射到输出的巧妙且可推广的方法。您的输出 space 有 5^5 = 3125
个可能的唯一输出,其中只有 5! = 120
个有效(即输出每个数字之一)。随机森林知道输出是否有效的唯一方法是它是否已经看到它:因此为了正常工作,你的训练集必须包含所有这 120 个输出的示例。
输入space:当随机森林遇到它以前见过的输入时,它会将其直接映射到它认为的输出以前见过。但是,如果它遇到一个它没有看到的输入怎么办?例如,如果您要求 [0, 2, 3, 4, 1]
的答案而这不在训练集中怎么办?就欧氏距离(一种思考事物分组方式的有用方法)而言,最接近的结果可能类似于 [0, 2, 3, 4, 0]
,它可能映射到 [1, 2, 3, 4, 5]
,这是错误的。因此我们看到,为了让随机森林正常工作,你的训练集必须有所有可能的输入。一些快速组合表明您的训练集的大小必须至少 5!*32 = 3840
,没有重复项。
森林本身:即使你有一个完整的输入space,随机森林也不包含输入的简单字典映射输出。根据模型的参数,映射通常是从一组 附近的结果 到单个答案,因此,例如,{[1, 2, 3, 4, 5], [1, 0, 3, 4, 5], [0, 1, 3, 4, 5]...}
将全部映射到 [1, 2, 3, 4, 5]
.这种概括在大多数情况下很有用,但对您的特定问题没有用。随机森林在你的情况下工作的唯一方法是将 max_depth
和 min_samples
参数推到它们的极值,这样森林本质上是输入的一对一映射它们的正确输出:换句话说,您的分类器只是构建字典的一种极其复杂的方式。
总结一下:机器学习只是一种应用于数据的模型,在某些情况下很有用。在您的情况下,该模型并不是那么有用:为了让随机森林解决您的问题,您需要过度拟合一组全面的输入和输出。到那时,你还不如构造一个字典然后收工。
我的问题:为什么我的模型无法学会玩这个只从部分填充的数组中生成 1 到 5 的唯一元素数组的游戏?
===
我正在尝试训练模型来执行此任务:
给定一个包含 5 个元素的固定数组,其中每个元素最多包含一个来自 (1, 2, 3, 4, 5) 和一个或多个 (0) 的元素,将 0 替换为适当的值,以便最终数组恰好有一个 (1, 2, 3, 4, 5).
所以,它应该是这样玩的:
- [1, 2, 3, 4, 0] => [1, 2, 3, 4, 5]
- [4, 3, 0, 5, 1] => [4, 3, 2, 5, 1]
- [0, 3, 5, 4, 0] => [2, 3, 5, 4, 1] 或 [1, 3, 5, 4, 2]
- ...
这不是一个复杂的游戏(在人类意义上),但我想看看一个模型是否可以识别规则(将 0 替换为 1 到 5,以便最终数组只有一个元素来自(1, 2, 3, 4, 5)).
我这样做的方法是:
- 生成N个以[1, 2, 3, 4, 5]元素为答案的组合配置样例,随机替换部分元素为0
- 例如,一个训练样本是[(0, 3, 5, 4, 0), (2, 3, 5, 4, 1)]。
- 可以有多个相同的输入映射到不同的输出,即 [(0, 3, 5, 4, 0), (2, 3, 5, 4, 1)] 和 [(0, 3, 5 , 4, 0), (1, 3, 5, 4, 2)] 可以作为两个单独的训练实例存在。
- 使用 Scikit-Learn 中的 RandomForestClassifier 将训练数据集分离 10 倍、打乱并进行训练。
- 正确的输出定义为最终配置数组恰好有一个来自 (1, 2, 3, 4, 5) 的元素。所以 (2, 4, 4, 5, 1) 无效。
===
令人惊讶的是,使用 1000、10000、50000 甚至 100000 个训练示例仍然会导致模型仅正确处理约 70% 的测试用例 - 这意味着模型没有学习如何通过增加训练示例来玩游戏.
我在想的一件事是,RandomForestClassifier 不用于此类问题,称为结构化机器学习,其中输出不是单个类别或实值输出,而是输出向量。
更多问题:
- 为什么模型无法学习这个 游戏?
- 这是正确的建模方式吗 这个问题?
- 是不是数据不够 学习这个任务?但增加 从 1000 到 100000 的数据不 似乎完全有帮助。
谢谢!
我确实假设这只是一个思维练习,而不是实际问题,因为显然 - 在此类任务中,基于集合的解决方案比任何 ML 技术都要好。
简而言之 - 因为 classifiers/regressors 不是 组合优化。您的问题具有极强的约束 - 只有极少数值是 "correct" 和 "observable",您寻找输出的 属性,并且不是 值 。这些 不是 用于分类或回归的设置。
你能做什么?
- 在这种受限的情况下,您必须向您的方法提供有关正在发生的事情的知识。显示状态 space。这是简单状态-space AI 的情况,而不是 ML 本身 - 而是任何元优化,如爬山、模拟退火、遗传算法等
- 看看 一般游戏玩法,这在某种程度上是相似的,但重要的区别在于您提供了一套规则。
- 看看 神经图灵机 之类的东西,这些是试图学习如何 操纵数据 而不是 [=51] 的顺序方法=]
总的来说,这是一个在尝试学习机器学习时非常常见的误解。并非每个问题都适合 "just applying" 已知的 ML 技术。大多数问题 "out there" 需要研究人员的大量投入才能发挥 ML 的优势。
您必须记住,机器学习并不是将智能传授给计算机的神奇方法;它只是一种将特定模型拟合到您的数据并使用该模型进行概括的方法。俗话说,"all models are wrong, but some are useful"。你碰上了一个模型像往常一样错误的情况,但也恰好没有用!
输出space:随机森林的核心基本上是一种将输入映射到输出的巧妙且可推广的方法。您的输出 space 有
5^5 = 3125
个可能的唯一输出,其中只有5! = 120
个有效(即输出每个数字之一)。随机森林知道输出是否有效的唯一方法是它是否已经看到它:因此为了正常工作,你的训练集必须包含所有这 120 个输出的示例。输入space:当随机森林遇到它以前见过的输入时,它会将其直接映射到它认为的输出以前见过。但是,如果它遇到一个它没有看到的输入怎么办?例如,如果您要求
[0, 2, 3, 4, 1]
的答案而这不在训练集中怎么办?就欧氏距离(一种思考事物分组方式的有用方法)而言,最接近的结果可能类似于[0, 2, 3, 4, 0]
,它可能映射到[1, 2, 3, 4, 5]
,这是错误的。因此我们看到,为了让随机森林正常工作,你的训练集必须有所有可能的输入。一些快速组合表明您的训练集的大小必须至少5!*32 = 3840
,没有重复项。森林本身:即使你有一个完整的输入space,随机森林也不包含输入的简单字典映射输出。根据模型的参数,映射通常是从一组 附近的结果 到单个答案,因此,例如,
{[1, 2, 3, 4, 5], [1, 0, 3, 4, 5], [0, 1, 3, 4, 5]...}
将全部映射到[1, 2, 3, 4, 5]
.这种概括在大多数情况下很有用,但对您的特定问题没有用。随机森林在你的情况下工作的唯一方法是将max_depth
和min_samples
参数推到它们的极值,这样森林本质上是输入的一对一映射它们的正确输出:换句话说,您的分类器只是构建字典的一种极其复杂的方式。
总结一下:机器学习只是一种应用于数据的模型,在某些情况下很有用。在您的情况下,该模型并不是那么有用:为了让随机森林解决您的问题,您需要过度拟合一组全面的输入和输出。到那时,你还不如构造一个字典然后收工。