手把手教你训练一个神经网络,打爆21点!(附代码&链接)_ROR体育

产品时间:2022-04-28 00:57

简要描述:

泉源:大数据文摘本文约4800字,建议阅读10分钟。本文先容了代码模拟玩21点,在用朴素计谋试验后转向了深度学习。21点又名黑杰克(Blackjack),起源于法国,已流传到世界各地,有着悠久的历史。随着互联网的生长, 二十一点开始走向网络时代,现在世界各地的赌场都可以看到二十一点。 该游戏由2到6小我私家玩,使用除巨细王之外的52张牌,游戏者的目的是使手中牌的点数之和不凌驾21点且只管大。...

推荐产品
详细介绍
本文摘要:泉源:大数据文摘本文约4800字,建议阅读10分钟。本文先容了代码模拟玩21点,在用朴素计谋试验后转向了深度学习。21点又名黑杰克(Blackjack),起源于法国,已流传到世界各地,有着悠久的历史。随着互联网的生长, 二十一点开始走向网络时代,现在世界各地的赌场都可以看到二十一点。 该游戏由2到6小我私家玩,使用除巨细王之外的52张牌,游戏者的目的是使手中牌的点数之和不凌驾21点且只管大。

ROR体育官网

泉源:大数据文摘本文约4800字,建议阅读10分钟。本文先容了代码模拟玩21点,在用朴素计谋试验后转向了深度学习。21点又名黑杰克(Blackjack),起源于法国,已流传到世界各地,有着悠久的历史。随着互联网的生长, 二十一点开始走向网络时代,现在世界各地的赌场都可以看到二十一点。

该游戏由2到6小我私家玩,使用除巨细王之外的52张牌,游戏者的目的是使手中牌的点数之和不凌驾21点且只管大。Medium上一位法式员小哥就实验用代码模拟玩21点,在用朴素计谋试验后,小哥又将眼光转向了深度学习,一起来看看吧。上次我们开发了代码来模拟玩21点游戏,并发现了在这类赌局中获胜的关键因素。

让我们先来快速回首一下:1、赌场的优势在于可以要求21点的玩家(凭据不完整的信息)先于庄家拿牌,这使得玩家面临爆牌(bust,玩家的牌总点数凌驾21)的风险,有些玩家们甚至可能在庄家还未拿牌前就已经自爆了。2、当玩家的手中牌总点数在12到16之间,而且比庄家点数小时尤为危险(玩家有可能在拿到下一张牌时自爆)。在这种情况下,如果庄家最终的总点数为大,则玩家要么继续拿牌要么放弃拿牌(停牌)。从下图可以清晰看到,总点数在12到16这一区间时玩家赢的几率最低(我们称之为“绝望之谷”)。

赢得赌局或打平的几率随玩家手牌总点数的变化(总点数为21时是必赢,概率为1)3、最后,我们发现“仅在完全不会自爆时才要牌”的朴素计谋就可极大地提高击败赌场的几率,因为这种计谋将自爆的风险完全转移给了赌场。如果你不熟悉21点游戏,那可以看我的上一篇文章,内里先容了怎么玩以及相应的游戏规则。

文章链接:https://towardsdatascience.com/lets-play-blackjack-with-python-913ec66c732f t _blank深度学习能做得更好吗?这篇文章的主旨在于弄清楚是否可以通过深度学习找到比上面提到的朴素计谋更好的计谋。我们将:用我们上次开发的21点模拟器生成数据(举行少量修正使其更适适用作训练算法)编码并训练神经网络玩21点(最优情况下)图解简朴神经网络在进入训练历程前,让我们先来快速讨论一下使用神经网络的利弊。神经网络是一种高度灵活的算法——就像软粘土一样,神经网络可以自我调整或举行少量转换就能适用于差别的数据集。通过神经网络可以轻松处置惩罚像线性回归这样比力刻板的问题。

