冬奧會智能分析與預測可視化平台-隨機森林預測國家獎牌(四)

一 前言

此項目為冬奧會智能分析與預測可視化平台,這個項目是用於參加中國大學生計算機設計大賽-信息可視化設計賽道的項目,最終獲得國賽三等獎的成績。現在主要介紹一下本項目的使用隨機森林算法預測國家下一屆獲得的獎牌。

本項目對於下屆冬奧會各個國家獲得獎牌的預測是重點難點,經過翻閱大量的資料與閱讀各種預測的論文之後,最終選擇使用隨機森林方法去預測下屆冬奧會各國家獲得的金牌、銀牌和銅牌,在預測過程中,我們考慮了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]
                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)
                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(2022).reshape(1, -1))
                    data1.append(result1)
                score = regr.score(x_train, y_train)
                print(medal + " Traing Score:%f" % score)
                if medal == 'gold' and not np.isnan(score) and y_train1[0] and float(score) > 0.85:
                    list1.append(score)
                elif medal == 'silver' and not np.isnan(score) and y_train1[0] and float(score) > 0.85:
                    list2.append(score)
                elif medal == 'bronze' and not np.isnan(score) and y_train1[0] and float(score) > 0.85:
                    list3.append(score)
                result1 = regr.predict(np.array(data1).reshape(1, -1))
                data_dict.update({medal + '_count': round(float(result1))})
            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(gold_score)
    print(silver_score)
    print(bronze_score)

預測結果展示

1. 中國2026屆冬奧會獎牌預測結果

在這裡插入圖片描述

2. 俄羅斯2026屆冬奧會獎牌預測結果在這裡插入圖片描述
3. 挪威2026屆冬奧會獎牌預測結果

在這裡插入圖片描述

4. 美國2026屆冬奧會獎牌預測結果

在這裡插入圖片描述

5. 俄羅斯2026屆冬奧會獎牌預測結果在這裡插入圖片描述

五 總結

以上就是冬奧會智能分析與預測可視化平台使用隨機森林算法預測國家下一屆獲得的獎牌的全部內容啦,在進行預測時可能會有一些不足,請大家多多批評指正。

博主還會更新更多使用到的技術的具體用法,請大家收藏觀看不迷路。

本專欄還會繼續的更新,希望大家能夠多多關注博主的文章,感謝大家的觀看。