このページのコードを参考に書いています。↓
TensorFlowで電力使用量予測 with Keras - Qiita


書いてて思うんですけど、このページ↑。


めちゃくちゃ分かりやすいです。このページのおかげで、理解が進みました。


いよいよ予測です。


# 電力データを読込
df_kw = pd.read_csv("juyo-2017.csv",encoding="Shift_JIS",skiprows=1)

# 岡山のデータを読込
df_temp_okym = read_temp("data_okayama-2017.csv")
df_temp_okym.rename(columns = {'TEMP':'TEMP_okym'}, inplace=True)

# 広島のデータを読込
df_temp_hrsm = read_temp("data_hiroshima-2017.csv")
df_temp_hrsm.rename(columns = {'TEMP':'TEMP_hrsm'}, inplace=True)

# データ加工
df_kw.columns = ["DATE","TIME","万kW"]
df_kw["MW"] = df_kw["万kW"] * 10
df_kw["DATETIME"] = df_kw.index.map(lambda _: pd.to_datetime(df_kw.DATE[_] + " " + df_kw.TIME[_]))

# データ結合
df = df_kw.copy()
df = df.merge(df_temp_okym,how="inner", on="DATETIME")
df = df.merge(df_temp_hrsm,how="inner", on="DATETIME")

# 追加データ作成
df["MONTH"] = df.DATETIME.map(lambda _: _.month)
df["WEEK"] = df.DATETIME.map(lambda _: _.weekday())
df["HOUR"] = df.DATETIME.map(lambda _: _.hour)

# 欠損データ削除
df = df.dropna()

# One-hotエンコーディング
cols = ["MONTH","WEEK","HOUR"]
for col in cols:
df = df.join(pd.get_dummies(df[col], prefix=col))

# テストデータの不足分を補完
for col in x_cols[2:]:
if not col in df.columns:
df[col] = 0

# 7月の電力使用量を予測
df_pred = df[df.MONTH==7]

# 予測用データ
X = df_pred[x_cols].as_matrix().astype('float64')
y = df_pred["MW"].as_matrix().astype('int').flatten()

# 正規化
X = scaler.transform(X)

# 予測値の取得
y_pred = model.predict(X)

# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))

# 可視化
pd.DataFrame({"pred":y_pred, "act":y}, index=df_pred.index).plot(figsize=(15,4),ylim=(4000,12000))



コード長いですよねー。



でも、よーく見ると途中まで、前に説明した同じ作業をしているんです。


2016年の広島、岡山の気温 : 2016年の電気量 = 2017年の広島、岡山の気温 : y


yはなんでしょう?という感じでしてきたんです。



なので、今回の広島、岡山の気温は、2017年の気温を読み込みます。


処理は一緒です。



最初に2017年の電気を読み込んでいますよね?


「あれ?この予測を求めるんじゃないの? これ答えじゃない?」って思ってました。



これは、あとで、予測したとき実測とどう違うか?を検証するために読み込んでいます。



本来は、無いのですが、ソースに合わせて読み込んでみましょう。



説明したところは、省略します。



下のところから説明をします。


# テストデータの不足分を補完
for col in x_cols[2:]:
if not col in df.columns:
df[col] = 0

これは、欠損データではなく、不備なところに0を入れてます。

何も無いデータであれば削除されますが、部分的にないとかの場合


0を入れておかないとエラーになるので、入れる作業ですね。



次!


# 7月の電力使用量を予測
df_pred = df[df.MONTH==7]

# 予測用データ
X = df_pred[x_cols].as_matrix().astype('float64')
y = df_pred["MW"].as_matrix().astype('int').flatten()

# 正規化
X = scaler.transform(X)

# 予測値の取得
y_pred = model.predict(X)

# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))

# 可視化
pd.DataFrame({"pred":y_pred, "act":y}, index=df_pred.index).plot(figsize=(15,4),ylim=(4000,12000))


まず最初の行。
df.pred = df[df.Month==7]

これは、ソースコメントに書いてある通り、予測は、7月にしてるようです。


次の行
X = df_pred[x_cols].as_matrix().astype('float64')
y = df_pred["MW"].as_matrix().astype('int').flatten()

第18回でも書いた通り、Xのカラムの設定をしています。


あとyも。yは、予測したいデータのカラムを書きます。


ここは学習と似ています。



あとは前回と同じで、これ↓で標準化をし予測をy_predでもらう。

# 正規化
X = scaler.transform(X)

# 予測値の取得
y_pred = model.predict(X)


ここ↓は、前回と同様に誤差を検出。

# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))

# 可視化
pd.DataFrame({"pred":y_pred, "act":y}, index=df_pred.index).plot(figsize=(15,4),ylim=(4000,12000))


もし結果をグラフではなく、数字で知りたい場合は


この y_pred を出力すればそのまま数字が出てくる↓
print(y_pred)


説明ここまで


次回以降は、まとめ。