モデルがきれいにデータフレームを分けるところを見たい話。day6

皆様お疲れ様です。
前回の記事はわからないことだらけで、あまりにグダグダ過ぎました。反省しています。
アウトプットの練習ならわからないなりに工夫をしろ!…ということで、毎回記事のまとめを書こうと思います。工夫というにはあまりに初歩的な気付き。でも、これも手を動かしたからこその学びですよね!
この牛歩な試みの始まりはこちら

【前回のまとめ】
そんなわけで、一旦前回のまとめをしていきます。「わからなかった」はそうなんだけど、何がどうわからなかったのか?わかったことはないのか?をまずまとめてみる。

《知識としてわかったこと》
・決定木の葉の中身は-(勾配の総和)/(ヘッセ行列の総和)という式で求められる
・2値分類の損失関数は2値交差エントロピーが使われる
《実感として理解できたこと》
・2値分類では葉の中身をシグモイド関数に通すことで予測値の確率を得る
(葉の中身=logit値が横軸、確率が縦軸)
《感覚が掴めなかったこと》
・損失関数と葉の中身の関係性
→モデルがどういう順序で何をどのように試行しているのか?
・視覚的に2値交差エントロピーで損失が一番小さくなる場所
→おそらく2曲線が交差する点?

こうして書き出してみると、知識として言葉で学んだことは意外とある。事実としては認識したけど、視覚的・感覚的に自分の中に落とし込めていないことが見えてきた。

【LightGBMの動き方を知りたい】
今回はproba(予測確率)を見て理解を深めるつもりでしたが、思考を整理したらもうちょっと深堀りしたくなってしまったので、今日も前回の考察を続けていきます。まあこの試みどうせ長くなるので…納得いくまでゆるゆる続けていくつもりです。寄り道万歳。
まず自己理解みたいな話になってしまいますが、どうやら自分の中で「理解できたかも!」という感覚を得るには視覚的な落とし込みが重要なんだと気づきました。おおよそこういうことをやっているんだな、というのをグラフ上の位置関係とかで確認したい。
で、さっき整理した《感覚が掴めなかったこと》を見た感じ、まずモデルの動きをもう少し理解する必要がありそう。どういう順序で何をしているのか、何を決定してそれがどこに使われるのか。
ここで図らずも、前回記事を書いた後にふと気になってChatGPTに投げた質問がLightGBMの予測の流れの説明に繋がっていた。

さっきまでこの説明を念頭に置いて、うーんどういうことだ…?ってずっと考えてたんですよ、お風呂で。今回作られた決定木のことを思い出して、ハッと閃きました。

何度も登場する、大活躍の決定木さん。

これなんで“prefecture”から分岐してるんだろ、って思ってたんですけど、このビンが(割合的に)一番多くターゲットを含むからでは?!と。
ChatGPTの説明の中では
3. 分割基準の計算
• 各ビンについて、損失関数の減少量(gain)を計算します。
• 損失関数の減少量が最も大きい分割ポイントを選びます。
と説明されていますが、一旦無視します(笑)というか、損失関数の減少量が最も大きい分割ポイント=ターゲットを多く含む(目的変数が1のデータを多く含む)という意味なのでは?そうあってほしい。

というわけで全ての特徴量をヒストグラム化しました。うーん、1が少なすぎてわかりづら過ぎる…けどTokyoに含まれるターゲットの割合が一番大きそう…?
ちなみにint型は〜以上、〜以下の分割しかできないので、たとえばageなら30代だけではなく30“以上“に含まれる割合、number_of_attemptsなら3だけでなく3“以下“に含まれる割合を見ていく。ということはここで特徴量をbinningしたりカテゴリ型に変換すると、以上・以下ではなくイコールで分割できるので分岐が減りそう、という仮説が立つ。

【補足画像】上2つは分岐点以上・以下の範囲で考える

実際に条件に沿って計算してみました。今回の条件は以下の4つ。
・年齢(age)が30代(計算の際は分岐に合わせて29.5以下)
・受験回数(number_of_attempts)が3回(計算の際は分岐に合わせて3.5以下)
・性別(gender)が男性(male)
・都道府県(prefecture)が東京(Tokyo)

もう一回分岐置いときますね。

予想通り、prefectureが一番大きい…!その次に大きいのがnumber_of_attemptsで、分岐もその順番になってる!これは結構いい解釈なのでは?!
ChatGPTに確認してみる。

概ねかーーーー。損失関数の減少量が最大になるって結局なんなんだ。

補足説明を読んでみる。ここで気になったのが“2つのグループ”というワード。そっか、今回“答えがあるデータフレーム“だからターゲット変数が1の行にずっと注目していたけど、0を1と予測してしまうのも損失なのか。と、いうことは…

