一 前言

此项目为冬奥会智能剖析与猜测可视化渠道,这个项目是用于参与中国大学生核算机规划大赛-信息可视化规划赛道的项目,终究取得国赛三等奖的成果。现在首要介绍一下本项意图运用随机森林算法猜测国家下一届取得的奖牌。

本项目关于下届冬奥会各个国家取得奖牌的猜测是重点难点,经过翻阅很多的材料与阅览各种猜测的论文之后,终究挑选运用随机森林办法去猜测下届冬奥会各国家取得的金牌、银牌和铜牌,在猜测进程中,咱们考虑了9种要素或许对猜测奖牌产生影响,下面咱们将详细的介绍猜测算法。

猜测要素文件和猜测成果文件可以在博主所上传的文件资源上找到。

  • 猜测要素文件: 冬奥会智能剖析与猜测可视化渠道-随机森林猜测国家奖牌-猜测要素
  • 猜测成果文件: 冬奥会智能剖析与猜测可视化渠道-随机森林猜测国家奖牌-猜测成果

二 随机森林介绍

随机森林是一个包含多个决议计划树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。

学习算法

依据下列算法而建造每棵树 [1] :

  1. 用N来表示练习用例(样本)的个数,M表示特征数目。
  2. 输入特征数目m,用于确认决议计划树上一个节点的决议计划成果;其间m应远小于M。
  3. 从N个练习用例(样本)中以有放回抽样的办法,取样N次,形成一个练习集(即bootstrap取样),并用未抽到的用例(样本)作猜测,评价其差错。
  4. 关于每一个节点,随机挑选m个特征,决议计划树上每个节点的决议都是依据这些特征确认的。依据这m个特征,核算其最佳的割裂办法。
  5. 每棵树都会完好生长而不会剪枝,这有或许在建完一棵正常树状分类器后会被选用)。

为什么运用随机森林:

  • 1)关于很多种材料,它可以产生高准确度的分类器;
  • 2)它可以处理很多的输入变数;
  • 3)它可以在决议类别时,评价变数的重要性;
  • 4)在建造森林时,它可以在内部关于一般化后的差错产生不误差的估量;
  • 5)它包含一个好办法可以估量遗失的材料,如果有很大一部分的材料遗失,仍可以保持准确度;
  • 6)它提供一个实验办法,可以去侦测variable interactions;
  • 7)关于不平衡的分类材料集来说,它可以平衡差错;
  • 8)它核算各例中的接近度,关于数据发掘、侦测离群点(outlier)和将材料视觉化非常有用;
  • 9)运用上述。它可被延伸应用在未符号的材料上,这类材料通常是运用非监督式聚类。也可侦测违背者和观看材料;
  • 10)学习进程是很快速的。

随机森林构建

决议计划树相当于一个大师,经过自己在数据会集学到的知识关于新的数据进行分类。可是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林便是期望构建多个臭皮匠,期望终究的分类作用可以超越单个大师的一种算法。 那随机森林详细怎么构建呢?有两个方面:数据的随机性选取,以及待选特征的随机选取。

1.数据的随机选取:

首要,从原始的数据会集采纳有放回的抽样,结构子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据会集的元素也可以重复。第二,利用子数据集来构建子决议计划树,将这个数据放到每个子决议计划树中,每个子决议计划树输出一个成果。最后,如果有了新的数据需要经过随机森林得到分类成果,就可以经过对子决议计划树的判断成果的投票,得到随机森林的输出成果了。如下图,假定随机森林中有3棵子决议计划树,2棵子树的分类成果是A类,1棵子树的分类成果是B类,那么随机森林的分类成果便是A类。

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

2.待选特征的随机选取

与数据集的随机选取类似,随机森林中的子树的每一个割裂进程并未用到一切的待选特征,而是从一切的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样可以使得随机森林中的决议计划树都可以互相不同,提高体系的多样性,从而提高分类性能。

下图中,蓝色的方块代表一切可以被挑选的特征,也便是待选特征。黄色的方块是割裂特征。左面是一棵决议计划树的特征选取进程,经过在待选特征中选取最优的割裂特征,完成割裂。右边是一个随机森林中的子树的特征选取进程。

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

三 猜测算法建立

猜测要素文件和猜测成果文件在博主资源自取

1.要素考虑:

猜测模型建立时考虑了9种或许对猜测产生影响的要素,分别为(1).参与冬奥会男子数(2).参与冬奥会女子数(3).是否为主办方(4).国家人均gdp(5).国家总gdp(6).国家人口总数 (7).国家社会制度 (8).取得奖牌排行 (9).取得奖牌占总奖牌数的比率。

下面为部分数据的展现:

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

2.办法:

首要用RandomForestRegressor按照不同的权重对9种要素进行模型练习,然后运用同种办法对每一种要素进行练习,并猜测出2026年的值,再将2026年的数据带入总的猜测模型,并得出2026年冬奥会各个国家取得的奖牌,并将2022年的奖牌进行数据查验,最后将取得的数据进行保存。

3.模型查验:

金牌猜测成果准确率到达92.88%,银牌猜测成果准确率到达93.01%,铜牌猜测成果准确率到达92.19%,猜测成果满意预期。

