介绍

我很期待“口袋妖怪猩红紫罗兰”!
这一次,你可以和你的朋友在开放世界中冒险,你可以在每个订单中捕获健身房的领导者,你的梦想就会扩大。我也喜欢红色和紫色的主题,因为它似乎是对原点的回归。我有一种错觉,认为有些东西与红外线和紫外线有关。
这就是为什么我一边玩剑盾一边期待它的发布。紫色的形成了统一的党。 Mugendaina、Cap Rehire、Drapion、Strinder、Onburn 和 Kojondo。
即使有这个爱好的成员,我也制定了一个策略,以便我尽可能地赢,但我无法赢,所以我将分析比赛的结果并将其升华为如何获胜的知识。

1.查找以前的研究

如果您已经有了口袋妖怪战斗的分析,那么使用类似的网站或分析工具将为您省去创建自己的麻烦。或者即使有一些现有服务无法完成的事情,也没有理由不参考它。

到目前为止,我一直在寻找对神奇宝贝战斗的分析,如果它有点老,它就在那里,但不是剑盾环境。也许瓶颈在于难以准备实用的水平匹配数据。 (如果我们可以开始提供一个 API,让我们能够获取任天堂帐户中积累的神奇宝贝战斗记录,那就太好了。)

参考文献列在最后。

2.准备比赛数据

2-1. 确定数据结构。

数字 列名 类型
1 比赛编号 整数
2 Mugen Dyna选择标志 整数
3 卡普重新雇用选举旗帜 整数
4 Drapion 选举标志 整数
5 斯特林格选举标志 整数
6 Onburn 选择标志 整数
7 联合选择标志 整数
8 我的 dymax 口袋妖怪 细绳
9 我的首选口袋妖怪 细绳
10 对手选择的禁令数量 整数
11 对手的 Dynamax 宝可梦 细绳
12 对手的首选宝可梦 细绳
13 对手等级 整数
14 季节 整数
15 胜利旗帜 整数
16 扎西安选举旗帜 整数

*1 对手的禁止选择数量是在对手的所有手牌公开之前你被击败时公开的数量。
*2 数据是通过自己记录口袋妖怪比赛并手动将其转换为 csv 文件而创建的。

2-2. 备注

样本数据量少,由于手工操作,存在有效性问题,但每次考虑都说“因为样本数据量少”很烦人,所以我们会相信数据是完成并继续。。

3.分析

3-1. 环境

python 3.8.5 (venv)

matplotlib==3.5.2
optuna==2.10.1
pandas==1.4.2
scikit-learn==1.1.1

3-2. 获取创建的宝可梦对战结果的数据。

获取数据时,排除缺失值。四个缺失值是由于记录错误造成的。

battle_results = pandas.read_csv(filepath_or_buffer='./battle_results.csv', encoding='utf_8', sep=',')

# 生データから欠損値のある行を削除する。
battle_results = battle_results.dropna()

3-3. 输出基本统计数据。

检查数据的数量、总数和平均值。

# データ数
battle_results_len = len(battle_results)
# 合計
battle_results_sum = battle_results.sum(numeric_only = True)
# 平均
battle_results_rate = battle_results_sum / battle_results_len
データ件数
50

sum(avg)
ムゲンダイナ選出      42 (0.84)
カプ・レヒレ選出      37 (0.74)
ドラピオン選出       22 (0.44)
ストリンダー選出      13 (0.26)
オンバーン選出       3  (0.06)
コジョンド選出       26 (0.52)
相手の禁伝の選出数     50 (1.00)
勝利数           20 (0.40)
相手のザシアン選出数    16 (0.32)

平均值可以直接换算成比例,所以 Pokemon 的选择似乎是迄今为止最高的,Mugen Dyna 为 84%,Rehire 为 74%。由于最好有尽可能多的 N 个数字,因此我们将从分析目标中切断除这两个以外的所有动物。或者更确切地说,onbahn的转弯太低了。 . .

似乎普通玩家在每场比赛中都会遇到一个被禁用的传奇人物,但令人惊讶的是,Zacian 被选中的几率为 32%。

