Skip to content

fix: 再監査の指摘(区間の上限張り付き・FRE の修正遅れ・ホールドアウト・診断・★評価・最適化手法・ln ψ)に対応 - #7

Merged
zredjet merged 9 commits into
mainfrom
fix/srgm-review-2
Sep 25, 2026
Merged

zredjet merged 9 commits into
mainfrom
fix/srgm-review-2

Conversation

@zredjet

@zredjet zredjet commented Sep 25, 2026

Copy link
Copy Markdown
Owner

概要

前回の修正後の再監査で出た指摘(中程度 6 件・軽微 7 件)に対応します。項目ごとに 1 コミットで、各項目は「今のコードで失敗するテスト → 修正」で確認しました。テストは 148 → 192 件で、すべて通っています。

変更内容

指摘 対応 効果(合成データでの確認)
ブートストラップ区間の上限が探索範囲で決まる 反復ごとに a の上限張り付きを記録し、割合が上側の裾を超えたら上限を「≥」で表示して警告 推定 624 件・観測最大 238 件のデータで再推定の 1 割強が張り付くケースを検出
FRE が修正の遅れで偏る 平均修正遅れ D(指数分布)を畳み込んだ m_c に置き換え(D=0 で従来式) 3 日遅れ a +11%/b −16%、7 日遅れ a +31%/b −36% → a ±1%、b +5% 程度
ホールドアウトのしきい値が厳しすぎる 実測の増分が予測区間(Poisson + 推定の不確実性)の外かで判定 正しいモデルでの警告率 60%/41% → 3〜4%
自己相関・スコアが Pearson 残差 ランダム化分位残差に対して Ljung-Box だけで判定。歪度・尖度は標準誤差で基準化 自己相関の誤判定 28〜32% → 6.5〜9%
★ が点推定だけで決まる 発見率の信頼下限 = 累積 /(累積 + 今後発見される件数の予測区間の上限) で判定。「≥」付きや安定性「不安定」なら ☆☆☆ 真の発見率 83.5% のデータで、点推定では 24/100 に ★ 以上 → 0/100。99.97% では 96/100 が ★★★
CMA-ES の失敗・偽の収束 IPOP のやり直し、TolX/TolFun による収束判定、境界上の初期点の対処 最大 7/100 回の失敗 → 0 回
乱数シードが最適化手法に渡らない --seed を追加し、推定ごとにシードを決定的に決める 同じ入力なら同じ出力(並列のブートストラップを含む)
GWO の早期停止 停滞で止めない。最後に Nelder-Mead で仕上げる SSE で 30/30 回最適値に届かなかった → 相対差 1e-6 以内
変曲S字型の ψ ≤ 1000 ln ψ ∈ [−10, 20] で推定。変曲点 t* = lnψ/b を表示。下限は自然な境界 ψ≈3.6 万のデータで 50/50 回の張り付き → 0 回
遅延S字型+変化点のコメント 検出強度は τ で跳ぶ、に修正 —
χ² の自由度 発見数に効くパラメータだけを数え、自由度が残らなければ検定不能とする —
FRE の KS/CvM を多数決に使用 較正していない p 値は参考表示のみ —
README の χ² 3.0% 1000 データで測り直して表を更新 6.3%(KS 4.2%、CvM 4.7%)
TEF のブートストラップ・表示名 工数も再生成する。有限工数 TEF の m(∞) を「推定総工数で見つかるバグ数」と表示 —

計画から変えた点

  • ★ の信頼下限: 総数 a の信頼区間の上限で割る案は採りませんでした。a は総数の Poisson 分布の平均なので、ほぼ全件発見済みでも区間の幅が √a 程度残ります(真の発見率 99.97% でも ★ が付きませんでした)。代わりに「今後発見される件数」の予測区間の上限を使います。
  • FRE の D の初期値: 修正数データは初期値の計算に渡されないため、リトルの法則による案はやめ、1 日としました(既定の DE は探索範囲全体を探索します)。
  • TEF の工数の再生成: 尤度(累積工数の各日の誤差が独立な正規分布)と整合しますが、総工数の区間への影響は小さいです。README に注記しました。

