候補のモデルが二つあるとき、それぞれ別々にCVを回して平均誤差を比べたくなります。ところが、分割を別々に作ると、成績の差に分割の偶然が加わり、どちらが優れているのかが見えにくくなります。
同じ問題は、評価が終わった後にも残ります。外側の成績を見てから勝ったモデルを選べば、その選択自体が外側のデータを使った操作であり、最終的に全データで学習し直したモデルは、CVで測ったどのモデルとも同じではありません。
そのため、この記事では、複数モデルの比較、最終モデルを全データで学習する工程、外部検証との違い、そして論文の方法と結果に何を書くかを扱います。指標の選び方は、AUCと較正と打ち切りで扱いました。
複数のモデルを比べる時の対応
LASSO、Ridge、Elastic Netを比べる場合、モデルごとに異なる分割を使うと、学習方法の違いに加えて、評価対象者の難しさの違いも結果へ入ります。そのため、原則として同じ外側分割を使い、同じ対象者に対する学習外予測を比較します。
そのうえで、内側の探索にかける条件も揃えます。一方の方法だけ多数の設定を試した場合には、比較しているのは単純なアルゴリズム名だけではなく、探索範囲や選択手順の違いまで含んだ結果になります。
ここで、対象者$i$について、モデルAとBの学習外予測を$\widehat y_i^{A},\widehat y_i^{B}$とすると、平均損失の差は次のように書けます。
$$\widehat\Delta = \frac{1}{n}\sum_{i=1}^{n}\left\{L(y_i,\widehat y_i^{A}) – L(y_i,\widehat y_i^{B})\right\} \tag{1}$$
式(1)は、同じ対象者で二つのモデルの誤差を比べ、その差を平均しています。損失が小さい方を良いとする定義では、負の値はモデルAの平均損失が小さいことに対応します。
対応を取っても独立にはならない比較
このように同じ対象者で比べることで、対象者ごとの難しさを揃えられます。ただし、その誤差差を独立な値とみなして通常のt検定を行うと、CVで学習データを共有していることを無視する場合があります。
同様に、全ての学習外予測から求めたAUC差へ、固定された二つのスコアを比較するための方法をそのまま当てはめてよいとは限らず、モデルの学習、設定選択、評価指標の集約方法まで含めて、不確実性を扱う必要があります。
なお、後半のR例では、二つの線形回帰モデルを同じ10分割で比較します。式(1)は比較対象の定義を説明するもので、LASSO、Ridge、Elastic Netのいずれかが他より優れていると主張するものではありません。
外側の成績から勝者を選ぶ場合
複数のモデルをそれぞれネストしたCVで評価しても、外側の成績が最も良かったモデルだけを選び、その値を選択後の最終性能として報告すれば、さらに一段階の選択が入ります。そこで、外側で比較する全候補を学習手順の内側で選ぶ構成にするか、比較を探索的と明記して選択した手順を別の評価データで確認するかを決めますが、外側という名前が付いているだけで、その成績を何度でも選択に使えるわけではありません。
同じ分割で差を取る
300人と60個のマーカーを使い、アウトカムに関係するのは最初の3個だけという設定で、2種類のモデルを比べます。一つは3個だけを使うモデル、もう一つは60個すべてを入れるモデルとし、同じ10分割を両方に使って分割ごとの差を取りました。
set.seed(42)
markers <- matrix(rnorm(300 * 60), nrow = 300, ncol = 60)
colnames(markers) <- paste0("marker", seq_len(60))
outcome <- 10 + 2 * markers[, 1] - 1.5 * markers[, 2] + markers[, 3] + rnorm(300, sd = 3)
study <- data.frame(outcome = outcome, markers)
fold_id <- sample(rep(seq_len(10), length.out = 300))
fold_rmse <- function(formula) sapply(seq_len(10), FUN = function(k) {
train <- fold_id != k
sqrt(mean((study$outcome[!train] -
predict(lm(formula, data = study[train, ]), newdata = study[!train, ]))^2))
})
compact <- fold_rmse(outcome ~ marker1 + marker2 + marker3)
full <- fold_rmse(outcome ~ .)
round(c(compact = mean(compact), full = mean(full),
paired_mean = mean(full - compact), paired_sd = sd(full - compact)), 3)
#> compact full paired_mean paired_sd
#> 3.003 3.503 0.500 0.246
結果として、3個のモデルの平均RMSEは3.003、60個のモデルは3.503で、差の平均は0.500でした。同じ分割で差を取っているため、分割ごとの難しさのうち両モデルに共通する変動の一部を相殺できます。

