機械学習を使って明日の気温を予測してみる
#import
import numpy as np
import pandas as pd
import os
import csv
import datetime
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import make_scorer
from sklearn.metrics import r2_score
天候データは気象庁からダウンロードしましょう https://www.data.jma.go.jp/gmd/risk/obsdl/index.php
過去一週間の気温の推移をざっくりとDataFrameにぶちこみます
def week_dataset(df):
tmp=np.zeros((2,8,len(df)))
for i in range(1,8):
for j in range(len(df)):
tmp[0][i][j]=df.Max_temp.iloc[j-i]
tmp[1][i][j]=df.Min_temp.iloc[j-i]
df[str("Max -")+str(i)]=tmp[0][i]
df[str("Min -")+str(i)]=tmp[1][i]
return df
df=week_dataset(df)
df.head()
Max-1というのは、一日前の最高気温を表します。 Min-6だったら、6日前の最低気温を表しています。
X=df.drop(["Max_temp","Min_temp"],axis=1)
Y_Max=df["Max_temp"]
Y_Min=df["Min_temp"]
X_train=X[:-365]
X_test=X[-365:]
Y_Max_train=Y_Max[:-365]
Y_Max_test=Y_Max[-365:]
Y_Min_train=Y_Min[:-365]
Y_Min_test=Y_Min[-365:]
X_train.head()
XとYに分けます。Yには当日の最低気温と最高気温をそれぞれ切り出します。
Xには一日前までの時点での7日間の気温の推移が詰まりますね。
お手軽神ツールRandomForestRegressorを使ってモデルを作ります
print("MaxTemp score",forest_Max.score(X_train, Y_Max_train))
print("MinTemp score",forest_Min.score(X_train, Y_Min_train))
モデルのフィッティングスコアを見てみると最高気温が0.95で最低気温が0.98です。おおむね満足な数値と言えましょう。
最高気温より最低気温のほうが表現しやすいようですね。だから何かってわけではないですが。
Y_Max_pred=forest_Max.predict(X_test)
Y_Min_pred=forest_Min.predict(X_test)
お手軽神ツールRandomForestRegressorで予想します。
result=pd.DataFrame([Y_Max_pred,Y_Min_pred],index=["MaxTemp_pred","MinTemp_pred"]).T
result.index=X_test.index
result["MaxTemp_act"]=Y_Max_test
result["MinTemp_act"]=Y_Min_test
結果を整理。
result.plot(figsize=(16,6))
XX_predが予測値、XX_actが実測値です。
一日前のデータから翌日の気温を予測するのは、結構いい感じに行けそうですね。
print("MaxTemp pred r2score",r2_score(Y_Max_test, Y_Max_pred))
print("MinTemp pred r2score",r2_score(Y_Min_test, Y_Min_pred))
決定係数を使って精度を見ると、最高気温は0.83で最低気温は0.95でした。
最高気温は結構幅があるので外しやすいんでしょうかね。
じゃあ次、明日を予測してみましょう。
気象庁のサイトから直近のデータを持ってきます。
1/26までしかなかったので、このデータから本日1/27の予測を行ってみます。
これで結果が妥当かどうか見てみます。
DataFrameを作ります
df_pred=week_dataset(df_pred)
df_pred.iloc[-1:]
26日までしかないので、今日のデータを作ってあげる必要があります。
pred=pd.DataFrame()
pred["datetime"]=pd.to_datetime(["2019-01-27"])
pred.index=pred.datetime
pred=pred.drop("datetime",axis=1)
pred["Max -1"]=df_pred.iloc[-1]["Max_temp"]
pred["Min -1"]=df_pred.iloc[-1]["Min_temp"]
for i in range(2,8):
pred["Max -"+str(i)]=df_pred.iloc[-1]["Max -"+str(i-1)]
pred["Min -"+str(i)]=df_pred.iloc[-1]["Min -"+str(i-1)]
pred
今日のXができました。
Y_Max_pred=forest_Max.predict(pred)
Y_Min_pred=forest_Min.predict(pred)
print("Max temp",Y_Max_pred)
print("Min temp",Y_Min_pred)
さて、予測したところ、1/27の最高気温は11.1度、最低気温は-1.3度のようです。
使用した地点は府中市なので、この天気予報を参照すると・・・
最高気温はピタリ賞です。
ただ、最低気温が1度ほどずれていますね。うーん惜しい。
以上、予測してみたコーナーでした。