予測の準備 第21回 人工知能
このページのコードを参考に書いています。↓
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))
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
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]
# 予測用データ
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()
y = df_pred["MW"].as_matrix().astype('int').flatten()
第18回でも書いた通り、Xのカラムの設定をしています。
あとyも。yは、予測したいデータのカラムを書きます。
ここは学習と似ています。
あとは前回と同じで、これ↓で標準化をし予測をy_predでもらう。
# 正規化
X = scaler.transform(X)
# 予測値の取得
y_pred = model.predict(X)
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))
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)
説明ここまで
次回以降は、まとめ。
コメント
0 件のコメント :
コメントを投稿