利用者から見える変化

  • 既定で乱数シードが固定になります(以前は実行ごとに結果が変わっていました)。
  • ★ が厳しくなります。サンプルデータでは点推定 95.0% が ★☆☆ → ☆☆☆(信頼下限 84.4%)。総数が 100 件未満だと、★★★ には「今後発見される件数の上限 0 件」が必要です。
  • 変曲S字型のパラメータ名が ψ → lnψ、FRE モデルにパラメータ D が加わります。

テスト

  • dotnet test tests/BugConvergenceTool.Tests: 192 件すべて成功
  • CLI で --ci --pi -d --holdout 5 --seed 1 を 2 回実行し、出力が一致することを確認
  • --fre / --tef / --change-point / --optimizer cmaes を実行し、エラーがないことを確認

🤖 Generated with Claude Code

zredjet and others added 9 commits September 25, 2026 23:50
- OptimizerFactory.Create/AutoOptimize/MultiStartOptimize にシードを渡す口を追加(LHS の開始点も含む)
- ModelFitter は推定ごとのシードを基準シード・モデル名・データの内容から作る(並列の再推定でも実行順によらない)
- --seed を追加。未指定なら設定の Bootstrap.RandomSeed、それもなければ固定値を使い、既定で再現できるようにする

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- CMA-ES: IPOP のやり直し(λ を倍にしてランダムな点から再探索)を追加し、2回同じ値に収束したら終える。
  Converged は TolX/TolFun で止まった探索が最良解を出したときだけ true にする(停滞は収束ではなくやり直しのきっかけ)。
  境界上の初期点でシグモイドが飽和しないよう u を ±4 に丸め、共分散の分解に失敗したら単位行列に戻さずやり直す。
  収束の遅い GO データで 200 回中 9 回失敗していたのが 0 回に
- GWO: 最良値の停滞で打ち切らず、α・β・δ がそろったときだけ収束とする。
  群れは終盤まで縮みきらず精度が低いため、α から Nelder-Mead で仕上げる(SSE で 30/30 回最適値に届かなかった)
- 打ち切り時に Iterations が 1 少なくなる問題を修正

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- InflectionSModel と変化点版のパラメータを ψ ∈ [0,1000] から lnψ ∈ [-10,20] に変更(初期値 0)。
  ψ≈3.6万(変曲点 30 日)の合成データで 50/50 回上限に張り付いていたのが 0 回に
- 自然な境界の判定をモデル側の IsNaturalBound に移し、ln ψ の下限(実質的に指数型)は注意しない
- 変曲点 t* = lnψ/b を派生量(GetDerivedQuantities)として CLI・レポート・Excel に表示
- Fisher 情報行列はモデルが指定する座標(ψ)で求め、ヤコビアンで ln ψ の共分散に戻す
  (ln ψ が下限付近だと尤度がほぼ平らでヘッセ行列が特異になり、モデル平均化の分散が NaN になっていた)
- 遅延S字型+変化点のコメントを修正(τ で m(t) は連続だが検出強度は h₁(τ) から h₂(τ) へ跳ぶ)
- Template.xlsx のモデル一覧を更新

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- m_c(t) = ∫₀ᵗ η(s)·m_d'(s)·G(t-s) ds、G は平均 D 日の指数分布(D=0 で以前の m_c = η·m_d)
- 定数FRE・学習FRE・FRE+変化点にパラメータ D(平均修正遅れ、[0, 観測日数]、0 は自然な境界)を追加。
  いずれも閉形式で計算する(学習FRE の Simpson 積分も置き換え)。ロジスティックFRF は η·m_d の形ではないため変更なし
- 真値 a=200, b=0.04、40 日のバグ単位のシミュレーションで、3 日遅れ a +11%・b -16%、7 日遅れ a +31%・b -36% だった偏りが
  a ±1%・b +5% 程度に。遅れのないデータでは D ≈ 0 で、発見数だけの GO と同じ a になる

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- ParametricBootstrap が反復ごとに a の上限張り付き(合成データの探索範囲)を記録する。
  張り付いた割合が上側の裾 1-qHigh を超えると、総数・残りバグ数・収束日(と将来の m(t)・累積の上限)を「≥」で表示し、
  最終的な警告一覧にも載せる。張り付いた反復は除外しない(除くと区間が不当に狭くなる)
  例: 観測最大値 238・推定 624 件のデータで再推定の 1 割強が上限 1190 前後に張り付き、97.5% 点は探索範囲の値だった