我意识到我在这里犯了一个错误,但是让Zacian出现在对方的队伍中和出现在战斗中是两件不同的事情,所以我应该分开计算。即使Zacian的选择率是32%,如果80%在党内,斯特林德在类型上会有优势,所以我想知道他是否会控制住它。。

总胜率40%。在超级碗班上徘徊的胜率很低,但看起来你不是不能赢的。 (如果胜率低于 5%,即使你建立一个分析模型来预测比赛的结果,如果你称之为输,它的准确率也将达到 95%。)

现在我们知道了我们拥有的数据是什么,我们可以考虑使用哪一部分数据。这是因为排除可能是噪声的变量比全部采用更符合分析的目的。但在此之前,调整不能按原样使用的变量。

3-4. 将一些变量设为虚拟变量

数据具有以下分类变量:分类是指无法用数字表示的事物,例如性别和血型。

  1. 我的 Dynamax 神奇宝贝
  2. 我的首选口袋妖怪
  3. 对手的极强宝可梦
  4. 对手的首选宝可梦

    这些包含非定量值,例如口袋妖怪名称,因此它们不能按原样用于计算。 (这部分取决于分析方法)。
    所以我想把这个分类变量转换成带有 0 或 1 个标志的形式。
    转换后,如果是你自己的 Dynamax Pokemon,它会被分成“Kapu Rehire_Dynamax Flag”和“Cojond_Dynamax Flag”等多个变量,并将值存储为 1 和 0 标志。这称为虚拟变量。

    battle_results = pandas.get_dummies(battle_results)
    

    所有变量现在都可以作为数值使用。因此,让我们回过头来考虑使用哪些作为解释变量。

    3-5. 选择解释变量

    首先,排除在 3-3 流程中决定的与 Drapion、Strinder、Onburn 和 Cojond 相关的所有变量。选举标志、虚拟变量 dymax 标志和第一手选举标志。
    它还排除了只有 32 值的赛季,以及只有 6 和 7 的对手排名,这并没有太大区别。

    在其余变量中,我们将首先考虑 Mugendaina 和 Kapu Lehire。

    在深入挖掘了这两者的结果后,得到了以下结果。

    dymax 重新雇用的卡普人数 Dynamax 的胜率
    20 30%

    Kapu Rehire dymaxed 时的胜率低于其他人。在Mugen Dyna、Kapu Rehire、Daimax Flag、First Pick Flag的组合中,这也是唯一一个胜率在30%以下的组合。这可能已经找到了金矿脉。

    剩下的最后一件事是对手拉出的每个口袋妖怪的 Dynamax 标志、第一手选择标志、禁止选择的数量和 Zacian 选择标志。

    这些变量可以归类为与对手相关,但这里关注的是多重共线性问题。

    多重共线性,比如每种血型都有一个标志变量时,如果AB型标志为1,则另一个永远为0,如果任何其他为1,则为0,但取决于一、其他的价值是一定程度上确定的问题。如果这样做,分析结果会因解释变量之间的相关性而失真,因此需要小心。

    在这种情况下,似乎最好从与对方相关的变量中找到一个代表。如果是禁止选择的数量,似乎包括Zacian选择标志,对手的Dynamax Pokemon,以及对手的第一选择口袋妖怪。事实上,我没有选择对手的Dynamax神奇宝贝和首选神奇宝贝,因为我没有遇到足够多的人。

    这就是为什么我将专注于 Kapu Rehire 的 Dynamax 和禁止选择的数量进行分析。这两者没有特别需要标准化,照原样分析它们似乎很好。方法为逻辑回归分析。

    我选择了逻辑回归分析,因为它相对容易获得,最重要的是,易于实施。该方法从解释变量中预测数据属于哪个类别,在这种情况下,您可以创建一个模型,通过将目标变量设置为赢或输来进行区分。

    3-6. 逻辑回归分析

    从数据中获取训练和验证数据。

    # データの内80%を学習用、残り20%を検証用にする。
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state = 0, shuffle = True, test_size = 0.2)
    

    接下来创建模型。官方参考根据,似乎可以指定更多的参数,但如果在不知情的情况下增加它,只会造成失真,所以设置最小参数,其余保持默认。

    # ロジスティック回帰モデルを作成する。
    lr = LogisticRegression(C = 1.0, penalty = 'l2', solver = 'lbfgs')
    # 学習させる。
    lr.fit(X_train, Y_train)
    

    每个参数的含义大致如下。

    • C => 正则化强度。较低的值会增加强度。
    • penalty => 通过“L1 正则化”或“L2 正则化”。其目的是通过惩罚参数来对抗过度拟合。可以说过度拟合创建了一个仅对样本数据强的模型。 “l1正则化”具有将额外参数设置为0的属性,而这次我们预先丢弃了似乎无关紧要的解释变量,因此我们没有使用它。顺便说一句,在机器学习中,似乎基本经常采用l2。
    • solver => 设置机器学习算法行为的搜索算法。传递字符串而不是常量似乎是python。

    有了上述参数和数据,我们就可以创建一个口袋妖怪战斗模型。现在让我们进入解释变量的细节!

    3-7. 解释变量的输出系数

    模型的解释变量的系数存储在coef_中,所以我们输出一下。

    lr_coefficients = pandas.DataFrame(index = X.columns)
    lr_coefficients['coefficient'] = lr.coef_[0]
    print(lr_coefficients.sort_values('coefficient', ascending = False))
    
    系数
    对手选择的禁令数量 -0.328337
    Kapu Rehire 的 Dymaflag -0.362559

    两者都对球队的胜利产生了负面影响。对不起,重新雇用。 . .

    对方封禁宝可梦的数量,与一般宝可梦的统计数据不同,是有原因的。这是一个自然的结果,但是当您考虑它时,您可能能够制作出令人惊讶的合理模型。

    我们接下来考虑这个模型的准确度。

    3-8. 评估模型性能。

    有混淆矩阵、准确率、准确率、召回率、F1分数等各种指标,但UndefinedMetricWarning并没有停止,所以剪掉它,只得到ROC曲线。

    ROC曲线是显示模型分类性能的曲线,横轴为假阳性率,纵轴为真阳性率。 (如果样本数量很少,则不会是曲线)。

    每个点代表每个阈值的假阳性率和真阳性率如何出现,但关键是在图表上看不到阈值本身。
    例如,如果阈值为 1.0,则由于标准太高,所以原点被点了,并且所有内容都从正组中被拒绝。在相反的情况下,结果肯定是肯定的,所以在图形的右上角放置了一个点。

    下图是随机猜测的线和比较理想的线。

    【データ分析】なぜ私はポケモンバトルに勝てないのか

    在这条 ROC 曲线上看哪里是 AUC,它是线下的面积。最大值为1,越接近1表示性能越好,最差为0.5。 1 是绿色理想线,0.5 是橙色随机线。值 0.5 与随机预测相同。作为一个预测,如果小于0.5,就说经常出错的算命往往是正确的,最好把真实情况倒过来。

    创建模型的 auc 为 0.76,分类性能不高。我想瞄准更高一点,所以我将开始调整参数。

    3-9. 使用 optuna 调整参数

    我们将通过使用 optuna 反复执行逻辑回归分析试验来寻找更好的参数。这是一个图像,您可以通过几次点击来打击并继续使用力量。评价标准为准确率,测试运行时间为60秒。

    def logistic_regression_analysis_trial(trial):
        # ハイパーパラメータを設定する。
        params = {
            'C' : trial.suggest_loguniform('C', 0.0001, 10),
            'penalty' : 'l2',
            'solver' : trial.suggest_categorical('solver', ['lbfgs', 'liblinear'])
        }
    
        lr = LogisticRegression(**params)
    
        # 評価指標として正解率を指定する。
        scores = cross_validate(lr, n_jobs = -1, scoring = 'accuracy', X = X_train, y = Y_train)
    
        return scores['test_score'].mean()
    
    optuna.logging.set_verbosity(optuna.logging.WARN)
    study = optuna.create_study(direction = 'maximize')
    study.optimize(logistic_regression_analysis_trial, callbacks=[logging_callback], timeout = 60)
    

    另外,默认情况下,试验的记录是按顺序输出的,但由于无法跟上高速滚动,因此请对其进行自定义,以便仅在打破最高记录时才输出日志。它主要是官方参考资料的复制粘贴。

    def logging_callback(study, frozen_trial):
        previous_best_value = study.user_attrs.get('previous_best_value', None)
        if previous_best_value != study.best_value:
            study.set_user_attr('previous_best_value', study.best_value)
            print(
                "Trial {} finished with best value: {} and parameters: {}. ".format(
                    frozen_trial.number,
                    frozen_trial.value,
                    frozen_trial.params,
                )
            )
    
    

    结果如下。

    C = 0.00014182172596081152,
    penalty = 'l2',
    solver = 'lbfgs'
    

    3-10. 重建逻辑回归分析模型

    现在让我们使用调整后的参数重新进行分析。

    lr2 = LogisticRegression(
        C = 0.00014182172596081152,
        penalty = 'l2',
        solver = 'lbfgs'
    )
    
    lr2.fit(X_train, Y_train)
    
    lr2_Y_pred = lr2.predict(X_test)
    
    lr2_Y_pred_proba = lr2.predict_proba(X_test)
    
    lr2_fpr, lr2_tpr, lr2_thresholds = roc_curve(y_true = Y_test, y_score = lr2_Y_pred_proba[:, 1])
    
    matplotlib.pyplot.plot(lr2_fpr, lr2_tpr, label='lr2 roc curve (area = %0.3f)' % auc(lr2_fpr, lr2_tpr))
    

    【データ分析】なぜ私はポケモンバトルに勝てないのか

    结果,AUC超过了80%!比上次好。

    当我打印出系数时,我得到了类似的结果,尽管值较小。

    系数
    对手选择的禁令数量 -0.000301
    重新雇用大马旗 -0.000195

    3-11. K折交叉验证

    我们对无用的验证进行 5 折交叉验证。我们将研究是否可以通过改变收集训练数据和测试数据的方法来创建一个通用模型,以及它是否是一个仅适用于这个狭隘的样本数据世界的规律。将指标设置为准确率,并与旧模型进行验证以进行比较。

    lr_scores = cross_val_score(lr, X_train, Y_train, cv = 5, scoring = 'accuracy')
    print(lr_scores)
    # [0.375 0.625 0.625 0.625 0.625]
    lr2_scores = cross_val_score(lr2, X_train, Y_train, cv = 5, scoring = 'accuracy')
    print(lr2_scores)
    # [0.625 0.625 0.625 0.625 0.625]
    

    所有的结果都是0.625,至少根据测试数据的获取方式,看起来没有太大的偏差。同样,改进后的模型比原始模型表现更好,但 0.625 的数字本身有点牵强。你可以为所欲为,但原始数据仍然不完整,所以我们就到此为止吧。

    * 这次搜索使用了cross_val_score,资料很多,但是下面的API比较新。

    cross_validate(lr2, X_train, Y_train, cv = 5, scoring = ['accuracy', 'f1'])
    

    4.总结

    这一次的目的是识别口袋妖怪战斗结果的特点,并将其升华为改进计划。而我得到的不是通往胜利的道路,而是失败是如何形成的因素。

    令人遗憾的是,“卡普瑞尔的 Dynamax”作为负面因素出来了,没有理由去想它。 dymax fins 的原因是dymax 的花纹很多,虽然有很强的挫败感也不能放弃,感觉很多时候想用hard find 来克服暂且。

    我对这么强大的雷希尔做了不光彩的事情,所以下次我想研究一下雷希尔,以避免党的连败,同时制定一个连胜,但从九月开始的赛季将是幻影口袋妖怪。可能会很困难,因为随着禁令的解除,它将成为一个无法无天的地区。

    那时,我正在考虑等待Scarlet Violet的发布并从那里重新开始。如果我买天白,我肯定会玩很多,所以我想收集更多的样本数据。

    就这样。谢谢你读到这里。

    如果你不介意,请告诉我你的想法。

    5.参考页面


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623375.html

相关文章:

  • 2019-06-23
  • 2021-05-19
  • 2021-09-03
  • 2021-10-12
  • 2021-12-18
  • 2021-10-30
猜你喜欢
  • 2021-07-31
  • 2021-03-29
  • 2021-07-08
  • 2022-01-15
  • 2021-07-18
  • 2021-05-06
  • 2021-10-11
相关资源
相似解决方案