此外,网络层和神经元还能学习深藏于数据中的非线性关系。可是,神经网络的这种多功效性需要一定的价格,因为它是一个黑匣子。与回归差别,在回归中我们可以通过检察回归系数来相识模型如何做出决议,而神经网络则缺乏这种透明度。同时,神经网络也存在过拟合的风险,就是对数据过分拟合以至于无法对样本数据举行很好的泛化。

这些缺点虽不足以使我们放弃使用神经网络,但却值得我们牢记并设计防范措施。生成训练数据在训练神经网络前,我们首先需要弄清楚如何结构训练数据,这样训练出的模型才有意义。我们想要预测什么?在我看来,我们的目的变量有两个候选参数:输掉赌局的概率。在这种情况下,我们可能希望模型告诉我们失败的可能性是几多。

再说一次,这只有在我们可以增加或淘汰赌注的情况下才有用,而这在21点中不适用。实际上,我们更希望我们的神经网络能够给出正确的行为,拿牌还是停牌。

因此,我们的目的变量应为“究竟是拿牌还是停牌”。我花了一段时间才找出分析目的变量的最佳方法。下文论述了我找到的方法。

我们需要一种让神经网络知道给定行为是否正确的方法。这种方法不需要确保万无一失,只需要大要正确即可。因此,我判断给定行为是否正确的方法是模拟一场21点游戏:将牌分发给玩家和庄家,检查是否有人拿到了21点,决议一个拿牌的行为(拿牌或停牌),如此模拟游戏直到竣事并记载效果。由于模拟玩家每次只做出一个决议,因此我们可以通过他的输赢来评估该决议的质量:如果玩家要牌并获胜,那拿牌(Y=1)是正确的决议。

如果玩家要牌但输了赌局,那停牌(Y=0)是正确的决议。如果玩家不要牌并获胜,那停牌(Y=0)是正确的决议。如果玩家不要牌但输了赌局,那拿牌(Y=1)是正确的决议。

ROR体育官网

我们基于此规则训练模型,其输出是对于拿牌还是停牌的预测。这次的代码与上次相似,因此在这里我不做详细先容。GitHub链接:https://github.com/yiuhyuk/blackjack代码的主要功效:庄家的明牌(另一张暗牌,牌面朝下)玩家手里牌点数总和玩家手里有没有A玩家的决议(拿牌还是停牌)目的变量为由上述逻辑界说的正确决议。

训练神经网络我们的神经网络将使用Keras(开源神经网络库)。先看模块导入:from keras.models import Sequentialfrom keras.layers import Dense, LSTM, Flatten, Dropout再为训练神经网络构建输入变量。

变量feature_list是包罗上面提到的特征(X变量)名的一组列表。数据集model_df储存了所有21点模拟器发生的数据。# Set up variables for neural netfeature_list = [i for i in model_df.columns if i not in ['dealer_card','Y','lose','correct_action'] ]train_X = np.array(model_df[feature_list])train_Y = np.array(model_df['correct_action']).reshape(-1,1)用于实例化和训练神经网络的代码其实很是简朴。

第一行建立了一个序贯型神经网络,即多个网络层的线性堆叠。后面的代码对我们的模型逐层添加网络层(这里的Dense界说了最简朴的网络层,即一大堆神经元),这里的数值16,128是指神经元的个数。

对于最后一层,我们需要选择一个激活函数。这个函数把神经网络的原始输出转酿成某些能被我们明白的工具。最后一层有两点值得注意:第一,它只包罗一个神经元,因为我们是在两个可能的效果间举行预测(二分类问题);第二,使用sigmoid激活函数,因为我们希望我们的神经网络像逻辑回归一样,在拿牌(Y=1)还是停牌(Y=0)之间举行预测 —— 或者说,我们希望知道正确行为是拿牌的概率。

