基于Python預(yù)測一下世界杯最后贏家
那么四年一度的世界杯即將要在卡塔爾開幕了,對于不少熱愛足球運動的球迷來說,這可是十分難得的盛宴,而對于最后大力神杯的歸屬,相信很多人都滿懷著期待,每個人心中都有不同的答案。
今天小編就通過Python
數(shù)據(jù)分析以及機器學(xué)習(xí)等方式來預(yù)測一下誰能獲得最后的冠軍,當(dāng)然最后預(yù)測出來的結(jié)果也僅僅只是作為一種參考,并不代表最后真實的結(jié)果。
數(shù)據(jù)集的準(zhǔn)備
這里我們用到的數(shù)據(jù)集是來自kaggle
的公開數(shù)據(jù)集,其中的一份數(shù)據(jù)集是2018年俄羅斯世界杯每小組各成員交手的記錄,最后小編的預(yù)測基于該份數(shù)據(jù)集的基礎(chǔ)之上,另外一份數(shù)據(jù)集則是從1870年開始到2022年截止,所有參賽球隊的歷史交手成績匯總。那么我們首先導(dǎo)入要用到的模塊以及導(dǎo)入數(shù)據(jù)集。
模塊和數(shù)據(jù)集的導(dǎo)入
數(shù)據(jù)分析和可視化要用到的模塊分別是pandas
、matplotlib
以及seaborn
,而機器學(xué)習(xí)預(yù)測要用到的模塊是sklearn
,代碼如下
import?pandas?as?pd? import?numpy?as?np? import?matplotlib.pyplot?as?plt? import?seaborn?as?sns? import?matplotlib.ticker?as?ticker? from?sklearn.model_selection?import?train_test_split from?sklearn.linear_model?import?LogisticRegression
接著我們導(dǎo)入數(shù)據(jù)集
world_cup?=?pd.read_csv("World_Cup_2018_Dataset.csv") results?=?pd.read_csv("results.csv")
我們可以通過head()
方法來查看導(dǎo)入數(shù)據(jù)及的前幾行,校驗一下數(shù)據(jù)的導(dǎo)入是否成功,代碼如下
world_cup.head()
output
探索性數(shù)據(jù)分析和特征工程
接下來我們要做的便是探索性數(shù)據(jù)分析和特征工程了,來對數(shù)據(jù)集有一個大致的了解,同時生成一些針對最后的預(yù)測大有幫助的特征出來,例如我們針對比賽當(dāng)中的比分來判斷比賽是誰勝誰負,或者是平局,代碼如下
winner?=?[] for?i?in?range(len(results["home_team"])): ????if?results["home_score"][i]?>?results["away_score"][i]: ????????winner.append(results["home_team"][i]) ????elif?results["home_score"][i]?<?results["away_score"][i]: ????????winner.append(results["away_team"][i]) ????else: ????????winner.append("Draw") results["winning_team"]?=?winner results["goal_difference"]?=?np.absolute(results["home_score"]?-?results["away_score"]) results.head()
output
緊接著我們針對某個單獨的國家,統(tǒng)計歷史過往中所有比賽的勝負率情況,例如小編比較喜歡阿根廷隊,就篩選出阿根廷隊的歷史戰(zhàn)績,代碼如下
df?=?results[(results["home_team"]?==?"Argentina")?|?(results["away_team"]?==?"Argentina")] argen?=?df.iloc[:] argen.head()
output
那么同時我們也知道第一屆世界杯舉辦的時間是1930年在烏拉圭舉辦的,那么篩選出在1930年之后的所有比賽的成績,代碼如下
year?=?[] for?row?in?argen['date']: ????year.append(int(row[:4])) argen["match_year"]?=?year argen_1930?=?argen[argen.match_year?>=?1930] argen_1930.head()
output
我們將比賽的結(jié)果的統(tǒng)計可視化出來,其中我們就能清晰地看到阿根廷球隊的勝負率的情況,代碼如下
x?=?["Argentina","Loss","Draw"] y?=?[474,?220,?173] ? sns.barplot(x,?y) plt.title("win?games?vs?loss?games") plt.xlabel("win?vs?loss") plt.ylabel("count") plt.show()
output
俄羅斯世界杯的參賽隊伍
我們先將目標(biāo)鎖定在2018年俄羅斯世界杯的參賽隊伍上,總共是以下這幾支球隊
world_cup_russia?=?["Australia",?"Iran",?"Japan",?"Korea?Republic",?"Saudi?Arabia",?"Egypt",?"Morocco", ???????????????????"Nigeria",?"Senegal",?"Tunisia",?"Costa?Rica",?"Mexico",?"Panama",?"Argentina",?"Brazil",? ????????????????????"Colombia",?"Peru",?"Uruguay",?"Belgium",?"Croatia",?"Denmark",?"England",?"France",? ????????????????????"Germany",?"Iceland",?"Poland",?"Portugal",?"Russia",?"Serbia",?"Spain",?"Sweden",?"Switzerland"]
然后我們篩選出來這32支球隊的過往的比賽成績,代碼如下
df_team_home?=?results[results['home_team'].isin(world_cup_russia)] df_team_away?=?results[results['away_team'].isin(world_cup_russia)] df_teams?=?pd.concat((df_team_home,?df_team_away)) df_teams.drop_duplicates(inplace=True) df_teams.tail()
output
我們著重看的是1930年之后的比賽記錄,那么我們再進行一次篩選,代碼如下
year?=?[] for?row?in?df_teams["date"]: ????year.append(int(row[:4])) df_teams["match_year"]?=?year df_teams_1930?=?df_teams[df_teams.match_year?>=?1930] df_teams_1930.head()
output
當(dāng)然我們在最后進行預(yù)測的時候,會有一些無關(guān)緊要的特征摻雜其中,我們需要將其去掉,代碼如下
df_teams_1930?=?df_teams.drop(['date',?'home_score',?'away_score',?'tournament',?'city',?'country',?'goal_difference',?'match_year'],?axis=1) df_teams_1930.tail()
output
我們需要將winning_team
這一列的標(biāo)簽做一次轉(zhuǎn)換,將贏得比賽的標(biāo)簽改為2
,輸?shù)舯荣惖臉?biāo)簽改為0
,而平局的標(biāo)簽改為1
,代碼如下
df_teams_1930?=?df_teams_1930.reset_index(drop=True) df_teams_1930.loc[df_teams_1930.winning_team?==?df_teams_1930.home_team,'winning_team']=2 df_teams_1930.loc[df_teams_1930.winning_team?==?'Draw',?'winning_team']=1 df_teams_1930.loc[df_teams_1930.winning_team?==?df_teams_1930.away_team,?'winning_team']=0 df_teams_1930.tail()
output
緊接著,我們需要對這些離散類型的變量進行獨熱編碼,用到的是pandas
模塊當(dāng)中的get_dummies()
方法,代碼如下
#?convert?home?team?and?away?team?from?categorical?variables?to?continous?inputs? #?Get?dummy?variables final?=?pd.get_dummies(df_teams_1930,?prefix=['home_team',?'away_team'],?columns=['home_team',?'away_team']) final.head()
output
劃分出訓(xùn)練集和測試集,調(diào)用的是train_test_split()
方法,代碼如下
#?Separate?X?and?y?sets X?=?final.drop(['winning_team'],?axis=1) y?=?final["winning_team"] y?=?y.astype('int') #?Separate?train?and?test?sets X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.30,?random_state=42)
邏輯回歸算法
那小編這里調(diào)用的是非常簡單的邏輯回歸的算法,讀者朋友后續(xù)也可以嘗試其他的分類算法進一步的完善一下整個預(yù)測的流程與結(jié)果,代碼如下
logreg?=?LogisticRegression() logreg.fit(X_train,?y_train) score?=?logreg.score(X_train,?y_train) score2?=?logreg.score(X_test,?y_test) print("Training?set?accuracy:?",?'%.3f'%(score)) print("Test?set?accuracy:?",?'%.3f'%(score2))
預(yù)測結(jié)果
那么最后便是將我們訓(xùn)練出來的模型去做一個預(yù)測了,我們先前的數(shù)據(jù)集當(dāng)中有主隊和客隊之分,但是在世界杯的賽場上沒有,這里我們就依據(jù)世界排名的先后順序來劃分一下,因此需要導(dǎo)入世界排名的數(shù)據(jù)集
#?導(dǎo)入新的數(shù)據(jù)集,各球隊的世界排名 ranking?=?pd.read_csv('datasets/fifa_rankings.csv')? #?2018年俄羅斯世界杯的對陣情況 fixtures?=?pd.read_csv('datasets/fixtures.csv') pred_set?=?[]
在數(shù)據(jù)集當(dāng)中插入主隊和客隊排名的字段,代碼如下
#?插入兩個新的字段,主隊和客隊排名的字段 fixtures.insert(1,?'first_position',?fixtures['Home?Team'].map(ranking.set_index('Team')['Position'])) fixtures.insert(2,?'second_position',?fixtures['Away?Team'].map(ranking.set_index('Team')['Position'])) #?我們篩選出來在小組賽中的對陣情況 fixtures?=?fixtures.iloc[:48,?:] fixtures.head()
output
根據(jù)排名的高低來重新修正參賽球隊是作為主隊還是客隊,代碼如下
#?Loop?to?add?teams?to?new?prediction?dataset?based?on?the?ranking?position?of?each?team for?index,?row?in?fixtures.iterrows(): ????if?row['first_position']?<?row['second_position']: ????????pred_set.append({'home_team':?row['Home?Team'],?'away_team':?row['Away?Team'],?'winning_team':?None}) ????else: ????????pred_set.append({'home_team':?row['Away?Team'],?'away_team':?row['Home?Team'],?'winning_team':?None}) ???????? pred_set?=?pd.DataFrame(pred_set) backup_pred_set?=?pred_set pred_set.head()
output
還是和之前一樣的,我們需要對這些離散類型的變量進行編碼,這里就不做演示了,我們調(diào)用訓(xùn)練好的模型并且進行比賽結(jié)果的預(yù)測,代碼如下
#?小組賽對決的預(yù)測? predictions?=?logreg.predict(pred_set) for?i?in?range(fixtures.shape[0]): ????print(backup_pred_set.iloc[i,?1]?+?"?and?"?+?backup_pred_set.iloc[i,?0]) ????if?predictions[i]?==?2: ????????print("Winner:?"?+?backup_pred_set.iloc[i,?1]) ????elif?predictions[i]?==?1: ????????print("Draw") ????elif?predictions[i]?==?0: ????????print("Winner:?"?+?backup_pred_set.iloc[i,?0]) ????print('Probability?of?'?+?backup_pred_set.iloc[i,?1]?+?'?winning:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][2])) ????print('Probability?of?Draw:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][1])) ????print('Probability?of?'?+?backup_pred_set.iloc[i,?0]?+?'?winning:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][0])) ????print("")
output
上述預(yù)測的結(jié)果針對的是2018年俄羅斯世界杯小組賽的對陣情況,那么2022年卡塔爾世界杯小組賽的預(yù)測,我們只需要將fixture
數(shù)據(jù)集更新一下即可
fixtures?=?pd.read_csv("datasets/fifa-world-cup-2022.csv") fixtures.head()
output
最后預(yù)測出來的結(jié)果如下所示
到此這篇關(guān)于基于Python預(yù)測一下世界杯最后贏家的文章就介紹到這了,更多相關(guān)Python預(yù)測世界杯贏家內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用
這篇文章主要介紹了如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實現(xiàn)方法
今天小編就為大家分享一篇Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python中np.random.randint()參數(shù)詳解及用法實例
numpy.random.randint()函數(shù)不僅可以生成一維隨機數(shù)組,也可以生成多維度的隨機數(shù)組,下面這篇文章主要給大家介紹了關(guān)于Python中np.random.randint()參數(shù)詳解及用法的相關(guān)資料,需要的朋友可以參考下2022-09-09解決Python找不到ssl模塊問題 No module named _ssl的方法
這篇文章主要介紹了解決Python找不到ssl模塊問題 No module named _ssl的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04python?pandas創(chuàng)建多層索引MultiIndex的6種方式
這篇文章主要為大家介紹了python?pandas創(chuàng)建多層索引MultiIndex的6種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07