■ はじめに
強化学習等でPythonコードを使いますが、いつまでもChatGPTさんにおんぶに抱っこでは困りもの。
といって、Python関係の本を借りてきて読んでみても、
「自分とは関係ないし…」
と、途中で本を閉じてしまいます。
どうしたもんかと考えたら、自分もかなりの量、ChatGPTさんに教えてもらっていることに気が付きました。
だけど、記憶時間と容量が限られるRNN記憶なので、ここいらでちゃんとしたメモリーに移します。
■ 自分的に興味がある事からやります。
強化学習をやっていると、
「グラフがあった方が良かったかな?」
とか
「凡例で比較したかったかな」
と言うことが多々あります。
そこで第一回のお題は、
「教えで!ChatGPTさん。グラフ活用編」
として、これまでおしえてもらったコードを再掲して行きます。
まぁ、再掲と言ってもコードを見ればある程度なのでほとんど新規と言ってもいいでしょう。
なお、このページのコードは、
次のimportを前提にしています。
import numpy as np
import matplotlib.pyplot as plt
今回は「生データ+移動平均を重ねた、強化学習向けの見やすい評価グラフ」を作ります。
■折れ線+マーカー(◯・▲など)
評価グラフでは「点が見える」だけで分かりやすさが上がります。
折れ線グラフに ◯ / ▲ を付ける基本
plt.plot(
timesteps,
rewards,
color="gray",
alpha=0.4,
marker="o", # ◯
markersize=4,
linestyle="-",
label="Raw reward"
)
■ 生データ(◯)+移動平均(▲)を出す
▲にすると「あとから計算した値」だと直感的に分かりやすくなります。
ちょっとコードが長いですが…
import numpy as np
import matplotlib.pyplot as plt
window = 20
smoothed = np.convolve(
rewards,
np.ones(window)/window,
mode="valid"
)
plt.figure(figsize=(8, 5))
# 生データ:◯
plt.plot(
timesteps,
rewards,
color="gray",
alpha=0.4,
marker="o",
markersize=3,
linestyle="-",
label="Raw reward"
)
# 移動平均:▲
plt.plot(
timesteps[:len(smoothed)],
smoothed,
color="tab:blue",
linewidth=2,
marker="^", # ▲
markersize=5,
linestyle="-",
label="Moving average"
)
plt.xlabel("Time step")
plt.ylabel("Episode reward")
plt.title("Reward vs Time step")
plt.legend()
plt.grid(True)
plt.show()
とやります。
■マーカー指定まとめ
マーカーを指定するのに、マーカーそのものではなくて、相当するマークが必要になります。
これこそ知ってないと書けないので簡単に纏めておきます。
"o" : ◯
"^" : ▲
"s" : □
"x" : ×
"+" : +
"d" : ◆
"*": ★
■ 見やすくするコツ
ここでは、強化学習に絞って見やすいグラフを出すコードを考えてみます。
① 全点マーカーは「多すぎる」のでまびく
plt.plot(
timesteps,
rewards,
marker="o",
markevery=10 # 10点に1回だけ ◯
)
👉 長時間学習ではこれが◎
② マーカーだけにして線を消す
plt.plot(
timesteps,
rewards,
linestyle="None",
marker="o",
label="Raw points"
)
③ マーカーの縁取り
plt.plot(
timesteps,
rewards,
marker="o",
markerfacecolor="white",
markeredgecolor="black",
markersize=5
)
📌 チェックリスト
☑ 生データ = ◯(薄く)
☑ 移動平均 = ▲(太く)
☑ markevery で間引き
☑ 凡例あり
これで、だいぶん見やすくなります。
■ 結果:
今回は、強化学習の必要コードになるグラフを書くコードを勉強しました。
自分でグラフが欲しくなったら、このページをコピペして下さい。
■ 今回の学び:
今回、ちょっとした思い付きで
「Pythonコードの再確認、グラフ編」
をやってみました。
過去のコードを確認したら、まだまだ纏めないといけないコードが山積みになってますね。
なんかこの企画、シリーズになりそうです。
■ まとめ
別企画で「SLAM使った配送問題」に取り組んでます。
このコーディング途中で繰り返し出てくるコードを纏めておこうと言うのが、当初の考えです。
でもここまで溜めに溜めた未確認コードが多すぎて、なかなか「今」に到達できません。
ちょっとずつ消化するしかないですね。