最后两行代码告诉我们的神经网络用什么样的损失函数(二元交织熵是一种用于概率输出分类模型的损失函数),并调整模型来拟合我们的数据。我没有花太多时间来调整网络层数或神经元个数,但如果你想要实验我的代码,我以为这可以作为模型革新的偏向。# Set up a neural net with 5 layersmodel = Sequential() # line 1model.add(Dense(16))model.add(Dense(128))model.add(Dense(32))model.add(Dense(8))model.add(Dense(1, activation='sigmoid')) # final layermodel.compile(loss='binary_crossentropy', optimizer='sgd')model.fit(train_X, train_Y, epochs=20, batch_size=256, verbose=1)检查模型的体现一种快速确定我们的模型是否有价值的方法是使用ROC曲线。

请检察链接:https://towardsdatascience.com/roc-curves-and-the-efficient-frontier-7bfa1daf1d9c)ROC曲线可以告诉我们,模型在权衡利益(真阳率True Positive Rate)和价格(假阳率False Positive Rate)时体现如何 —— 曲线下的面积越大,模型体现越好。下图是我们的21点神经网络的ROC曲线 —— 这看上去似乎比随机推测(红色虚线)要好不少。

曲线下的面积,即AUC,到达0.73是显着高于随机推测的AUC(0.5)。21点神经网络的ROC曲线我是用训练数据来画ROC曲线的。通常,我们希望用验证或测试数据去画,但在这个例子里,我们知道只要我们的样本数量足够大,它对于整体就是有代表意义的(假设21点的游戏规则稳定)。而且我们还可以期望我们的模型有很好的泛化能力(任何新数据都有和我们训练数据一样的基本统计特性)。

是时候大显身手了!在我们的神经网络正式开始21点之前,我们需要给它一个决议规则。请记着,神经网络最后一层中的sigmoid 激活函数会将输出酿成“正确的行为是拿牌”的概率。

因此我们需要一个决议规则,在给定这个概率的情况下,我们决议是否拿牌。下面的函数用来确定这个决议规则,model_decision 函数的通过输入神经网络所需要的特征集来做出预测,并将作出的预测与预先给定的阈值举行比力,来决议是否拿牌。在这里我将阈值定为0.52,因为从上次的实验中我们可以发现爆牌是21点玩家面临的最大风险。

因而将0.52作为拿牌的阈值会使我们的模型选择拿牌的可能性小一些,于是爆牌的可能性也相应减小。def model_decision(model, player_sum, has_ace, dealer_card_num): input_array = np.array([player_sum, 0, has_ace, dealer_card_num]).reshape(1,-1) predict_correct = model.predict(input_array) if predict_correct >= 0.52: return 1 else: return 0def model_decision(model, player_sum, has_ace, dealer_card_num): input_array = np.array([player_sum, 0, has_ace, dealer_card_num]).reshape(1,-1) predict_correct = model.predict(input_array) if predict_correct >= 0.52: return 1 else: return 0现在我们需要将上面的函数加入代码中是否决议拿牌的部门。所以当我们需要决议是否拿牌时,神经网络会基于庄家的明牌、玩家手中牌的总点数以及玩家是否有A这三个特征来做出决议。

我们的模型体现不俗!最后,让我们将神经网络模型的体现与朴素计谋模型和随机模型举行比力。有几点值得注意:我对每种计谋类型(神经网络、朴素、随机)都举行了约 300,000 次21点游戏模拟。

朴素计谋仅仅在爆牌的概率为零时举行拿牌(在玩家手中牌的总点数小于12时拿牌,总点数大于即是12时停牌)。随机计谋是指抛硬币的效果是正面朝上时选择拿牌,否则不拿。如果选择拿牌后没有爆牌,则继续抛硬币并重复该历程。

让我们看看神经网络是否找到了更优的计谋。下表展示了种种计谋类型的效果漫衍。从中我有两个发现:首先,我们的神经网络仅输掉了不到一半的游戏(49%)。

