为什么我的模型没有学会玩这个游戏,只从一个部分填充的数组中生成一个从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]
这不是一个复杂的游戏(在人类意义上),但我想看看模型是否能够识别规则(用1到5替换0,这样最终数组只有(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)]都可以作为两个单独的训练实例存在
- 将训练数据集分离10倍,搅乱,并使用Scikit Learn的RandomForest分类器进行训练
- 一个正确的输出被定义为最终配置数组正好有一个来自(1,2,3,4,5)的元素。因此(2,4,4,5,1)无效
===
令人惊讶的是,使用1000个、10000个、50000个甚至100000个训练示例仍然导致该模型只对大约70%的测试用例进行了测试,这意味着该模型没有学会如何在训练示例不断增加的情况下玩游戏。
我在想的一件事是,RandomForestClassifier只是不用于这种类型的问题,称为结构化机器学习,其中输出不是单个类别或实值输出,而是输出的向量。
更多问题:
- 为什么模型没有学会这一点游戏
- 这是正确的建模方式吗这个问题
- 数据不够吗学习这项任务?但不断增加1000到100000之间的数据没有似乎一点帮助都没有
lejlot的答案很好,但我想我应该增加一点直觉,了解为什么随机森林在这种情况下失败。
你必须记住,机器学习并不是向计算机传授智能的神奇方式;这只是一种将特定模型与数据进行拟合并使用该模型进行概括的方法。正如一句古老的格言所说,"所有的模型都是错误的,但有些是有用的"。你遇到了一个例子,模型像往常一样是错误的,但也恰好是无用的!
-
输出空间:其核心的随机森林基本上是一种将输入映射到输出的聪明且可推广的方法。您的输出空间具有
5^5 = 3125
可能的唯一输出,其中只有5! = 120
是有效的(即每个数字中有一个的输出)。随机林知道输出是否有效的唯一方法是它是否看到了它:因此,为了正确工作,您的训练集必须包括所有这120个输出的示例 -
输入空间:当随机林遇到以前看到的输入时,它将直接将其映射到以前看到的输出。但是,如果它遇到一个它没有看到的输入呢?例如,如果您询问
[0, 2, 3, 4, 1]
的答案,而该答案不在训练集中,该怎么办?就欧几里得距离(一种思考事物如何分组的有用方法)而言,最接近的结果可能是[0, 2, 3, 4, 0]
,它可能映射到[1, 2, 3, 4, 5]
,这是错误的。因此,我们看到,为了使随机林正确工作,您的训练集必须具有所有可能的输入。一些快速组合数学表明,您的训练集的大小必须至少为5!*32 = 3840
,并且没有重复。 -
林本身:即使您有一个完整的输入空间,随机林也不是由输入到输出的简单字典映射组成的。根据模型的参数,映射通常是从附近结果的组到单个答案,因此,例如,
{[1, 2, 3, 4, 5], [1, 0, 3, 4, 5], [0, 1, 3, 4, 5]...}
将全部映射到[1, 2, 3, 4, 5]
。这种概括在大多数情况下是有用的,但对您的特定问题没有用处。在您的情况下,随机森林工作的唯一方法是将max_depth
和min_samples
参数推到它们的极值,这样森林本质上是输入到正确输出的一对一映射:换句话说,分类器只是构建字典的一种极其复杂的方式。
总之:机器学习只是一个应用于数据的模型,在某些情况下很有用。在您的情况下,该模型并没有那么有用:为了让随机森林解决您的问题,您需要过度拟合一组全面的输入和输出。在这一点上,你还不如构建一本字典,到此为止。
我确实认为这只是一个思维练习,而不是实际问题,因为在这种任务中,基于集合的解决方案显然比任何ML技术都要好
简而言之,因为分类器/回归器不适用于组合优化。您的问题有非常强的约束-只有极少数的值是"正确的"one_answers"可观察的",您要查找输出的属性,而不是值。这些不是分类或回归的设置。
你能做什么?
- 在这种受约束的场景中,你必须向你的方法提供关于正在发生的事情的知识。给它一个状态空间。这是简单状态空间AI的情况,而不是ML本身的情况,而是任何元优化的情况,如爬山、模拟退火、ga等
- 看看通用游戏之类的东西,这在某种程度上是相似的,但重要的区别是您提供了一套规则
- 看看神经图灵机之类的东西,这些是顺序方法,试图学习如何操作数据,而不是分类/回归
一般来说,当一个人试图学习机器学习时,这是一个非常常见的错误概念。并不是每个问题都适合"仅应用"已知的ML技术。大多数"存在"的问题都需要研究人员投入大量精力才能解释ML的强度。