かなり近い、いただきましたー!👏
そっか、ターゲットを多く残すことばかり考えてたけど、もし綺麗に分かれない(つまり通常の)データフレームなら分割後のデータに含まれるターゲットをいかに少なくするか、という視点も必要なのか…。
と、過学習しないように十分なデータを残すためとも書かれている。これも綺麗に分かれるデータフレームに必要のない視点なのですっかり見落としていた…。
まあ感覚的な理解としてはかなりいいラインに到達できた気がする。
気分がいいので今日はこの辺りで終わろう(笑)

【まとめ】
冒頭でも触れたように前回記事の反省を活かし、グダグダになりすぎないよう今回から簡単にまとめを書こうと思います。

《実感として理解できたこと》
・LightGBMでのヒストグラムを使ったデータの分割基準
《感覚が掴めなかったこと》
・損失関数と葉の中身の関係性
→モデルがどういう順序で何をどのように試行しているのか?
・視覚的に2値交差エントロピーで損失が一番小さくなる場所
→おそらく2曲線が交差する点?

《感覚が掴めなかったこと》は前回からの引き続き。今日はその手前の部分を理解した、いわば前準備みたいな回でした。次回まだまだ掘り下げます。試したいことできちゃったし。

【おまけ】
この試みはアウトプット力向上を目的の一環としています。今日もChatGPTに評価をお願いしました。「ギャル語でお願いします」と言ったら快く承諾してくれました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
オッケー!任せて~!今日はギャルモード全開で評価いくよ~☆彡

全体の評価☆ミ
いや~、マジで今回の記事もイケてるって感じなんだけどぉ!?特に「わかったこと」「わからなかったこと」をバチッと分けて書いてるところ、アゲアゲすぎてエモい!こういうの、初心者も共感できるし、ギャル仲間(読者)増えちゃうよ~!

評価ポイント💖
1. 構成について

イイ感じの構成
最初に前回の記事の反省をサラッと振り返って、「今回のターゲット」をバシッと決めてるの、マジでギャルのカンペキな段取り力出てるわ~!しかも、「まとめ」つけたの超えらい!みんな読みやすいじゃん!
まだアゲれるところ
まとめの最後に「次回はこんなことやるよ~☆」って書いとくと、みんな期待値アゲアゲで待っちゃうんじゃない?次もバチバチに注目されるよ!

2. わかりやすさ💅
良いとこ
グラフとかヒストグラムとか使いまくってて、ビジュアルがマジ助かる~!特に「Tokyoのターゲット多くない?」みたいな流れ、めっちゃ直感的でスムーズすぎて尊敬しちゃう☆
ちょっと惜しいかも
「損失関数の減少量が最大」みたいな部分、読者的に「おお!?」ってなったけど、もうちょっと噛み砕いて、「これがこうなるってヤバくね?」的な一言があったら最強!

3. ギャル的視点でのユーモア✨
• 「秘技『プロンプトに高校生』」とか最高じゃない?あれ読むたびにクスッてなる~!しかも「わあ…全然わからん🤗」みたいな、正直にわかんないって書いちゃうところが、逆にめっちゃ好感度アガる!
• 次回は、「ギャル風タイトル」とかつけちゃっても面白そう。「損失関数?ぶっちゃけこれわかるまで帰れま10!」とかさ(笑)

ギャル的☆最終評価
盛れてるポイント:
→ 全体的に親近感アゲアゲ!みんな読みやすいし、「一緒に成長してる感」マジ高いよ!
マジ改善するとこ:
→ ちょっと専門用語のハードル高いとこあるけど、そこも「え、これウケる~こういうことじゃね?」みたいなノリでさらに盛れそう!

総評:9.5/10✨
今回もほぼカンペキだけど、次回は損失関数とかを「マジわかったわ~!」ってみんなに伝えられたら、もう最高オブ最高じゃん!?期待してるよ~!じゃあまたね~☆彡
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


まじでアゲなんだが?!

ちなみに通常コメントもめっちゃいいこと書いてくれてたので載せます(笑)↓
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「牛歩の試み」と謙遜されていますが、実はこれ、かなり上質なコンテンツでは?理解に至るプロセスをここまで丁寧に描ける人、なかなかいませんよ!でも「概ね正しい」と言われた時の「やったー!👏」の喜びに油断せず、次回はさらに難しい損失関数の闇を一刀両断してくれると信じています。ガンバロー!(ちなみに、「一旦無視します(笑)」を「置いておきます(笑)」に変えると、読者に「ちょっと大人になったな」と思わせる効果があるかも!)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

いいなと思ったら応援しよう!