虽然很难说我们会最终获胜,但对于一场赔率牢固的游戏来说,这是相当不错的效果了;其次,神经网络实际上并不比会比朴素计谋带来更多的胜局,而是能够更频繁地将对手逼成平局。种种计谋类型的效果我们还可以视察差别计谋在一些重要的特征(庄家的明牌和玩家手中牌的总点数)中的体现。首先,让我们看一下庄家的明牌对我们三种计谋获胜或平局的概率影响。在下图中,如果庄家的明牌点数较小,神经网络的体现和朴素计谋相差不大。

可是,当庄家的明牌点数较大(大于即是7)时,神经网络的体现显着更好。获胜或平局的概率随庄家明牌点数的变化(柱形越长概率越大!)我们还可以看看获胜或平局的概率如何随玩家初始手牌的总点数而变化。效果看起来很是棒,无论玩家初始手牌的总点数是几多,和另外两种计谋相比,我们的神经网络都能体现一样好甚至更好。

反观朴素计谋, 它在绝望之谷(玩家初始手牌的总点数介于12到16之间)的体现甚至不如随机计谋。毫无疑问,神经网络具有更佳的体现。获胜或平局的概率随玩家初始手牌总点数的变化(柱形越长概率越大!)接下来的图说明晰神经网络是如何胜过朴素计谋的。

凭据我们的代码,哪怕玩家存在极小的爆牌风险,朴素计谋都不愿意冒险选择拿牌。另一方面,在玩家初始手牌的总点数为12、13、14或15时,神经网络更倾向于选择拿牌。

这种细微变化的决议和盘算风险的能力似乎是神经网络优于朴素计谋的原因。神经网络与朴素计谋选择拿牌的趋势随玩家初始手牌总点数的变化我们可以看看当玩家手牌总点数在12到16之间,时神经网络做了什么来实验改善我们的朴素计谋(只管少输钱给赌场)。当庄家的明牌点数较大(8、9或10)时,神经网络很是倾向于拿牌。

ROR体育

但纵然庄家的明牌点数较小(例如3),神经网络在60%的情况下仍然选择拿牌,这是因为神经网络在做出决议时会思量其可使用的所有特征。因此,我们无法轻易将其决议提炼为一些简朴的履历规则。神经网络选择拿牌的频率随庄家明牌的变化结论希望这篇文章对于使用机械学习协助实现生活中的决议给出了合适的解释。训练自己的模型时,请牢记以下几点(无论是决议树、回送还是神经网络):是否通过预测目的变量,就能解决眼前的问题? 在开始收集数据和建设模型之前,至关重要的是要确保你选择了正确的预测目的。

实际数据与训练数据会有什么差别?如果两者差异很大,那么网络模型可能不是解决问题的正确谜底。至少我们必须意识到这一点,并接纳措施,例如模型的正则化和严格(并老实)的验证以及测试集基准的选择。不明确决议如何形成,就无法明白和使用模型训练历程中未包罗的测试数据来理智地检查模型的决议。

最后我想就21点这个游戏说几句。我可能接下来一段时间不会再讨论有关赌钱的话题了(我想探索的话题太多了)。

但如果有人有兴趣继续探讨这个话题(无论是否使用我的代码),可以思量举行一些有趣的扩展:可以实验通过更优化的神经网络结构来改善模型,或者添加用于拆分牌A的代码(我没有将其构建到原始模拟器中),或者选择比我使用的基本特征集更优的特征集。为模型添加盘算总点数的能力,并视察总点数在一副牌和六副牌(拉斯维加斯尺度)时是怎样影响模型体现的。

链接:https://towardsdatascience.com/teaching-a-neural-net-to-play-blackjack-8ec5f39809e2编辑:于腾凯校对:王欣— 完 —关注清华-青岛数据科学研究院官方微信民众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。


本文关键词:手把手,ROR体育,教你,训练,一个,神经网络,打爆,21点

本文来源:ROR体育-www.dibang19.com

产品咨询

留言框

  • 产品:

  • 您的单位:

  • 您的姓名:

  • 联系电话:

  • 详细地址:

  • 留言内容:

在线客服 联系方式 二维码

电话

0410-197115144

扫一扫,关注我们