■ はじめに

強化学習等で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使った配送問題」に取り組んでます。

このコーディング途中で繰り返し出てくるコードを纏めておこうと言うのが、当初の考えです。

でもここまで溜めに溜めた未確認コードが多すぎて、なかなか「今」に到達できません。

ちょっとずつ消化するしかないですね。