%22%22%22How%20to%20Stop%20Optimization%20Early%20with%20Callbacks.%0A%0AStop%20unneeded%20work%20early%20by%20adding%20Optuna%20callbacks%20to%20OptunaSearchCV.%0A%22%22%22%0A%0A%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.11%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22optuna%22%2C%0A%23%20%20%20%20%20%22scikit-learn%22%2C%0A%23%20%20%20%20%20%22sklearn-optuna%22%2C%0A%23%20%5D%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.19.9%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20optuna%0A%20%20%20%20from%20optuna.distributions%20import%20FloatDistribution%0A%20%20%20%20from%20optuna.study%20import%20MaxTrialsCallback%0A%20%20%20%20from%20sklearn.datasets%20import%20make_classification%0A%20%20%20%20from%20sklearn.svm%20import%20SVC%0A%0A%20%20%20%20from%20sklearn_optuna%20import%20Callback%2C%20OptunaSearchCV%2C%20Sampler%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Callback%2C%0A%20%20%20%20%20%20%20%20FloatDistribution%2C%0A%20%20%20%20%20%20%20%20MaxTrialsCallback%2C%0A%20%20%20%20%20%20%20%20OptunaSearchCV%2C%0A%20%20%20%20%20%20%20%20SVC%2C%0A%20%20%20%20%20%20%20%20make_classification%2C%0A%20%20%20%20%20%20%20%20optuna%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20How%20to%20Stop%20Optimization%20Early%20with%20Callbacks%0A%0A%20%20%20%20This%20notebook%20shows%20how%20to%20stop%20optimization%20early%20by%20adding%0A%20%20%20%20Optuna%20callbacks%20to%20%60OptunaSearchCV%60.%0A%0A%20%20%20%20**Prerequisites%3A**%20Familiarity%20with%20the%0A%20%20%20%20OptunaSearchCV%20quickstart%0A%20%20%20%20(%5BView%5D(%2Fexamples%2Fquickstart%2F)%20%C2%B7%20%5BOpen%20in%20marimo%5D(%2Fexamples%2Fquickstart%2Fedit%2F)).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(make_classification)%3A%0A%20%20%20%20%23%20Setup%20data%0A%20%20%20%20X%2C%20y%20%3D%20make_classification(%0A%20%20%20%20%20%20%20%20n_samples%3D200%2C%20n_features%3D5%2C%20n_informative%3D2%2C%20random_state%3D0%0A%20%20%20%20)%0A%20%20%20%20return%20X%2C%20y%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%201.%20Wrap%20the%20Callback%0A%0A%20%20%20%20Wrap%20Optuna's%20%60MaxTrialsCallback%60%20with%20the%20%60Callback%60%20wrapper%0A%20%20%20%20for%20sklearn%20compatibility.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Callback%2C%20MaxTrialsCallback%2C%20optuna)%3A%0A%20%20%20%20%23%20Wrap%20the%20callback%20using%20the%20Callback%20wrapper%20class%0A%20%20%20%20max_trials_cb%20%3D%20Callback(MaxTrialsCallback%2C%20n_trials%3D5%2C%20states%3D(optuna.trial.TrialState.COMPLETE%2C))%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%202.%20Pass%20to%20OptunaSearchCV%0A%0A%20%20%20%20Pass%20a%20dictionary%20of%20callbacks%20to%20%60OptunaSearchCV%60%20via%20the%0A%20%20%20%20%60callbacks%3D%60%20parameter.%20The%20callback%20stops%20the%20search%20after%0A%20%20%20%205%20completed%20trials%2C%20even%20though%20%60n_trials%3D20%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Callback%2C%0A%20%20%20%20FloatDistribution%2C%0A%20%20%20%20MaxTrialsCallback%2C%0A%20%20%20%20OptunaSearchCV%2C%0A%20%20%20%20SVC%2C%0A%20%20%20%20X%2C%0A%20%20%20%20optuna%2C%0A%20%20%20%20y%2C%0A)%3A%0A%20%20%20%20search%20%3D%20OptunaSearchCV(%0A%20%20%20%20%20%20%20%20SVC()%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22C%22%3A%20FloatDistribution(0.1%2C%2010.0%2C%20log%3DTrue)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%23%20Pass%20a%20dictionary%20of%20name%20-%3E%20Callback%20wrapper%0A%20%20%20%20%20%20%20%20callbacks%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_trials%22%3A%20Callback(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MaxTrialsCallback%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_trials%3D5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20states%3D(optuna.trial.TrialState.COMPLETE%2C)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20n_trials%3D20%2C%20%20%23%20Will%20be%20stopped%20early%20by%20callback%0A%20%20%20%20)%0A%20%20%20%20search.fit(X%2C%20y)%0A%20%20%20%20return%20(search%2C)%0A%0A%0A%40app.cell%0Adef%20_(search)%3A%0A%20%20%20%20%23%20Check%20how%20many%20trials%20actually%20ran%0A%20%20%20%20n_trials_run%20%3D%20len(search.study_.trials)%0A%20%20%20%20return%20(n_trials_run%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20n_trials_run)%3A%0A%20%20%20%20mo.md(f%22Requested%20trials%3A%2020%5CnActual%20trials%20run%3A%20%7Bn_trials_run%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%203.%20Multiple%20Callbacks%0A%0A%20%20%20%20If%20you%20need%20multiple%20stopping%20criteria%2C%20pass%20additional%20entries%0A%20%20%20%20to%20the%20callbacks%20dictionary.%20Each%20callback%20is%20checked%20after%0A%20%20%20%20every%20trial.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Callback%2C%0A%20%20%20%20FloatDistribution%2C%0A%20%20%20%20MaxTrialsCallback%2C%0A%20%20%20%20OptunaSearchCV%2C%0A%20%20%20%20SVC%2C%0A%20%20%20%20X%2C%0A%20%20%20%20optuna%2C%0A%20%20%20%20y%2C%0A)%3A%0A%20%20%20%20from%20optuna.terminator.callback%20import%20TerminatorCallback%0A%0A%20%20%20%20multi_search%20%3D%20OptunaSearchCV(%0A%20%20%20%20%20%20%20%20SVC()%2C%0A%20%20%20%20%20%20%20%20%7B%22C%22%3A%20FloatDistribution(0.1%2C%2010.0%2C%20log%3DTrue)%7D%2C%0A%20%20%20%20%20%20%20%20callbacks%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_trials%22%3A%20Callback(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MaxTrialsCallback%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_trials%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20states%3D(optuna.trial.TrialState.COMPLETE%2C)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22terminator%22%3A%20Callback(TerminatorCallback)%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20n_trials%3D50%2C%0A%20%20%20%20)%0A%20%20%20%20multi_search.fit(X%2C%20y)%0A%20%20%20%20return%20(multi_search%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20multi_search)%3A%0A%20%20%20%20mo.md(f%22%22%22Trials%20run%20with%20multiple%20callbacks%3A%20%7Blen(multi_search.study_.trials)%7D%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
dea4867aa550cee4b869ce17fc5870f2