AI:温泉として登録された場所の傾向を当ててみる
この結果は公開データから学習した統計モデルによる推定です。温泉の存在・泉質・湧出量を保証するものではありません。
何を当てているのか
設計書は AI で「温泉ポテンシャル」を出すことを求めています。ただし、地点ごとの泉温・湧出量・泉質の公開データはありません。温泉が「無い」ことを示すデータもありません (設計書 §33:「温泉が確認されていない場所」は「温泉が無い場所」ではない)。
そこでこのモデルが当てるのは次の問いです:P12 に登録された地点が『温泉』の分類か、温泉以外の観光資源か(負例は温泉が無い場所ではない)。 正例は観光資源データの温泉 1,320 点、負例は同じデータの温泉以外の観光資源から 都道府県ごとに同じ数を選んだ 1,320 点です。 つまりこれは「温泉が湧くか」ではなく「温泉として登録された場所がどんな地理環境にあるか」を 学んだモデルです。
合否(学習の前に書いた基準)
基準は docs/ai_preregistration.md に モデルを学習させる前に書いて積み、結果はそのファイルの SHA-256(129877d8f36b…)を持っています。 結果を見てから基準を動かしていないことを、テストが確かめます。
| ID | 基準 | 結果 | 判定 |
|---|---|---|---|
| G-22a | 最良モデルの都道府県分割 ROC-AUC ≥ 0.65 | 0.686 | 通過 |
| G-22b | 最強の 1 変数ベースラインより +0.02 以上 | +0.062 | 通過 |
| G-22c | 陰性対照の ROC-AUC が 0.45〜0.55 | 0.475 | 通過 |
3 つの基準をすべて通りました。最良は Random Forest(都道府県ごとに分けた検証で ROC-AUC 0.686)、 最も強い 1 変数は局所起伏(同 0.624)です。
3 つのモデルの比較(設計書 §31 の指標)
「都道府県分割」は、都道府県を丸ごと検証側に回した 5 分割です。近くの温泉が学習と検証の両方に入ると、 場所を覚えただけで当たったように見えるため、合否はこちらで判定します。「無作為分割」は漏れの大きさを見るための参考です。 しきい値は 0.5。
| モデル | 分割 | Accuracy | Precision | Recall | F1 | ROC-AUC | PR-AUC |
|---|---|---|---|---|---|---|---|
| Logistic Regression | 都道府県分割 | 0.622 | 0.627 | 0.602 | 0.614 | 0.650 | 0.630 |
| 無作為分割(参考) | 0.621 | 0.629 | 0.589 | 0.608 | 0.657 | 0.638 | |
| Random Forest | 都道府県分割 | 0.640 | 0.651 | 0.602 | 0.625 | 0.686 | 0.671 |
| 無作為分割(参考) | 0.664 | 0.668 | 0.650 | 0.659 | 0.717 | 0.707 | |
| XGBoost | 都道府県分割 | 0.627 | 0.630 | 0.616 | 0.623 | 0.677 | 0.665 |
| 無作為分割(参考) | 0.654 | 0.655 | 0.652 | 0.654 | 0.705 | 0.694 | |
| 定数の予測 | — | — | 0.500 | — | |||
1 変数だけのロジスティック回帰(都道府県分割の ROC-AUC)
| 局所起伏 | 0.624 | |
|---|---|---|
| 河川までの距離 | 0.620 | |
| 植生自然度 | 0.590 | |
| 傾斜 | 0.590 | |
| 標高 | 0.574 | |
| 活火山までの距離 | 0.535 | |
| 湖沼までの距離 | 0.522 |
棒は 0.5(偶然)から 1.0 までのうち、どこまで届いたかを示します。
陰性対照
都道府県の中でラベルを無作為に入れ替えて同じ手順で学習し直すと、ROC-AUC は 0.475 でした。 ラベルと地理環境の結び付きを壊すと偶然(0.5)に戻ることを確かめています。 ここが 0.5 から大きく外れていたら、手順のどこかでラベルが漏れていることになります。
何が効いているか(設計書 §35)
最良モデル(Random Forest)で、検証側の 1 列だけを無作為に入れ替えたときに ROC-AUC がどれだけ下がるか(都道府県分割の各分割で 5 回ずつの平均)。効いているのは「温泉として登録された場所」との結び付きで、温泉が湧く原因ではありません。
| 河川までの距離 | −0.080 | ±0.026 | |
|---|---|---|---|
| 局所起伏 | −0.065 | ±0.016 | |
| 植生自然度 | −0.025 | ±0.011 | |
| 傾斜 | −0.013 | ±0.007 | |
| 活火山までの距離 | −0.008 | ±0.008 | |
| 標高 | −0.008 | ±0.008 | |
| 地質の大区分 | −0.004 | ±0.006 | |
| 湖沼までの距離 | +0.004 | ±0.007 |
温泉ごとの見立て(設計書 §35)
地図で国土数値情報の温泉をクリックすると、詳細の「AI の見立て」に、その温泉についてのモデルの出力(0〜1)と、出力を押し上げた・押し下げた特徴量(SHAP の寄与)が出ます。
- 出力と寄与は、その温泉の都道府県を学習に使っていないモデルのものです。 学習に使ったモデルで説明すると、Random Forest は点を覚えて 1 に近い値を出してしまいます。 説明のために学び直したモデルの分割外 ROC-AUC は、上の合否を判定した値と一致しています。
- 出力は確率ではありません(較正していません)。設計書の例のような「存在可能性 ○%」の形では出していません。
- 寄与はすべて足すと、基準値から出力までの差にちょうどなります(SHAP の加法性。全 1,320 点で誤差 100 万分の 1 未満を確認)。
地形を画像として見る CNN(設計書 Phase 6)
設計書 §32 は「十分なデータが得られた場合のみ」CNN による画像的分類を検討するとしています。 同じ問いについて、地点を中心にした標高タイル z14 の 64 × 64 画素(相対標高・傾斜・欠測の印の 3 チャンネル。北緯 36 度で約 490 m 四方)を CNN に見せ、 表の特徴量で学んだ Random Forest(0.686)を超えるかを確かめました。 合否は docs/ai_preregistration_cnn.md に 学習の前に書いてあります(SHA-256 26cfb79116b5…)。
| ID | 基準 | 結果 | 判定 |
|---|---|---|---|
| G-25a | 画像 + 表の CNN(種 3 つの平均)が Random Forest + 0.02 以上 | 0.680 | 不通過 |
| G-25b | 画像だけの CNN(種 3 つの平均)が 0.60 以上 | 0.659 | 通過 |
| G-25c | 陰性対照が 0.45〜0.55 | 0.505 | 通過 |
| モデル | 平均 | 種 20260916 | 種 20260917 | 種 20260918 |
|---|---|---|---|---|
| 画像だけの CNN | 0.659 | 0.655 | 0.661 | 0.661 |
| 画像 + 表の CNN | 0.680 | 0.679 | 0.683 | 0.677 |
| Random Forest(表だけ) | 0.686 | — | — | — |
いずれも都道府県ごとに分けた 5 分割の分割外 ROC-AUC。30 エポック固定・調整なし。 陰性対照(都道府県の中でラベルを入れ替え)は 0.505。 取れなかった標高タイル 3 枚、欠測が半分を超える画像 37 枚。
画像 + 表の CNN は Random Forest を事前登録した幅(+0.02)で上回りませんでした。事前登録どおり、CNN はアプリに載せていません(ブラウザでの推論もしていません)。 基準を下げたり、層を足して取り直したりもしていません。 画像だけでも 0.60 を超えており、地形の形そのものには「温泉として登録された場所」と結び付く信号があります。ただし表の特徴量に画像を足しても表だけの Random Forest を超えなかったので、この形では表を超える情報は加わりませんでした。
この段でしていないこと
- 全国の「AI 温泉ポテンシャル」地図(設計書 Phase 7)は塗っていません。このモデルが当てているのは「登録のされ方」なので、全国の格子に塗ると、 その場所で温泉が得られるかのように読まれてしまいます(設計書 §36 が禁じている読まれ方です)。
- CNN(Phase 6)の学習済みの重みは配っていません。事前登録どおり、表形式のモデルを超えなかったモデルはアプリに載せず、上の数字だけを出しています。
- 断層(設計書 §52)は取り込んでいません。泉温・湧出量・泉質は地点別の公開データが無いので、特徴量にも目的変数にもしていません。
データと再現
学習に使った表:dataset.csv(2,640 行・37 都道府県)、 列の説明:dataset_dictionary.json、 結果:baselines.json。 学習はローカルで行い(設計書 §37)、この画面は結果を表示するだけです。 乱数の種 20260915、scikit-learn 1.9.1・XGBoost 3.4.1。
この結果は公開データから学習した統計モデルによる推定です。温泉の存在・泉質・湧出量を保証するものではありません。