用Python編程預測雙色球手機版
數碼 2
本篇文章將從數據爬取、數據清洗、模型訓練、模型預測四個方面詳細介紹使用Python預測雙色球的過程。
在進行預測之前,首先需要採集歷史雙色球開獎數據。我們選擇從官網抓取數據,代碼如下:
import requests
from bs4 import BeautifulSoup
# 官方網站歷史頁面
url = 'http://www.cwl.gov.cn/kjxx/ssq/kjgg/'
r = requests.get(url)
r.encoding = 'utf-8'
web_text = r.text
soup = BeautifulSoup(web_text, 'html.parser')
# 官方網站歷史開獎號碼區塊
main_div = soup.find('div', {'class': 'main'})
data_div = main_div.find_all('tr')
# 解析數據
for each in data_div:
row = each.find_all('td')
# 處理獲取到的數據
...
解析數據過程中,我們需要注意對數據進行清洗,排除無效數據,同時將期號和開獎號碼分別保存到不同的數組中。
在獲取到歷史開獎數據後,我們需要對數據進行清洗,去除重複數據、空值、異常值等。
import pandas as pd
# 將期號和開獎號碼存放到 DataFrame 中
df = pd.DataFrame({'red1': red1, 'red2': red2, 'red3': red3, 'red4': red4, 'red5': red5, 'red6': red6, 'blue': blue})
# 刪除重複數據
df.drop_duplicates(inplace=True)
# 刪除空值
df.dropna(inplace=True)
# 刪除異常數據
df = df[(df['red1'] <= 33) & (df['red2'] <= 33) & (df['red3'] <= 33)
& (df['red4'] <= 33) & (df['red5'] <= 33) & (df['red6'] <= 33) & (df['blue'] <= 16)]
經過數據清洗後,我們需要對數據進行預處理,並將數據拆分為訓練集和測試集,用於訓練模型與測試模型的準確度。我們選擇使用隨機森林演算法訓練數據,並保存訓練模型。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
import joblib
# 數據預處理
X = df.drop('blue', axis=1)
y = df['blue']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 數據拆分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 隨機森林模型訓練
rf = RandomForestClassifier()
rf.fit(X_train, y_train)
# 測試模型準確度
accuracy = rf.score(X_test, y_test)
print(f"隨機森林模型預測準確度為 {accuracy:.2%}")
# 保存模型
joblib.dump(rf, "model.pkl")
在訓練好模型後,我們可以直接調用模型進行預測。我們選擇對最近10期數據進行預測,並將預測結果與官方開獎結果進行比對,來評估模型的準確度。
from datetime import datetime
# 最近10期數據
new_data = [['2022058', 4, 6, 14, 19, 28, 33],
['2022059', 7, 12, 19, 20, 28, 30],
['2022060', 1, 4, 7, 11, 12, 13],
['2022061', 2, 9, 11, 14, 28, 33],
['2022062', 7, 8, 14, 19, 27, 32],
['2022063', 2, 6, 8, 9, 15, 32],
['2022064', 8, 11, 14, 15, 29, 32],
['2022065', 7, 8, 18, 21, 23, 26],
['2022066', 4, 10, 15, 17, 22, 31],
['2022067', 4, 5, 14, 16, 25, 29]]
# 數據預處理
new_df = pd.DataFrame(new_data, columns=['period', 'red1', 'red2', 'red3', 'red4', 'red5', 'red6'])
new_df.drop('period', axis=1, inplace=True)
new_scaled = scaler.transform(new_df)
# 調用模型進行預測
result = rf.predict(new_scaled)
print(result)
# 比對預測結果和官方結果
official_result = ['07 12 19 20 28 30 + 14', '01 04 07 11 12 13 + 15', '02 09 11 14 28 33 + 05',
'07 08 14 19 27 32 + 06', '02 06 08 09 15 32 + 05', '08 11 14 15 29 32 + 07',
'07 08 18 21 23 26 + 11', '04 10 15 17 22 31 + 13', '04 05 14 16 25 29 + 08']
success = 0
for i in range(len(result)):
if result[i] == int(official_result[i][-2:]):
success += 1
print(f"最近10期預測中,預測成功個數為 {success}")
通過以上步驟,我們就可以進行雙色球的預測工作了。完整的代碼可參考以下鏈接:https://github.com/yourname/yourproject