ただし、差の標準偏差0.246を10の平方根で割って標準誤差とし、通常の$t$検定へ渡すことはしません。10個の差は同じ300人から作られていて、独立な10回の比較ではないためです。
最終モデルを全データで学習する工程
正則化モデルでは、外側CVの予測を作った後に、全データで改めてCVを使って正則化の$\lambda$を選び、その設定で最終モデルを学習することがあります。この最終チューニングは、外側の性能を計算するための処理とは分けて考えます。
ただし、全データで最終モデルを作り直すこと自体は、外側の評価対象者の予測へ後から情報を戻す操作ではありません。外側の予測をそのまま保存し、評価した学習手順と同じ規則で最終モデルを作る構成です。
この区別は、予測モデルの検証でも扱っています。SteyerbergとHarrellは内部検証、内部–外部検証、外部検証を区別し、開発データを使った最終モデルの作成とその後の検証を論じており、最終モデルに全データを使うことと、見かけの性能を最終評価として報告することは分けて考える必要があります。
最終的に保存する予測の仕様
ここで、使用する変数、単位、カテゴリの対応、欠測処理、標準化の基準、予測の計算方法まで保存する必要があります。
また、新しいカテゴリや、学習時に見なかった測定範囲に遭遇した場合の扱いも定めます。これらを評価データに合わせてその都度変えるなら、固定したモデルの評価ではなく、更新を含む手順の評価になります。
そして、外側CVから得た複数のモデルを平均して使う場合には、全データで一つのモデルを作り直す場合とは別の最終仕様です。そのため、どちらを選んだかをモデルの保存形式と方法の文章に一致させます。
外部検証と運用先の違い
ランダムCVは、主として手元のデータと同じ分布に近い対象者への性能を調べる内部検証です。そのため、別施設、別の時期、異なる測定方法、異なる患者構成への性能まで自動的に保証するものではありません。
また、独立した外部検証で良い成績が得られても、その後に対象集団や診療記録の作られ方が変われば、予測性能は変わり得ます。したがって、CVの回数を増やすことと、実際の運用先の情報を得ることは異なる作業です。
少数データの固定分割
小さいデータを学習用と最終テスト用へ一度だけ分けると、学習側と評価側の両方で情報が少なくなる場合があります。そのため、常に一定割合をテスト用として確保すれば十分という一律の規則は推奨しません。
一方、十分な評価人数を持つ独立したテスト集合を確保でき、開発中にその結果を見ない運用ができるなら、役割の分離が明確になります。その場合は、データ量、独立した対象者や施設の数、チューニングの範囲を考えて、再標本化と固定テストの構成を決めます。
なお、テスト集合の結果を受けてモデルを更新した場合には、その集合を更新にも使ったことを記録します。名称をテスト集合のまま残していても、実際に果たした役割は変わっています。
予測性能と臨床的な利用価値
そして、RMSEやAUCの改善だけでは、その予測を使うことが患者の利益につながるかまでは分かりません。どの判断で使うのか、誤予測にどのような不利益があるのか、どの閾値で行動するのかまで別に考える必要があります。
そのため、臨床的な判断をCVの数値から直接決めることは避けます。モデルの性能を評価する研究と、そのモデルの利用が判断やアウトカムへ与える影響を評価する研究は、異なる研究目的を扱っています。
論文に残す評価手順
TRIPOD+AIは、回帰モデルと機械学習による臨床予測モデルの報告を対象にした指針です。CVを行ったという一文だけでは読者がその性能の根拠を追えないため、データの役割、学習手順、評価方法を再現できる記述が必要になります。
たとえば、LASSOを外側5分割・内側5分割のネストしたCVで評価する例なら、300人と60個の候補変数を含むランダムに生成したデータセットを用いたことまで方法に書きます。さらに、正則化係数を0.01から10までの60候補から選び、内側の平均二乗誤差が最小となる設定を採用したことを続けます。
続けて、各外側学習集合は240人、評価集合は60人で、標準化は各学習時に行ったことを記載します。また、外側評価集合の情報は前処理、正則化係数の選択、係数推定へ使用せず、全ての学習外予測の二乗誤差を平均した後に平方根を取ってRMSEを求めたことも明記します。
結果の記述と限界
たとえば、見かけのRMSEが2.998、外側CVのRMSEが3.115で、外側分割ごとのRMSEが2.926から3.314だった場合は、そのまま結果として記述できます。ただし、分割間の範囲を95%信頼区間とは呼ばず、分割間の成績の違いとして扱います。
また、この数値例では患者内の反復測定、施設差、時間的な分布変化、欠測、二値アウトカム、生存時間の打ち切りを含めていません。そのため、それらに関する本文の説明は研究デザインと文献に基づくもので、このR例から直接確認した結果ではありません。
そのうえで、乱数の初期値だけでなく、対象者の分割割り当て、ソフトウェアとバージョン、探索した候補、失敗した学習の扱いも保存します。結果の悪かった分割や計算できなかった指標を除いて平均する場合には、何を除いたかと、その理由が読者に分かる記述が必要です。
自分の研究へ移す際の設計
そして、実際のデータでは、どの患者を新しい対象者として予測したいかを定めると、分割単位、利用できる情報、前処理の位置が具体的になります。また、MICEや施設差を含む場合には、予測の計算だけでなく、評価時に同じ手順を再現できるかまで確かめることになります。
そのうえで、患者単位の分割と施設単位の分割のどちらが研究目的に合うか、補完をどの階層へ入れるか、選択後の性能をどう報告するかなど、解析方針の設計が必要になる場合があります。こうした解析方針については、Dr.データサイエンスでご相談いただけます。
書き残すもので手順が決まる
方法に書く項目を先に並べておくと、解析の設計そのものが決まります。分割の単位、分割数、内側で選んだもの、前処理をどこで学習したか、指標、乱数シードは、書こうとした時点で決めていなければ記載できません。
そのため、私ならCVを回す前にこの一覧を文章として書き、そこから外れる操作が出てきたら手順の方を直します。結果を見てから書き方を考えると、どこまでが事前の計画だったかが自分でも分からなくなるためです。
参考文献
- Collins GS, Moons KGM, Dhiman P, Riley RD, Beam AL, Van Calster B, et al. TRIPOD+AI statement: updated guidance for reporting clinical prediction models that use regression or machine learning methods. BMJ. 2024;385:e078378.
- Steyerberg EW, Harrell FE Jr. Prediction models need appropriate internal, internal-external, and external validation. Journal of Clinical Epidemiology. 2016;69:245-247.
- Bengio Y, Grandvalet Y. No unbiased estimator of the variance of K-fold cross-validation. Journal of Machine Learning Research. 2004;5:1089-1105.
- Cawley GC, Talbot NLC. On over-fitting in model selection and subsequent selection bias in performance evaluation. Journal of Machine Learning Research. 2010;11:2079-2107.
- Bates S, Hastie T, Tibshirani R. Cross-validation: what does it estimate and how well does it do it? Journal of the American Statistical Association. 2024;119(546):1434-1445.


