evaluate-ml-pipeline について
evaluate-ml-pipelineは、データサイエンティスト向けに、skoreで単一の学習器を評価してレポートを保存する手順を定めるスキルです。同意、分割器や指標、チェック、レポート保存を扱います。
主な機能
- 01skore.evaluateを1回実行
- 02宣言済みの分割器とスコアを再利用
- 03レポートのチェック結果を集計
- 04Project.putでレポートを保存
- 05local、hub、mlflowモードに対応
活用シーン
- 01確定済みMLパイプラインの評価
- 02事前学習済みモデルのテスト表での採点
- 03評価結果とチェックの保存
- 04レポート保存モードの選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ probabl-ai/ skore-skills --skill evaluate-ml-pipelineインストール後、Claude Code で/evaluate-ml-pipelineを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/custom-checks.mdcustom-metrics.mdg_skore_mode.mdmetadata-routing.mdreports.mdskrub_interop.mdtemplates/materialize.py詳細
ML パイプラインを評価する
1 つの学習器をスコアリングし、レポートを保存します。パイプライン、分割器、およびデフォルト以外のスコアは、すでに宣言されています。
skore.evaluate がエントリーポイントです。cross_val_score、cross_validate、classification_report、またはメトリクスの出力を独自に実装しないでください。
SkrubLearner は sklearn の fit(X, y) を実装していません。
cross_val_score はエラーになります。skore.evaluate(learner, data={...}) を呼び出し、translation.splitter が prefit の場合を除き、splitter= を省略してください。
ユーザー向けの文章
詳細:setup-workspace references/human_facing_prose.md。
実験の Markdown と # コメントでは、この評価について説明します。
質問と締めくくりでは、スキル ID、G-* 名、ラッパー CLI ではなく、データサイエンスの言葉を使います。
`` はサイトマーカーです。
手順
python -m skore_skills status。status.setup.pendingが空でなく、status.skills.setup-ml-projectが true の場合は、setup-ml-projectを読み込み、停止します。このスキルを 開始してはいけません。スキルから戻ったら続行します。このターンでは 再度読み込まないでください。そのスキルがインストールされていない場合は、 保留中の項目を1行で示して停止します。git init、scaffold、またはenv initをでっち上げてはいけません。status.setup.envまたはstatus.setup.workspaceがdeclinedの場合は、1行で停止します。gitまたはeditableがdeclinedの場合は、再度尋ねずに続行します。 次に--reviseを付けずにpython -m skore_skills frame showを実行します。status.modeling_decisionsがlockedでない場合は、draftを含め、model-ml-pipelineに戻って停止します。 同意やストレージモードを尋ねたり、プレビューであってもskore.evaluateの呼び出しを表示したりしてはいけません。proceed以外の場合はframe-ml-problemを読み込んで停止します。translationが null の場合は停止します。評価呼び出しを記述してはいけません。- 履歴に依存するパイプライン(後方シフト、ラグ、ローリング
ウィンドウ、ターゲットシフト、または履歴データを持つテーブルとの結合):
tests/smoke/test_<stem>.pyが存在しない場合、または pytest が失敗した場合は、 停止して build に戻ります(§ Back to build)。skore.evaluateを 記述してはいけません。履歴依存のステップがない場合に限り、 文書に n/a と記載できます。 python -m skore_skills evaluate consent --stem <stem>。askであり、このターンにbuild-ml-pipelineの Evaluate にまだ回答していない場合は、JSON のcontextを引用し、 Evaluate(推奨)/Modify/Stop を提示します。停止します。 初回の実行で「評価を実行する」と言うことは同意ではありません。- ユーザーがこのターンにすでに Evaluate と回答した場合、
または JSON が
proceedの場合(実際のロケーターがすでに存在します): 続行します。 stop— スモークテストファイルがありません。build に戻ります (§ Back to build)。
- G-SKORE-MODE。
status.policy.skore_modeを読みます。すでに設定されている場合は、 その設定を維持します。未設定の場合は local(推奨)/hub/mlflow を尋ねてから、python -m skore_skills policy set skore_mode <mode>を実行します。local:mkdir reportsを実行します (exist_ok)。reports/README.mdを記述してはいけません。hub または mlflow:reports/を作成してはいけません。次に、 インストールされている場合はadd-python-packageを読み込みます。 このスキルはenv add-skore --mode <mode> --executeを実行します。 ここでskore[...]と書いてはいけません。ここでenv addを 実行してはいけません。コンストラクターについてはreferences/g_skore_mode.mdを参照してください。モードの切り替えや 移行の際は、そのスキルがインストールされていればsync-ml-reportsを読み込みます。 - Pre-flight を出力し、続けて1~3文で説明します。これは、ロック済みの方式、
レポートメトリクス、skore のチェック、
project.putを使った ローカルでの全データセット評価です。チェックはこの実行で計算され、 レポートとともに保存されます。translation.splitterがprefitの場合は、 モデルを学習テーブルで学習し、提供されたテストテーブルでスコアを 算出すると伝えます。stem、判明している場合は fold 数、experiments/<stem>.py、およびscratch/results/<stem>/を明記します。 所要時間は行数、fold 数、学習器、チェックによって異なります。 分数をでっち上げてはいけません。同意がまだ保留中の場合は、 プレビューを表示して停止します。 - 呼び出しは
experiments/NN_*.pyのみに記述します。以下の呼び出し形式を 参照してください。編集後にpython -m skore_skills styleを実行します。 実験はreport.checks.summarize()、project.put、および単独のreportで終了します。このファイルを 実行してはいけません。 templates/materialize.pyをscratch/results/<stem>/materialize.pyにコピーします。Project の初期化を 置き換えます。<CALL>ブロックを、引数と順序が同じ実験呼び出しに 置き換えます。このファイルをenv verifyで確認した composed-dev Python で 1回実行します。これが唯一のskore.evaluate呼び出しであり、 唯一のproject.putです。id.txtを読み取り、ロケーターを作成してlocator.txtに書き込みます。policy.notebooksがtrueの場合は、python -m skore_skills notebook fill experiments/<stem>.pyを実行し、policy.siteもtrueの場合に限り--htmlを追加します。 実験をnotebook convertしてはいけません。また、実験ファイルを 実行してはいけません。notebooks がnullまたはfalseの場合は、 ポリシーを変更せず、fill も実行しません。policy.siteがtrueで、export-ml-siteがインストールされている場合は、ロケーターの作成後、 監査/レビュー、または別のユーザー確認の前にpython -m skore_skills site build --if-staleを実行します。 これにより結果ビューアーをただちに公開できます。record-outcome 後の クローズ時ビルドの代わりにはなりません。その後、ターンを終了します。 実験ファイルに materialize の書き込みを追加してはいけません。 すべての Python プローブはscratch/<ts>_<short>.pyに保存し、env verifyの composed-dev Python で実行します。インラインのpython -cは使いません。ユーザーから依頼されない限り、warnings.filterwarningsは使いません。確認できていないシグネチャは 書きません。そのプローブの末尾にはBLOCKED: <class> signature needs an API lookup that cannot run this turn (<why>).と記載します。キャッシュにあれば、参照確認済みとして扱います。
呼び出し
experiments/NN_*.py の skore.evaluate を使います。
translation.splitter が prefit でない限り、splitter= は省略して
skore に DataOp の cv と split_kwargs を再利用させます。それ以外の
splitter= を渡すと、split_kwargs は破棄されます。DataOp に cv が
設定されていない状態で splitter= を省略すると、80/20 のホールドアウト
になります。これは translation.report が EstimatorReport で、
translation.splitter が null の場合に限り正しい設定です。配線方法:
references/metadata-routing.md。
translation.splitter が prefit の場合は、トレーニングテーブルだけで
学習してから、テストテーブルをスコアリングします。fit と evaluate を
api get で確認します。トレーニングテーブルを evaluate に渡しては
いけません。この場合に splitter= を省略すると、テストテーブルが新たに
80/20 に分割されます。2 つのテーブルを連結してはいけません。
learner = build_learner()
fitted = learner.fit({"table": train_df})
report = skore.evaluate(
fitted,
data={"table": test_df},
splitter="prefit",
)
fit が (X, y) を取る推定器にも、同じルールが適用されます。
fitted_model = LogisticRegression().fit(X_train, y_train)
report = skore.evaluate(
fitted_model, X_test, y_test, splitter="prefit"
)
X / y と data は同時に指定できません。
SkrubLearner—skore.evaluate(learner, data={...})。キーはskrub.varの名前です。相互運用:references/skrub_interop.md。fitが(X, y)を取る推定器 —skore.evaluate(estimator, X, y)。固定済みのcvがすでに評価方式に なっている場合は、ここでもsplitter=を省略します。上記の prefit の 呼び出しは例外です。推定器はすでに学習済みで、Xとyは テストテーブルです。
mark_as_X の cv は、KFold、GroupKFold、または build で使う
日付ベースのクラスです。translation で cv が指定されていて、
マーカーには設定されていない場合は、build に戻ってください
(§ build に戻る)。ここでは split_kwargs を設定しません。
split_kwargs が空で、グループ列が存在する可能性がある場合は、build に
戻ってください。デフォルトで KFold を使ってはいけません。
translation.splitter の prefit は、マーカーの cv ではありません。
クラスの不均衡に Stratified* を使ってはいけません。fold 間の分散が
圧縮されます。
主要な指標は translation.metric です。build-ml-pipeline の skore
デフォルトリストにある名前はスコアラー不要です。ただし、
multioutput-regression は例外です。デフォルトの回帰指標は出力ごとに
計算されるため、固定済みの集約指標がすでに
.skb.with_scoring(...) になっている必要があります。それ以外の名前は
すべて、予測 DataOp 上ですでに .skb.with_scoring(...) になっている
必要があります。そうでなければ、skore.evaluate の前に build に
戻ってください(§ build に戻る)。report.metrics.add は呼び出しません。
スコアラーを設定すると、その名前は
report.metrics.summarize().frame() の行になります。
multioutput-regression の場合、このフレームには出力ごとに 1 行も
含まれます。実験ファイルでこれらの行を平均して消してはいけません。
締めくくりでは固定済みの集約指標を引用してもかまいませんが、出力ごとの
行は保存されたレポートに残します。skore.evaluate に scoring= 引数は
ありません(references/custom-metrics.md)。名前が設定済みなのに、
そのフレームにまだ表示されない場合は、予測器クラスが間違っています。
ミックスインを継承してから BaseEstimator を継承する必要があります
(先に RegressorMixin または ClassifierMixin)。build に戻ってください
(§ build に戻る)。BaseEstimator だけを継承する場合も、
ミックスインより先に BaseEstimator を継承する場合も、どちらも失敗します。
固定後にユーザーから追加のチェックを依頼された場合:
references/custom-checks.md。experiments/NN_*.py のモジュールレベルで
skore.Check をサブクラス化し、evaluate の後、summarize の前に
report.checks.add(...) を呼び出します。add は SKD のチェックを拡張します。
チェックを作り上げてはいけません。audit/ から登録してはいけません。
Check と checks.add を api get で確認します。
すべての評価では、evaluate の後、および checks.add を行った場合は
その後に、引数なしで report.checks.summarize() を呼び出してから
project.put を呼び出します。これによりチェック結果がレポートに保存されます。
fast_mode や ignore を渡してはいけません。checks.summarize を
api get で確認します。
report = skore.evaluate(...)
report.checks.summarize()
project.put(STEM, report)
report
ディスパッチャーの粒度が粗すぎる場合に限り、evaluate より詳細なレポートを使用します
(references/reports.md)。単一のホールドアウト適合には
EstimatorReport、フォールドごとのアーティファクトには
CrossValidationReport を使用します。ホールドアウトでは
EstimatorReport を使用します。このループでは、単一の学習器に対して
skore.evaluate を1回、report.checks.summarize() を1回、
project.put を1回実行してスコアを評価します。
履歴に依存する特徴量を含むパイプラインでは、CVは必要ですが、それだけでは不十分です。
skore.evaluate は1つの env-dict を使ってグラフを一度だけ具体化し、インデックスを分割します。
スモークテストでは、予測時に新しい env-dict を使用します。呼び出し元がステータスを
done に変更する前に、スモークテストに合格する必要があります。このスキルから
JOURNAL.md の History または設計メモの Status を done に変更しないでください。
人間が作成する実験ファイルには skore.evaluate(...) と
project.put(...) が含まれますが、実行はされません。同じ呼び出しを
scratch/results/<stem>/materialize.py にコピーし、実行するのはこのファイルだけにします。
そのため、project.put は一度だけ実行されます。監査ファイル、スクラッチプローブ、または実験ファイルに対する
notebook convert で、これらを呼び出してはいけません。保存済みレポートは
project.summarize() の後に project.get(id) で読み込みます。get は
idを指定して取得するため、get(key) は KeyError を発生させます。その問題を取り繕うために
evaluate を再実行しないでください。
skore が標準で描画しないプロットを作成する場合は、そのスキルがインストールされていれば
plot-ml-figure を読み込みます。
put の後
Project.put は None を返します。materialize.py は、そのキーに対する最新の
idを scratch/results/<stem>/id.txt に書き込みます。そのidからロケーターを1つ作成し、
loop locator と loop artifacts の前に locator.txt に書き込みます。
これらの書き込みを experiments/<stem>.py に入れないでください。
python -m skore_skills loop locator --stem <stem> を実行し、JSON の locator を
そのまま貼り付けます。ロケーターがない場合は、
n/a — backend did not expose a locator とします。
- local —
local workspace: [reports/](../reports/) · id: <id>とreports/の絶対パスを記載します。非公開ファイルへのリンクは作成しないでください。 - hub — 正確な
Consult your report at …URLを使用します:[Open report](<url>) · hub · id: <id>。Skore がURLを出力しない場合は、 プロジェクトのランディングページにOpen projectとしてリンクします。 - mlflow —
View run …URLがある場合は、それをそのまま使用します。URLがなく、tracking_uriが HTTP(S) の場合は、/#/experiments/<experiment-id>/runs/<run-id>を使用します。file:、sqlite:、databricks、またはURLが出力されないその他の URI の場合は、mlflow · tracking: <uri> · experiment: <id> · run: <run-id>とします。ブラウザーリンクを推測して作成しないでください。
スクリプトは report._repr_html_() を
scratch/results/<stem>/report.html に、repr(report) を
report.txt、checks.html、metrics.html に書き込みます。メモリ内の学習器から
Method ビューアーを再生成します。
EstimatorReport では report.estimator_、
CrossValidationReport では report.reports_[0].estimator_ を使用します。
SkrubLearner は DataOp を learner.data_op に格納します。スクリプトは
learner.data_op.skb から draw_graph().svg を使って pipeline.svg を書き込み、
DataOp レポートを
scratch/results/<stem>/pipeline/ に
report(eval=False, open=False, overwrite=True, output_dir=...) を使って書き込みます。
environment は使用しません。
これは適合を行いません。full_report を呼び出さないでください。また、
eval=False を指定せずに report を呼び出さないでください。
skrub に対して add-python-package を1回再試行した後も Graphviz が失敗する場合は、
エラー名を1行で記載します。
ターン終了時
model-ml-pipeline がこのターンをディスパッチした場合は、JSON
locator を渡し、上記のライブ実行とチェックポイントの
プレビュー後に戻ります。終了時の loop notebooks、
loop artifacts、監査、record-outcome、別のサイトビルド、
git end-turn は実行しないでください。
それ以外の場合、このスキルが終了処理を担当します。まず
python -m skore_skills loop artifacts --stem <stem> を実行します。
stop / evaluate_incomplete → 不足しているファイル名を示し、
監査は実行しないでください。audit → インストールされている場合は
audit-ml-pipeline を読み込みます。
record → 監査をスキップします。record はそのコマンドのアクションであり、
ノートブックのゲートではありません。監査スキル内で変換しないでください。
次の順序で実行してください。順序を入れ替えないでください。loop notebooks は
skip の場合のみ続行します。
python -m skore_skills loop notebooks --stem <stem>を実行します。JSON のactionを正式な判断基準として扱ってください。actionがconvertの間は、 record-outcome、site build、git end-turnを実行しないでください。not_evaluatedは変換しません。convertの場合、experiments/またはaudit/のすべてのエントリーに対してpython -m skore_skills notebook fill <source>を実行し、htmlが true の場合は--htmlを付けます。これらのファイルにnotebook convertを実行しないでください。Fill はputを実行しません。 現在のアーティファクトを書き込んだ実行以降に人間による呼び出しが変更された場合に限り、 先にmaterialize.pyを再実行してください。audit/<stem>.pyのみを fill しても終了処理にはなりません。未フィットスナップショットの禁止は適用されません。skore.evaluateを含む場合でも、実験スクリプトを fill してください。actionがskipになるまで手順 1 を繰り返します。jupytext / nbformat / nbconvert が不足している場合は、add-python-packageを指定する一行だけを返します。- 手順 1 が
skipになった場合に限り、site build の前に record-outcome を実行します。 監査を実行した場合は、そのスキルがインストールされていれば、監査の digest と G-AUDIT-FINDING をmanage-ml-backlogに渡します。実験スクリプトが変換された場合は、 手順 2 のlocatorも渡してください。 監査を実行しなかった場合は、そのlocatorと、ユーザーが指定した見出しがあればそれ、 およびn/a — audit not runを使って record-outcome を呼び出します。 backlog スキルが不足している場合は、一行だけ返します。ここでは History を書かないでください。 smoke が赤の間は、決してdoneにしないでください。 policy.siteが true で、export-ml-siteがインストールされている場合に限り、site buildを実行します:python -m skore_skills site build --if-stale。これはaudit/<stem>.nb.htmlを## Notebooksの下に埋め込みます。 `` を追加しないでください。site buildがmkdocs-material is requiredでエラーになった場合は、mkdocs-materialのadd-python-package(agent)を読み込み、もう一度ビルドします。pixi add/uv addは実行しないでください。ビルドエラーを示しますが、 ターンを失敗扱いにはしないでください。- 以下のチェックポイント。
policy.siteが true で、チェックポイントのビルドが成功した場合は、 ウェブサイトが更新されたことを伝え、その出力のfile://行をそのまま貼り付けます。 design-note の Markdown には言及しないでください。サイトをビルドしなかった場合は、 更新されたと主張せず、Markdown にも言及しないでください。 python -m skore_skills git end-turn --stage evaluateを実行します。JSON のactionがinvokeの場合は、インストールされていればpersist-ml-gitを読み込み、 停止します。それ以外の場合は、インストールされていればtriage-ml-taskを読み込みます。 ここでgit commitを実行しないでください。
チェックポイント
単独で記述します。見出しに、または監査をスキップした場合は report.txt に基づいて、
結果を 2~6 文で述べます。監査を実行した場合は、その Checks と Metrics に基づいて説明します。
指標を捏造しないでください。
リンク:policy.site が true でビルドが成功した場合は、ウェブサイトが更新されたことを伝え、
その出力の file:// 行をそのまま貼り付けます。
html/<stem>.html や journal/<stem>.md には言及しないでください。
サイトをビルドしなかった場合は、更新されたと主張せず、Markdown にも言及しないでください。
説明文の後に続けるトークン:まず JSON locator、次に G-AUDIT-FINDING
(監査をスキップした場合は n/a — audit not run)。
build に戻る
cv がない、スコアラーがない、予測器クラスが誤っている、またはスモークテストがないか失敗している場合は、build-ml-pipeline で修正するパイプラインの問題です。ここに至った経緯は、このスキルを読み込んだ経路によって異なります。
- ディスパッチ経由 — 今回のターンで
model-ml-pipelineまたはbuild-ml-pipelineがこのスキルを読み込んだ場合:ここで止め、そのループに戻ってください。修正のために build に戻ります。 - 直接開始 — ユーザーが評価を依頼した場合、またはエントリースキルがここに振り分けた場合:
status.skills.model-ml-pipelineが true ならmodel-ml-pipelineを読み込み、ステム名を伝えてください。承認済みの設計を再開し、build が宣言するモデルのティアで修正のために build に戻ります。ここからbuild-ml-pipelineを読み込まないでください。このスキルが読み込むサブステップは、このスキル自身のティア以下で動作します。model-ml-pipelineがない場合は、パイプラインには build での修正が必要だと1行で伝え、そこで終了してください。
どちらの場合も、このターンでは skore.evaluate を記述しないでください。
停止条件
- セットアップが保留中(
status.setup.pendingが空でない)→setup-ml-projectを読み込みます。拒否されたgitを再度尋ねないでください。環境またはワークスペースを拒否された場合は停止します。 - 履歴に依存するパイプラインでスモークテストがない、または失敗している → build に戻ります(§ build に戻る)。
split_kwargsが空で、グループ列の可能性がある → build に戻ります(§ build に戻る)。デフォルトでKFoldを使用しないでください。import skoreが失敗する → 未設定の場合は G-SKORE-MODE を設定し、その後add-python-packageを読み込みます。cross_val_scoreに切り替えないでください。- ハイパーパラメーター検索、サービング、複数実行のトラッキングは対象外です。
- 不足しているパッケージがインストール済みの場合は、
add-python-packageを読み込みます。ここではenv addを実行しないでください。
事前確認 — コードより先に出力
Pre-flight (evaluate-ml-pipeline):
- [ ] sklearn, skrub, skore import
- [ ] frame show is proceed; DataOp cv matches translation
(or holdout / prefit, and the marker has no cv)
- [ ] skore_mode is set (local | hub | mlflow)
- [ ] evaluate consent is proceed, or the user answered Evaluate
- [ ] Call site is experiments/NN_*.py (not executed)
- [ ] The one run is scratch/results/<stem>/materialize.py
(not cells in the experiment file)
- [ ] skore.evaluate omits splitter=
(or splitter="prefit" and only the test table is passed)
- [ ] report.checks.summarize() then project.put
(no fast_mode, no ignore; after any checks.add)
- [ ] Smoke: passing | n/a (no history-dependent step) | STOP
参照資料
references/metadata-routing.md— ロック済みのcvは DataOp に残し、evaluate ではsplitter=を省略します。references/skrub_interop.md— 環境辞書と(X, y)の使い分け。references/g_skore_mode.md— Project のコンストラクター。references/reports.md—evaluateでは大まかすぎる場合。references/custom-metrics.md—with_scoringを使ったデフォルト以外の指標。references/custom-checks.md— ユーザーが依頼したチェック。templates/materialize.py— 唯一の評価実行。scratch/results/<stem>/materialize.pyにコピーします。