- 区間の表示を IntervalFormatter.EstimateLine にまとめる
- TEF モデルでは工数も工数の尤度(正規分布)に従って再生成し、工数を差し替えた複製で推定し直す
  (共有のモデルを並列に書き換えない)。以前は工数を固定したため工数関数のパラメータがほとんど動かなかった
- 有限工数の TEF モデルの m(∞) の表示名を「推定総工数で見つかるバグ数」に(TotalBugsLabel)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 予測分布を Poisson(Λ)、ln Λ ~ N(ln Δ̂, s²) の混合とし(s は訓練区間の Fisher 情報行列とデルタ法、τ は固定)、
  実測の期間発見数が 95% 予測区間の外なら警告する。区間は CLI・レポート・Excel に表示する
- 相対誤差 30%・60% の固定しきい値による警告を廃止。正しいモデル(GO データに GO)で
  末尾 5 日 60%・10 日 41% に出ていた警告が 3〜4% に。遅延S字データに GO を当てはめると 10 日で 72% を区間外と判定
- 他モデルとの比較・AIC 最良モデルとの比較の警告は、そのモデル自身が区間外のときだけ出す
- Fisher 情報行列の計算で一部のパラメータ(変化点 τ)を固定できるようにする

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 自己相関検定をランダム化分位残差に対して行い、Ljung-Box 検定だけで判定する(DW・各ラグの ACF は参考表示)。
  以前は Pearson 残差に DW 帯・Ljung-Box・10 ラグの個別判定の OR をとり、正しいモデルでも 28〜32% を自己相関ありとしていた → 6.5〜9%
- スコアの系統的パターン・外れ値(|r|>3)・歪度・尖度をランダム化分位残差で判定し、歪度・尖度は標準誤差の何倍かで減点する
  (Pearson 残差では正しいモデルでも |歪度|>0.5 が 5〜8 割)
- χ² 検定の自由度を「ビン数 − 発見数の m(t) に効くパラメータ数」にし(FRE の η・D を数えない)、
  自由度が残らなければ検定できないとする(以前は Max(1, B−k) で自由度 1 をでっち上げていた)
- ブートストラップで較正していない KS・CvM(FRE モデルなど)は参考表示にとどめ、適合性の判定に使わない
- README の検定の大きさ・検出力の表を 1000 データで測り直す(χ² の正しいモデルでの棄却率は 3.0% ではなく 6.3%)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 信頼下限 = 累積発見数 / (累積発見数 + 今後発見される件数の予測区間の上限)。点推定の発見率も並べて表示する
- 予測区間は --ci/--pi のブートストラップがあればその予測区間、なければ Fisher 情報行列(τ は固定)と
  Poisson・対数正規の混合で求める(安いので常に計算)。FRE・TEF・SSE では点推定で判定し、その旨を表示
- 今後発見される件数の上限が探索範囲で決まっている(≥)場合と、安定性分析が「不安定」の場合は ☆☆☆ 止まり
- 総数 a の信頼区間の上限で割らないのは、a が総数の Poisson 分布の平均で、ほぼ全件発見済みでも幅が √a 程度残るため
  (真の発見率 99.97% のデータで信頼下限が 86% 程度になり ★ が付かなかった)
- 真の発見率 83.5%(a=60)のデータ 100 セットで、点推定では 24 セットに ★☆☆ 以上が付いていたのが 0 に。
  真の発見率 99.97%(a=150)では 96 セットが ★★★

Co-Authored-By: Claude Opus 5.5 <[email protected]>
--seed、CMA-ES の IPOP・GWO の仕上げ、変曲S字型の ln ψ、FRE の修正遅れ D、区間の「≥」表示、
TEF の工数の再生成と表示名、ホールドアウトの予測区間による判定、統計診断の変更、★ 評価の信頼下限による判定と出力例

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@zredjet
zredjet merged commit 28f192d into main Sep 25, 2026
2 checks passed
@zredjet
zredjet deleted the fix/srgm-review-2 branch September 25, 2026 15:39
zredjet added a commit that referenced this pull request Sep 25, 2026
fix: PR #7 のコードレビューで見つかった問題を修正
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant