Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Produce or audit a radiomics / tabular clinical-ML study — imaging or clinical features → any classical learner (penalised logistic [LASSO / ridge / elastic-net], SVM, k-NN, naive Bayes, LDA/QDA, decision tree, random forest, gradient boosting [XGBoost / LightGBM / CatBoost], shallow MLP, stacked ensembles) → a clinical outcome — so it clears the rigor bar reviewers expect: nested cross-validation (tuning never on the reported folds), dimensionality control for the features-far-exceed-events reg
.claude/skills/aperivue-radiomics-ml/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -21% | 0% |
Radiomics + tree-ensemble studies (features → random forest / XGBoost → a clinical outcome) are the most common solo-doable clinical-ML workflow — no GPU, no engineer — and the most commonly over-optimistic: hundreds-to-thousands of features on tens of patients, hyperparameters tuned on the same folds the performance is reported from, features selected on the whole dataset, unstable features never filtered, and discrimination (AUC) reported without calibration. This skill produces the pipeline correctly and audits an existing one, so the clinical result survives review (Lambin 2017; CLEAR; TRIPOD+AI; PROBAST-AI).
It sits beside the imaging-DL lane: where /model-scaffold builds a deep network, radiomics-ml covers the feature-based classical-ML path. It integrates scikit-learn / xgboost / pyradiomics (referenced in the emitted code); it does not reimplement them and never runs a model on real patient data.
clinical prediction model that will pass statistical review.
/architecture-zoo → /model-scaffold → /model-validation./analyze-stats./explainability.held-out test set.
the classic radiomics trap. Apply LASSO / PCA / a stability + redundancy filter.
Nest selection inside each training fold.
to reproducible features (ICC / test-retest).
curve), not discrimination alone.
clinical claim.
For radiomics, extract with pyradiomics under reproducible, IBSI-aligned settings (fixed bin width, resampling, normalisation) — record them. For clinical/tabular data, assemble the feature table with a patient/subject ID and the outcome. See references/radiomics_ml_guide.md.
selection and scaling inside each training fold (never on the whole dataset).
is mandatory alongside any complex learner:
The gate below is learner-agnostic — it audits the pipeline (nested CV, leakage, dimensionality, calibration), so it applies identically to any of these. See the full method map in docs/method_coverage_map.md.
/analyze-stats calibration guide) and clinical utility (decision curve). SHAP for interpretation.
json{ "task": "classification", "n_features": 1200, "n_samples": 300, "n_events": 110, "cv_scheme": "nested", "feature_selection_stage": "inside_cv", "dimensionality_reduction": true, "feature_stability": "icc", "calibration_reported": true, "external_validation": "temporal", "model": "xgboost" }
bashpython3 scripts/check_radiomics_ml.py --manifest pipeline_manifest.json --strict
Verdicts: NO_NESTED_CV, HIGH_DIM_LOW_EVENTS, SELECTION_OUTSIDE_CV (Major); NO_FEATURE_STABILITY, NO_CALIBRATION, NO_EXTERNAL_VALIDATION (Minor). Complements self-review's check_cv_leakage (which audits a finished manuscript's prose) at the pipeline-spec level.
/analyze-stats — calibration + clinical-utility (decision curve, NNT) guides for the reporting./check-reporting — CLEAR (radiomics), TRIPOD+AI, PROBAST-AI item coverage./self-review clinical_prediction_model probe audits the finished manuscript; this skillproduces the rigorous pipeline it looks for.
manifest and every reported metric comes from the researcher's executed code — never invented. This skill designs and audits the pipeline; it does not run a model on real patient data.
is the optimism this skill exists to prevent (NO_NESTED_CV).
check_radiomics_ml.py. The rigorverdict is reproduced deterministically, never asserted from prose.
feature extractor or learner or claim results for one.
scripts/check_radiomics_ml_challenge/ ships a synthetic weak/strong pipeline pair with a network-free verify.sh wired into the skill's validation commands.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | 14,726 | 7,075 | -52% | 1 | 1 | 0% | 2,563 | 2,036 | -21% | 0 | 0 | — |
case-01 | fail→pass | 28,638 | 29,931 | +5% | 1 | 1 | 0% | 6,011 | 7,656 | +27% | 0 | 0 | — |
case-03 | fail→fail | 22,289 | 16,091 | -28% | 1 | 1 | 0% | 4,227 | 5,035 | +19% | 0 | 0 | — |
case-04 | fail→fail | 32,919 | 5,530 | -83% | 1 | 1 | 0% | 1,443 | 2,799 | +94% | 0 | 0 | — |
case-05 | pass→pass | 15,431 | 11,161 | -28% | 1 | 1 | 0% | 2,505 | 3,585 | +43% | 0 | 0 | — |
case-06 | fail→pass | 10,449 | 2,371 | -77% | 1 | 1 | 0% | 1,717 | 2,065 | +20% | 0 | 0 | — |
case-07 | fail→pass | 12,320 | 4,099 | -67% | 1 | 1 | 0% | 1,958 | 2,391 | +22% | 0 | 0 | — |
case-08 | fail→pass | 30,086 | 4,520 | -85% | 1 | 1 | 0% | 2,517 | 2,274 | -10% | 0 | 0 | — |
case-09 | fail→pass | 27,786 | 2,907 | -90% | 1 | 1 | 0% | 2,705 | 2,133 | -21% | 0 | 0 | — |
case-10 | fail→pass | 14,192 | 4,886 | -66% | 1 | 1 | 0% | 2,164 | 2,596 | +20% | 0 | 0 | — |
case-11 | pass→pass | 13,819 | 10,313 | -25% | 1 | 1 | 0% | 2,176 | 3,388 | +56% | 0 | 0 | — |
case-12 | pass→pass | 14,812 | 14,749 | -0% | 1 | 1 | 0% | 2,449 | 4,115 | +68% | 0 | 0 | — |
case-13 | pass→pass | 19,872 | 9,534 | -52% | 1 | 1 | 0% | 3,287 | 3,213 | -2% | 0 | 0 | — |
case-14 | pass→pass | 12,568 | 7,230 | -42% | 1 | 1 | 0% | 1,840 | 2,908 | +58% | 0 | 0 | — |
case-15 | pass→pass | 6,414 | 5,930 | -8% | 1 | 1 | 0% | 1,104 | 2,662 | +141% | 0 | 0 | — |
case-16 | pass→pass | 14,327 | 10,386 | -28% | 1 | 1 | 0% | 2,176 | 3,374 | +55% | 0 | 0 | — |
case-17 | pass→pass | 14,343 | 11,704 | -18% | 1 | 1 | 0% | 2,283 | 3,573 | +57% | 0 | 0 | — |
case-18 | pass→pass | 12,795 | 11,131 | -13% | 1 | 1 | 0% | 2,310 | 3,397 | +47% | 0 | 0 | — |
case-19 | pass→pass | 17,426 | 17,010 | -2% | 1 | 1 | 0% | 3,091 | 4,639 | +50% | 0 | 0 | — |
case-20 | pass→pass | 21,357 | 12,461 | -42% | 1 | 1 | 0% | 4,343 | 3,922 | -10% | 0 | 0 | — |
case-21 | pass→pass | 16,015 | 20,511 | +28% | 1 | 1 | 0% | 2,918 | 5,651 | +94% | 0 | 0 | — |
case-22 | pass→pass | 19,749 | 13,214 | -33% | 1 | 1 | 0% | 3,536 | 4,134 | +17% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.