github項目:PYWeatherReportpython
機器學習參考篇: python+sklearn+kaggle機器學習
用python+sklearn(機器學習)實現天氣預報 準備
用python+sklearn(機器學習)實現天氣預報數據 數據
用python+sklearn(機器學習)實現天氣預報 模型和使用git
在上一篇教程裏咱們已經獲取了所須要的所有數據,包括訓練數據集和測試數據集,使用ProcessData()
調用,因此接下來寫模型的創建和預測github
沒段代碼在文章後面都會整合成一段,分段展現只是便於閱讀web
from sklearn.ensemble import RandomForestRegressor # 隨機樹森林模型 import joblib # 保存模型爲pkl from sklearn.metrics import mean_absolute_error # MAE評估方法 from ProcessData import ProcessData # 取數據
首先咱們先要從模型裏選擇一項適合此次場景的模型,好比從決策樹,隨機樹森林,RGB模型等等中選擇,本處選用的隨機樹森林也就是RandomForestbash
目前有許多的模型準確率評估方法,本處使用的是MAE,也就是mean_absolute_error 平均錯誤數值,就每一個預測的數值離正確數值錯誤數值的平均數app
此次能夠從ProcessData()
獲取到所有的被預處理後的數據,如dom
# 取到數據 [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)
其中n_estimators是可本身選的,不過在屢次調試後獲得1001是MAE最優機器學習
# 用MAE評估 score = mean_absolute_error(y_valid, preds)
保存後的模型便於傳播便可屢次使用,但當前環境下的需求不大但我仍是寫了svg
# 保存模型到本地 joblib.dump(model, a)
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]
這幾篇文章寫了零零散散好幾個類,因此要寫個總文件也就是啓動文件串起來,而後在控制檯輸出
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
,本身寫一個符合你需求的啓動文件
本系列教程到這就結束了,代碼具體還要以github項目:PYWeatherReport爲主,可能會在這個github項目上不按期優化更新
有問題能夠在評論問問