下面为猜测成果部分数据的展现:

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

四 代码编写

猜测要素数据选用mysql数据库进行存储,数据提取选用Django的ORM,猜测算法运用的是随机森林回归算法,猜测成果打印出来保存到excel表格并导入到数据库中,在前端页面进行展现。

为什么运用Django的ORM进行数据提取,因为本项目一开始运用Django进行搭建,后又用Gin进行项目重写,所以猜测算法还持续选用Python进行编写代码。

# 奖牌猜测
def predict_process(request):
    data_total = CountryHuman.objects.all()
    data_dict1 = {}
    for k in data_total:
        data_dict1.update({k.country: k.id})
    list1 = []
    list2 = []
    list3 = []
    for a, b in data_dict1.items():
        data_list = []
        country_data1 = CountryHuman.objects.filter(id=b).first()
        country_name = country_data1.country
        message = Predict.objects.filter(name=country_name).all()
        message_count = message.count()
        data_dict = {"country_name": country_name}
        if message:
            for medal in ['gold', 'silver', 'bronze']:
                x_train = []
                y_train = []
                data1 = []
                rank1 = medal + '_rank'
                percent1 = medal + '_percent'
                count1 = medal + '_count'
                element = ['men', 'women', 'is_home', 'human_gdp', 'gdp', 'human_total', 'social_system', rank1,
                           percent1]
                tip2 = 0
                for index in message:
                    data3 = index.__dict__
                    x_train.append(
                        [index.men, index.women, index.is_home, index.human_gdp, index.gdp, index.human_total,
                         index.social_system, data3[rank1], data3[percent1]])
                    y_train.append(data3[count1])
                x_train = np.reshape(x_train, (message_count, 9))
                y_train1 = y_train
                y_train = np.array(y_train)
                if len(y_train) < 2:
                    tip2 = 1
                    continue
                X_train, X_test, Y_train, Y_test = train_test_split(x_train, y_train, test_size=0.3, random_state=666)
                if len(Y_test) < 2:
                    tip2 = 1
                    continue
                regr = ensemble.RandomForestRegressor(random_state=666, n_estimators=500)
                regr.fit(x_train, y_train)
                for tip1 in element:
                    x_train1 = []
                    y_train1 = []
                    for data2 in message:
                        x_train1.append(data2.year)
                        y_train1.append(data2.__dict__[tip1])
                    x_train1 = np.reshape(x_train1, (message_count, 1))
                    y_train1 = np.array(y_train1)
                    regr1 = ensemble.RandomForestRegressor(random_state=666, n_estimators=500)
                    regr1.fit(x_train1, y_train1)
                    # score1 = regr.score(x_train, y_train)
                    # print(medal + " " + tip1 + " Traing Score:%f" % score1)
                    result1 = regr1.predict(np.array(2026).reshape(1, -1))
                    data1.append(result1)
                score = regr.score(X_test, Y_test)
                if score > 0.5:
                    print(str(data_dict['country_name']) + " - " + medal + " Traing Score: %f" % score)
                if medal == 'gold' and not np.isnan(score) and y_train1[0] and float(score) > 0.50:
                    list1.append(score)
                elif medal == 'silver' and not np.isnan(score) and y_train1[0] and float(score) > 0.50:
                    list2.append(score)
                elif medal == 'bronze' and not np.isnan(score) and y_train1[0] and float(score) > 0.50:
                    list3.append(score)
                result1 = regr.predict(np.array(data1).reshape(1, -1))
                data_dict.update({medal + '_count': round(float(result1))})
            if tip2 != 1:
                data_list.append(data_dict)
                msg = str(data_list[0]['country_name'])
                gold = str(data_list[0]['gold_count'])
                silver = str(data_list[0]['silver_count'])
                bronze = str(data_list[0]['bronze_count'])
                print(msg + ' 金牌: ' + gold + ' 银牌: ' + silver + ' 铜牌: ' + bronze)
    gold_score = np.mean(list1)
    silver_score = np.mean(list2)
    bronze_score = np.mean(list3)
    print("金牌均匀准确率:" + str(gold_score))
    print("银牌均匀准确率:" + str(silver_score))
    print("铜牌均匀准确率:" + str(bronze_score))

猜测成果展现

1. 中国2026届冬奥会奖牌猜测成果

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

2. 俄罗斯2026届冬奥会奖牌猜测成果
冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)
3. 挪威2026届冬奥会奖牌猜测成果

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

4. 美国2026届冬奥会奖牌猜测成果

冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

5. 俄罗斯2026届冬奥会奖牌猜测成果
冬奥会智能分析与预测可视化平台-随机森林预测国家奖牌(四)

五 总结

以上便是冬奥会智能剖析与猜测可视化渠道运用随机森林算法猜测国家下一届取得的奖牌的全部内容啦,在进行猜测时或许会有一些不足,请我们多多批评指正。

博主还会更新更多运用到的技能的详细用法,请我们保藏观看不迷路。

本专栏还会持续的更新,期望我们可以多多关注博主的文章,感谢我们的观看。