見出し画像

30日Python #23 まだ見ぬ患者を、予測する

「読むデータ」は、臨床医・医学研究者のための、Pythonと機械学習の連載。プログラミングの技術を身につけることから始め、自分のデータを「読み解く」力を鍛える。今回の#23では、学習した決定木に、初めて見る患者を予測させる。predict で悪性か良性かを当て、さらに「悪性である確率」まで読み取る。所要時間は5分。読むのに3分、手を動かすのに2分。


学んだ力を、初めて見る患者で試す

前回、決定木に学習用データで経験を積ませた。研修医でいえば、何百例も診て勘を養った段階だ。

では、その力を試そう。学習には使っていない、初めて見る患者であるテスト用の171人を、学習済みのモデルに渡す。モデルは、覚えた樹を上からたどり、一人ひとりに「悪性か、良性か」の予測を返す。

そしてもう一つ、臨床的にずっと重要なものが得られる。「どれくらい確信しているか」、つまり確率だ。今日は、予測と確率、二つの読み方を学ぶ。


要点

  • 学習済みモデルに .predict(X_test) を渡すと、一人ひとりの予測(0=悪性, 1=良性)が返る。

  • .predict_proba(X_test) は、予測の「確信度」として、悪性である確率・良性である確率を返す。

  • 二択の予測だけでなく確率まで見ることで、「機械がどれだけ確信しているか」を読める。


1. 予測させる

学習済みモデル(前回の model)に、テスト用の患者を渡す。

pred = model.predict(X_test)
pred[:10]

実行すると、こう表示される。

array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1])

テスト用の先頭10人への予測だ。0は悪性、1は良性。1人目は悪性、残りは良性、と予測している。model.predict(X_test) は「このモデルで、X_testの患者たちを予測せよ」という命令。第7回の「データを渡すと結果を返す関数」が、今度は predict として、予測を返してきた。

正解と並べてみよう。

y_test.values[:10]

実行すると、こう表示される。

array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1])

予測と正解が、この最初の先頭10人ではぴったり一致している。学習に使っていない患者を、正しく当てられた。

2. 確信度を、読む

予測は「悪性か良性か」の二択だが、臨床ではもう一つ知りたいことがある。モデルは、どれくらい確信しているのか。それを返すのが predict_proba だ。

proba = model.predict_proba(X_test)
proba[:5].round(3)

実行すると、こう表示される。

array([[0.977, 0.023],
       [0.017, 0.983],
       [0.017, 0.983],
       [0.017, 0.983],
       [0.017, 0.983]])

各行が一人の患者、二つの数字は左が「悪性である確率」、右が「良性である確率」だ(合わせて1になる)。1人目は悪性0.977、良性0.023であり、97.7%の確信で悪性、と読める。2人目以降は良性98.3%だ。

3. 確率を読むと、何が変わるか

なぜ、二択だけでなく確率を見るのか。

たとえば、ある患者が「悪性確率97.7%」と出たなら、モデルは強い確信を持って悪性と言っている。だが、もし「悪性確率55%」と出る患者がいたら、予測は悪性(0.5を超えるので)でも、モデルは半ば迷っている。この二人を、同じ「悪性」のひとことで片づけてよいだろうか。

確率は、その迷いを映す。確信度の低い予測は、追加の検査や慎重な判断を促す手がかりになる。二択の答えだけを見て安心せず、その裏にある確率まで読む。機械の予測を鵜呑みにしないための、これが第一歩だ。


今日の実習(2分)

新しいセルで、上から順にやってみよう。
(前回第22回の学習済み model がある状態を想定)

  1. pred = model.predict(X_test) を実行し、pred[:10] で先頭10人の予測を見る。

  2. y_test.values[:10] と並べ、予測と正解を見比べる。

  3. model.predict_proba(X_test)[:5].round(3) を実行し、先頭5人の[悪性確率, 良性確率]を読む。1人目が悪性97.7%であることを確かめる。

二択の予測と、その裏の確率。両方を自分の目で見比べてみよう。


今日のまとめ

学習済みモデルに .predict(X_test) を渡すと予測(0=悪性, 1=良性)が、.predict_proba(X_test) を渡すと確信度(悪性・良性それぞれの予測確率)が返る。

確率まで読めば、「機械がどれだけ確信しているか」が分かり、迷っている予測を見抜ける。二択の答えの裏には、いつも確率がある。それも含めて読むのが、機械を鵜呑みにしない第一歩だ。


次回、第24回「機械の判断を、のぞき込む」

学習した決定木そのものを図にして、機械がどんな樹を育てたのかを読む。第21回で概念図として見た樹の、本物の姿に出会う。


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