TicTacToe 线性回归低准确率和 R^2 分数

数据挖掘 机器学习 Python scikit-学习 线性回归 训练
2022-02-27 06:48:19

我使用 python sklearn 库尝试线性回归井字游戏 AI。

我通过简单地让计算机与自己玩随机的“盲目”游戏来创建我的训练集。例如...玩家一玩棋盘的随机部分。下一个玩家二玩棋盘的随机有效部分等。这一直持续到棋盘满或有人获胜。每次玩家一获胜,我都会存储导致获胜的棋盘状态。每次失败,我只是将那个棋盘状态(以及同一游戏的过去棋盘状态)标记为玩家一的失败。对于每场平局(全盘),我都不算什么。我玩了大约 20k 这些游戏。最后,我得到了我的训练数据集,其中包括棋盘状态(特征集)和结果,即在该状态下赢得的游戏的百分比(浮动品脱值。例如 0.8 是 80%)。

因此,例如从板的左上角到右下角: [1, 1, 1, 2, 0, 2, 0, 0, 0] 将是:

X X X
O - O
- - -

在玩 20k 次随机游戏等后会有“1”或 100%。

我试图预测玩家下一步行动的成功率。基本上任何基于棋盘状态的免费段的成功率。

然而; 在用我的训练数据训练 sklearn 线性回归后,我得到了非常低的 R^2 分数,仅为 0.14,并且任何测试都非常不准确。我开始认为我的数据存在缺陷?这就是数据科学家为井字游戏创建训练集的方式吗?

1个回答

线性回归不适用于此问题,因为您使用的棋盘特征和目标变量之间的关系不是线性的。

这就是数据科学家为井字游戏创建训练集的方式吗?

您的目标是什么并不是 100% 清楚的。为简单起见,我将您的目标选择为“根据当前的棋盘状态和双方未来完全随机的游戏,预测 X 最终获胜的概率。” 这似乎就是你正在做的事情。

顺便说一句,这不是训练神经网络以预测游戏中最佳动作的直接途径。对于这个简单的游戏,如果这是您的最终目标,它可能会起作用,但如果您想要机器学习来玩游戏,您可能应该研究强化学习,特别是强化学习的自我游戏,作为管理训练数据的框架.

回到您的问题,您正在做的事情对于创建数据集是可以接受的,尽管我想检查一下:

对于每场平局(全盘),我不把它算作任何东西

如果这意味着您仍在存储导致平局的状态,但使用不同的标签,那没关系。如果您丢弃有关关系的数据,那么这将扭曲数据集并可能影响您的预测 - 除非您在测试时也丢弃关系。

这也有点不寻常:

最后,我得到了我的训练数据集,其中包括棋盘状态(特征集)和结果,即在该状态下赢得的游戏的百分比(浮动品脱值。例如 0.8 是 80%)。

这是不寻常的,因为当特征相同时,您已将数据预处理到摘要行中。当与近似函数一起使用时,这会使数据集倾斜(线性回归 - 像大多数 ML 统计学习器一样 - 是一个近似函数),因为您会丢失这些特征出现的次数。执行此操作时,任何平衡预测函数以使其对常见状态更准确的做法都会丢失。将所有记录分开并让 ML 方法解决取平均值的最佳方法更为正常。如果您通过对新玩过的游戏进行随机抽样来测量已完成模型的准确性,那么它的准确性可能会因此而降低。

对于记录的数据收集,更常见的做法是将所有观察结果分开,而不是在训练分类器之前对其进行总结。然后分类器可以拟合允许每个观察频率的数据。

除了关于平局的警告(你可能是对的),过早地取平均值,加上你的数据集只能帮助预测完全随机游戏的结果的限制,然后数据集集合对我来说看起来不错。上述问题都不足以导致您注意到的问题。您的预测不适用于线性回归的原因主要是由于预测函数需要非线性。

一个简单的解决方法是使用非线性预测器,例如神经网络,或者可能是 xgboost 之类的决策树算法。

如果您使用神经网络,以下可能会有所帮助:

  • 在输出层使用 sigmoid 激活和二元交叉熵损失。当您的输出是概率时,这应该会有所帮助。

  • 使用值而不是来标记O所玩棋盘中的位置这不是严格要求的,但是当输入数据以零为中心且标准偏差接近 1 时,神经网络往往会学习得更快、更准确。12

值得注意的是,你的平均胜率表已经是一个相当合理的游戏预测模型。对于井字游戏,它应该工作得很好,因为状态数量有限。在 20k 场随机游戏之后,您将记录几乎所有可能的状态,并且一些将具有相当准确的平均值(例如,X的每次初始游戏将有大约 2000 个采样延续,这应该会给您在几个百分)。这种方法的缺点是它不能推广到新的看不见的状态,但实际上这在细节很重要的棋盘游戏中很难做到。