用python+sklearn機器學習實現天氣預報 模型和使用
項目地址
系列教程
機器學習參考篇: python+sklearn+kaggle機器學習
用python+sklearn(機器學習)實現天氣預報 准備
用python+sklearn(機器學習)實現天氣預報數據 數據
用python+sklearn(機器學習)實現天氣預報 模型和使用
0.前言
在上一篇教程里我們已經獲取了所需要的全部數據,包括訓練數據集和測試數據集,使用ProcessData()
調用,所以接下來寫模型的建立和預測
1.建立模型
沒段代碼在文章后面都會整合成一段,分段展示只是便於閱讀
a.准備
引入所需要的頭文件
from sklearn.ensemble import RandomForestRegressor # 隨機樹森林模型
import joblib # 保存模型為pkl
from sklearn.metrics import mean_absolute_error # MAE評估方法
from ProcessData import ProcessData # 取數據
選擇模型
首先我們先要從模型里選擇一項適合這次場景的模型,比如從決策樹,隨機樹森林,RGB模型等等中選擇,本處選用的隨機樹森林也就是RandomForest
選擇評估方法
目前有許多的模型准確率評估方法,本處使用的是MAE,也就是mean_absolute_error 平均錯誤數值,就每個預測的數值離正確數值錯誤數值的平均數
獲取數據集
這次可以從ProcessData()
獲取到全部的被預處理后的數據,如
# 取到數據
[X_train, X_valid, y_train, y_valid, X_test] = ProcessData()
b.建立模型
# 用XGB模型,不過用有bug
# modelX = XGBRegressor(n_estimators=1000, learning_rate=0.05, random_state=0, n_jobs=4)
# # model.fit(X_train_3, y_train_3)
# # model.fit(X_train_2, y_train_2)
# col = ["Ave_t", "Max_t", "Min_t", "Prec","SLpress", "Winddir", "Windsp", "Cloud"]
# modelX.fit(X_train, y_train,
# early_stopping_rounds=5,
# eval_set=[(X_valid, y_valid)],
# verbose=False)
# 隨機樹森林模型
model = RandomForestRegressor(random_state=0, n_estimators=1001)
# 訓練模型
model.fit(X_train, y_train)
其中n_estimators是可自己選的,不過在多次調試后得到1001是MAE最優
c.獲取模型評估結果
# 用MAE評估
score = mean_absolute_error(y_valid, preds)
d.用joblib模塊保存模型
保存后的模型便於傳播即可多次使用,但當前環境下的需求不大但我還是寫了
# 保存模型到本地
joblib.dump(model, a)
e.封裝
GetModel.py
# -*- coding: utf-8 -*-
# @Time: 2020/12/16
# @Author: Eritque arcus
# @File: GetModel.py
from sklearn.ensemble import RandomForestRegressor
import joblib
from sklearn.metrics import mean_absolute_error
from ProcessData import ProcessData
# 訓練並保存模型
def GetModel(a="Model.pkl"):
""" :param a: 模型文件名 :return: [socre: MAE評估結果, X_test: 預測數據集] """
# 取到數據
[X_train, X_valid, y_train, y_valid, X_test] = ProcessData()
# 用XGB模型,不過用有bug
# modelX = XGBRegressor(n_estimators=1000, learning_rate=0.05, random_state=0, n_jobs=4)
# # model.fit(X_train_3, y_train_3)
# # model.fit(X_train_2, y_train_2)
# col = ["Ave_t", "Max_t", "Min_t", "Prec","SLpress", "Winddir", "Windsp", "Cloud"]
# modelX.fit(X_train, y_train,
# early_stopping_rounds=5,
# eval_set=[(X_valid, y_valid)],
# verbose=False)
# 隨機樹森林模型
model = RandomForestRegressor(random_state=0, n_estimators=1001)
# 訓練模型
model.fit(X_train, y_train)
# 預測模型,用上個星期的數據
preds = model.predict(X_valid)
# 用MAE評估
score = mean_absolute_error(y_valid, preds)
# 保存模型到本地
joblib.dump(model, a)
# 返回MAE
return [score, X_test]
2.總控
代碼
這幾篇文章寫了零零散散好幾個類,所以要寫個總文件也就是啟動文件串起來,然后在控制台輸出
Main.py
# -*- coding: utf-8 -*-
# @Time: 2020/12/16
# @Author: Eritque arcus
# @File: Main.py
import joblib
import datetime as DT
from GetModel import GetModel
import matplotlib.pyplot as plt
# 訓練並保存模型並返回MAE
r = GetModel()
print("MAE:", r[0])
# 讀取保存的模型
model = joblib.load('Model.pkl')
# 最終預測結果
preds = model.predict(r[1])
# 反歸一化或標准化,不過出bug了,不用
# for cols in range(0, len(preds)):
# preds[cols] = scaler.inverse_transform(preds[cols])
# sns.lineplot(data=preds)
# plt.show()
# 打印結果到控制台
print("未來7天預測")
print(preds)
all_ave_t = []
all_high_t = []
all_low_t = []
for a in range(1, 7):
today = DT.datetime.now()
time = (today + DT.timedelta(days=a)).date()
print(time.year, '/', time.month, '/', time.day,
': 平均氣溫', preds[a][0],
'最高氣溫', preds[a][1],
'最低氣溫', preds[a][2],
"降雨量", preds[a][3],
"風力", preds[a][4])
all_ave_t.append(preds[a][0])
all_high_t.append(preds[a][1])
all_low_t.append(preds[a][2])
temp = {"ave_t": all_ave_t, "high_t": all_high_t, "low_t": all_low_t}
# 繪畫折線圖
plt.plot(range(1, 7), temp["ave_t"], color="green", label="ave_t")
plt.plot(range(1, 7), temp["high_t"], color="red", label="high_t")
plt.plot(range(1, 7), temp["low_t"], color="blue", label="low_t")
plt.legend() # 顯示圖例
plt.ylabel("Temperature(°C)")
plt.xlabel("day")
# 顯示
plt.show()
使用方法
直接用python運行pre_weather/Main.py,就會在控制台輸出預測的數據
python pre_weather/Main.py
或
在你的python代碼里用joblib導入生成的模型,然后輸入你的數據進行預測
(PS: 因為模型的訓練用的數據日期和你預測數據的日期有關,所以不建議直接用使用非當天訓練的模型進行預測,誤差可能偏大)
如以下代碼(在Main.py的11行):
import joblib
# 讀取保存的模型
model = joblib.load('Model.pkl')
# 最終預測結果
preds = model.predict(r[1])
其中,r[1]是預測數據
或
參考Main.py
,自己寫一個符合你需求的啟動文件
3.最后效果
本系列教程到這就結束了,代碼具體還要以github項目:PYWeatherReport為主,可能會在這個github項目上不定期優化更新
有問題可以在評論問問