julearn 0.3.5.dev56__tar.gz → 0.3.5.dev67__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/check-stale.yml +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/ci.yml +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/docs-preview.yml +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/docs.yml +2 -2
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/lint.yml +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/publish.yml +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/PKG-INFO +1 -1
- julearn-0.3.5.dev67/docs/changes/newsfragments/254.bugfix +1 -0
- julearn-0.3.5.dev67/docs/changes/newsfragments/254.change +1 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/plot_confound_removal_classification.py +2 -2
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/_version.py +3 -3
- julearn-0.3.5.dev67/julearn/model_selection/stratified_bootstrap.py +182 -0
- julearn-0.3.5.dev67/julearn/model_selection/tests/test_stratified_bootstrap.py +81 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_merger.py +2 -2
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_api.py +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_set_column_types.py +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/PKG-INFO +1 -1
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/SOURCES.txt +2 -0
- julearn-0.3.5.dev56/julearn/model_selection/stratified_bootstrap.py +0 -145
- julearn-0.3.5.dev56/julearn/model_selection/tests/test_stratified_bootstrap.py +0 -46
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/documentation_request.yaml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/dependabot.yml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/ci-docs.yml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.gitignore +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.pre-commit-config.yaml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/AUTHORS.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/LICENSE.md +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/README.md +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/codecov.yml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/Makefile +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_static/css/custom.css +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_static/js/custom.js +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/class.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/function.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/function_warning.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/versions.html +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/base.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/config.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/index.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/inspect.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/main.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/model_selection.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/models.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/pipeline.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/prepare.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/scoring.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/stats.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/transformers.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/utils.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/viz.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/available_pipeline_steps.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/contributors.inc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/.gitignore +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/277.enh +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/278.doc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/279.doc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/282.doc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/283.doc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/284.misc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/conf.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/configuration.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/contributing.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/examples.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/faq.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/getting_started.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/corrected_ttest.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/final_estimator.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_X.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_df.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_y.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/condor_q.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_main.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_open.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_stacked.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_calm.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_confbias.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_cv.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_generalization.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_it.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_ml.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_mlit.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/multiple_scorers_run_cv.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/plot_scores.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv_splitter.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv_train.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/index.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/links.inc +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/maintaining.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/redirect.html +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/CBPM.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/confound_removal.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/cross_validation_splitter.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/hyperparameter_tuning.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/index.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/joblib.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/model_inspect.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/stacked_models.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/target_transformers.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/cross_validation.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/data.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/index.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/model_comparison.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/model_evaluation.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/pipeline.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/whats_new.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_cm_acc_multiclass.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_example_regression.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_stratified_kfold_reg.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_combine_pandas.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_grouped_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_simple_binary_classification.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/01_model_comparison/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/01_model_comparison/plot_simple_model_comparison.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_groupcv_inspect_svm.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_inspect_random_forest.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_preprocess.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/run_binary_inspect_folds.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_apply_to_target.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_example_pca_featsets.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_multiple_grids.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_tuning.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_tuning_bayessearch.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_stacked_models.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/run_return_confounds.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/05_customization/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/05_customization/run_custom_scorers_regression.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_cbpm_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_confound_removal_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_cv_splitters_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_data_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_hyperparameters_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_comparison_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_evaluation_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_inspection_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_pipeline_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_stacked_models_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_target_transformer_docs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/README.rst +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/XX_disabled/dis_run_n_jobs.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/XX_disabled/dis_run_target_confound_removal.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/ignore_words.txt +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/api.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/column_types.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/estimators.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/tests/test_base_estimators.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/tests/test_column_types.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/config.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/conftest.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/external/optuna_searchcv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_pipeline.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_preprocess.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/inspector.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_inspector.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_pipeline.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_preprocess.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/_optuna_searcher.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/_skopt_searcher.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/available_searchers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/continuous_stratified_kfold.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/final_model_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_available_searchers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_continous_stratified_kfold.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_final_model_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_optuna_searcher.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_skopt_searcher.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/utils.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/available_models.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/dynamic.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_available_models.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_dynamic.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_models.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/merger.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/pipeline_creator.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/target_pipeline.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/target_pipeline_creator.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_pipeline_creator.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_target_pipeline.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_target_pipeline_creator.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/prepare.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/available_scorers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/metrics.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/tests/test_available_scorers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/tests/test_metrics.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/corrected_ttest.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/tests/test_corrected_ttest.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_config.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_prepare.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/available_transformers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/cbpm.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/confound_remover.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/change_column_types.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/drop_columns.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/filter_columns.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/set_column_types.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_change_column_types.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_drop_columns.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_filter_columns.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/ju_column_transformer.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/available_target_transformers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/ju_target_transformer.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/ju_transformed_target_model.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/target_confound_remover.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_available_target_transformers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_ju_target_transformer.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_ju_transformed_target_model.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_target_confound_remover.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_available_transformers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_cbpm.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_confounds.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_jucolumntransformers.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/_cv.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/checks.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/logging.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/testing.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/tests/test_logging.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/tests/test_version.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/typing.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/versions.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/__init__.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/_scores.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/res/julearn_logo_generalization.png +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/dependency_links.txt +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/requires.txt +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/top_level.txt +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/pyproject.toml +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/setup.cfg +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/setup.py +0 -0
- {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/tox.ini +0 -0
|
@@ -8,7 +8,7 @@ jobs:
|
|
|
8
8
|
stale:
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
10
|
steps:
|
|
11
|
-
- uses: actions/stale@
|
|
11
|
+
- uses: actions/stale@v10
|
|
12
12
|
with:
|
|
13
13
|
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
|
14
14
|
days-before-stale: 30
|
|
@@ -18,7 +18,7 @@ jobs:
|
|
|
18
18
|
with:
|
|
19
19
|
# require all of history to see all tagged versions' docs
|
|
20
20
|
fetch-depth: 0
|
|
21
|
-
- uses: actions/setup-python@
|
|
21
|
+
- uses: actions/setup-python@v6
|
|
22
22
|
with:
|
|
23
23
|
python-version: "3.x"
|
|
24
24
|
- name: Install Python dependencies
|
|
@@ -39,7 +39,7 @@ jobs:
|
|
|
39
39
|
make -C docs/ html
|
|
40
40
|
touch docs/_build/.nojekyll
|
|
41
41
|
cp docs/redirect.html docs/_build/index.html
|
|
42
|
-
- uses: peaceiris/actions-gh-pages@
|
|
42
|
+
- uses: peaceiris/actions-gh-pages@v4
|
|
43
43
|
with:
|
|
44
44
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
45
45
|
publish_dir: docs/_build
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: julearn
|
|
3
|
-
Version: 0.3.5.
|
|
3
|
+
Version: 0.3.5.dev67
|
|
4
4
|
Summary: Juelich Machine Learning Library
|
|
5
5
|
Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
6
6
|
Maintainer-email: Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Fix :class:`.StratifiedBootstrap` behaviour to not leak test and train indices during splitting by `Synchon Mandal`_
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Remove ``test_size`` and ``train_size`` parameters and change default value of ``n_splits`` from 5 to 200 for :class:`.StratifiedBootstrap` by `Synchon Mandal`_
|
|
@@ -58,7 +58,7 @@ confounds = ["petal_width"]
|
|
|
58
58
|
# change the number of bootstrap iterations to at least 2000 for a valid test.
|
|
59
59
|
n_bootstrap = 20
|
|
60
60
|
n_elements = len(df_iris)
|
|
61
|
-
cv = StratifiedBootstrap(n_splits=n_bootstrap,
|
|
61
|
+
cv = StratifiedBootstrap(n_splits=n_bootstrap, random_state=42)
|
|
62
62
|
|
|
63
63
|
###############################################################################
|
|
64
64
|
# First, we will train a model without performing confound removal on features.
|
|
@@ -79,7 +79,7 @@ scores_ncr = run_cross_validation(
|
|
|
79
79
|
###############################################################################
|
|
80
80
|
# Next, we train a model after performing confound removal on the features.
|
|
81
81
|
# Note: we initialize the CV again to use the same folds as before.
|
|
82
|
-
cv = StratifiedBootstrap(n_splits=n_bootstrap,
|
|
82
|
+
cv = StratifiedBootstrap(n_splits=n_bootstrap, random_state=42)
|
|
83
83
|
|
|
84
84
|
# In order to tell ``run_cross_validation`` which columns are confounds,
|
|
85
85
|
# and which columns are features, we have to define the X_types:
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.3.5.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 3, 5, '
|
|
31
|
+
__version__ = version = '0.3.5.dev67'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 3, 5, 'dev67')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'geb8b5927e'
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Class for Stratified Bootstrap cross-validation iterator."""
|
|
2
|
+
|
|
3
|
+
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
|
4
|
+
# Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
5
|
+
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
6
|
+
# License: AGPL
|
|
7
|
+
|
|
8
|
+
from typing import ClassVar, Optional, Union
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from numpy.random import RandomState
|
|
12
|
+
from sklearn.model_selection._split import (
|
|
13
|
+
_build_repr,
|
|
14
|
+
_UnsupportedGroupCVMixin,
|
|
15
|
+
)
|
|
16
|
+
from sklearn.utils import check_array, metadata_routing
|
|
17
|
+
from sklearn.utils._array_api import _convert_to_numpy, get_namespace
|
|
18
|
+
from sklearn.utils.extmath import _approximate_mode
|
|
19
|
+
from sklearn.utils.metadata_routing import _MetadataRequester
|
|
20
|
+
from sklearn.utils.validation import (
|
|
21
|
+
_num_samples,
|
|
22
|
+
check_random_state,
|
|
23
|
+
indexable,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class StratifiedBootstrap(_MetadataRequester, _UnsupportedGroupCVMixin):
|
|
28
|
+
"""Class-wise stratified bootstrap cross-validator.
|
|
29
|
+
|
|
30
|
+
Provides train/test indices to split data in train/test sets.
|
|
31
|
+
|
|
32
|
+
This cross-validation object returns stratified randomized folds. The folds
|
|
33
|
+
are made by preserving the percentage of samples for each class in `y` in a
|
|
34
|
+
binary or multiclass classification setting.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
n_splits : int, default=200
|
|
39
|
+
Number of bootstrap iterations.
|
|
40
|
+
random_state : int or RandomState instance or None, default=None
|
|
41
|
+
Controls the randomness of the training and testing indices produced.
|
|
42
|
+
Pass an int for reproducible output across multiple function calls.
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# This indicates that by default CV splitters don't have a "groups" kwarg,
|
|
47
|
+
# unless indicated by inheriting from ``GroupsConsumerMixin``.
|
|
48
|
+
# This also prevents ``set_split_request`` to be generated for splitters
|
|
49
|
+
# which don't support ``groups``.
|
|
50
|
+
__metadata_request__split: ClassVar = {"groups": metadata_routing.UNUSED}
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
n_splits: int = 200,
|
|
55
|
+
random_state: Optional[Union[int, RandomState]] = None,
|
|
56
|
+
) -> None:
|
|
57
|
+
self.n_splits = n_splits
|
|
58
|
+
self.random_state = random_state
|
|
59
|
+
|
|
60
|
+
def split(
|
|
61
|
+
self,
|
|
62
|
+
X, # noqa: N803
|
|
63
|
+
y,
|
|
64
|
+
groups=None,
|
|
65
|
+
):
|
|
66
|
+
"""Generate indices to split data into training and test set.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
X : array-like of shape (n_samples, n_features)
|
|
71
|
+
Training data, where `n_samples` is the number of samples
|
|
72
|
+
and `n_features` is the number of features.
|
|
73
|
+
y : array-like of shape (n_samples,)
|
|
74
|
+
The target variable for supervised learning problems.
|
|
75
|
+
groups : array-like of shape (n_samples,), default=None
|
|
76
|
+
Group labels for the samples used while splitting the dataset into
|
|
77
|
+
train/test set.
|
|
78
|
+
|
|
79
|
+
Yields
|
|
80
|
+
------
|
|
81
|
+
train : ndarray
|
|
82
|
+
The training set indices for that split.
|
|
83
|
+
test : ndarray
|
|
84
|
+
The testing set indices for that split.
|
|
85
|
+
|
|
86
|
+
Notes
|
|
87
|
+
-----
|
|
88
|
+
Randomized CV splitters may return different results for each call of
|
|
89
|
+
split. You can make the results identical by setting `random_state`
|
|
90
|
+
to an integer.
|
|
91
|
+
|
|
92
|
+
"""
|
|
93
|
+
# From BaseCrossValidator
|
|
94
|
+
X, y, groups = indexable(X, y, groups)
|
|
95
|
+
# From StratifiedShuffleSplit
|
|
96
|
+
n_samples = _num_samples(X)
|
|
97
|
+
y = check_array(y, input_name="y", ensure_2d=False, dtype=None)
|
|
98
|
+
|
|
99
|
+
# Convert to numpy as not all operations are supported by the Array
|
|
100
|
+
# API. `y` is probably never a very large array, which means that
|
|
101
|
+
# converting it should be cheap
|
|
102
|
+
xp, _ = get_namespace(y)
|
|
103
|
+
y = _convert_to_numpy(y, xp=xp)
|
|
104
|
+
|
|
105
|
+
if y.ndim == 2:
|
|
106
|
+
# for multi-label y, map each distinct row to a string repr
|
|
107
|
+
# using join because str(row) uses an ellipsis if len(row) > 1000
|
|
108
|
+
y = np.array([" ".join(row.astype("str")) for row in y])
|
|
109
|
+
|
|
110
|
+
classes, y_indices = np.unique(y, return_inverse=True)
|
|
111
|
+
n_classes = classes.shape[0]
|
|
112
|
+
|
|
113
|
+
class_counts = np.bincount(y_indices)
|
|
114
|
+
if np.min(class_counts) < 2:
|
|
115
|
+
raise ValueError(
|
|
116
|
+
"The least populated class in y has only 1"
|
|
117
|
+
" member, which is too few. The minimum"
|
|
118
|
+
" number of groups for any class cannot"
|
|
119
|
+
" be less than 2."
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Find the sorted list of instances for each class:
|
|
123
|
+
# (np.unique above performs a sort, so code is O(n logn) already)
|
|
124
|
+
class_indices = np.split(
|
|
125
|
+
np.argsort(y_indices, kind="mergesort"),
|
|
126
|
+
np.cumsum(class_counts)[:-1],
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
rng = check_random_state(self.random_state)
|
|
130
|
+
|
|
131
|
+
for _ in range(self.n_splits):
|
|
132
|
+
# if there are ties in the class-counts, we want
|
|
133
|
+
# to make sure to break them anew in each iteration
|
|
134
|
+
n_i = _approximate_mode(class_counts, n_samples, rng)
|
|
135
|
+
|
|
136
|
+
train = []
|
|
137
|
+
test = []
|
|
138
|
+
|
|
139
|
+
# Adapted from mlxtend.BootstrapOutOfBag
|
|
140
|
+
for i in range(n_classes):
|
|
141
|
+
train_idx = rng.choice(
|
|
142
|
+
class_indices[i], size=n_i[i], replace=True
|
|
143
|
+
)
|
|
144
|
+
test_idx = np.array(
|
|
145
|
+
list(set(class_indices[i]) - set(train_idx))
|
|
146
|
+
)
|
|
147
|
+
train.extend(train_idx)
|
|
148
|
+
test.extend(test_idx)
|
|
149
|
+
|
|
150
|
+
train = rng.permutation(train)
|
|
151
|
+
test = rng.permutation(test)
|
|
152
|
+
|
|
153
|
+
yield train, test
|
|
154
|
+
|
|
155
|
+
def get_n_splits(
|
|
156
|
+
self,
|
|
157
|
+
X=None, # noqa: N803
|
|
158
|
+
y=None,
|
|
159
|
+
groups=None,
|
|
160
|
+
) -> int:
|
|
161
|
+
"""Return the number of splitting iterations in the cross-validator.
|
|
162
|
+
|
|
163
|
+
Parameters
|
|
164
|
+
----------
|
|
165
|
+
X : object
|
|
166
|
+
Always ignored, exists for compatibility.
|
|
167
|
+
y : object
|
|
168
|
+
Always ignored, exists for compatibility.
|
|
169
|
+
groups : object
|
|
170
|
+
Always ignored, exists for compatibility.
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
n_splits : int
|
|
175
|
+
Returns the number of splitting iterations in the cross-validator.
|
|
176
|
+
|
|
177
|
+
"""
|
|
178
|
+
return self.n_splits # pragma: no cover
|
|
179
|
+
|
|
180
|
+
def __repr__(self) -> str:
|
|
181
|
+
"""Object representation."""
|
|
182
|
+
return _build_repr(self) # pragma: no cover
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Provides tests for the stratified bootstrap CV generator."""
|
|
2
|
+
|
|
3
|
+
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
|
4
|
+
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
5
|
+
# License: AGPL
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from sklearn.datasets import make_classification
|
|
9
|
+
|
|
10
|
+
from julearn.model_selection import StratifiedBootstrap
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_stratified_bootstrap_error() -> None:
|
|
14
|
+
"""Test stratified bootstrap error."""
|
|
15
|
+
X, y = make_classification(n_samples=1, n_classes=1)
|
|
16
|
+
with pytest.raises(
|
|
17
|
+
ValueError, match="The least populated class in y has only 1"
|
|
18
|
+
):
|
|
19
|
+
cv = StratifiedBootstrap()
|
|
20
|
+
list(cv.split(X, y))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.mark.parametrize(
|
|
24
|
+
"n_classes, n_splits",
|
|
25
|
+
[
|
|
26
|
+
(2, 50),
|
|
27
|
+
(2, 100),
|
|
28
|
+
(2, 200),
|
|
29
|
+
(3, 50),
|
|
30
|
+
(3, 100),
|
|
31
|
+
(3, 200),
|
|
32
|
+
(4, 50),
|
|
33
|
+
(4, 100),
|
|
34
|
+
(4, 200),
|
|
35
|
+
(5, 50),
|
|
36
|
+
(5, 100),
|
|
37
|
+
(5, 200),
|
|
38
|
+
(6, 50),
|
|
39
|
+
(6, 100),
|
|
40
|
+
(6, 200),
|
|
41
|
+
(7, 50),
|
|
42
|
+
(7, 100),
|
|
43
|
+
(7, 200),
|
|
44
|
+
(8, 50),
|
|
45
|
+
(8, 100),
|
|
46
|
+
(8, 200),
|
|
47
|
+
(9, 50),
|
|
48
|
+
(9, 100),
|
|
49
|
+
(9, 200),
|
|
50
|
+
(10, 50),
|
|
51
|
+
(10, 100),
|
|
52
|
+
(10, 200),
|
|
53
|
+
],
|
|
54
|
+
)
|
|
55
|
+
def test_stratified_bootstrap(n_classes: int, n_splits: int) -> None:
|
|
56
|
+
"""Test stratified bootstrap CV generator.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
n_classes : int
|
|
61
|
+
The parametrized number of classes (or strata).
|
|
62
|
+
n_splits : int
|
|
63
|
+
The parametrized number of splits.
|
|
64
|
+
|
|
65
|
+
"""
|
|
66
|
+
samples = 100 * n_classes
|
|
67
|
+
X, y = make_classification(
|
|
68
|
+
n_samples=samples,
|
|
69
|
+
n_features=n_classes * 10,
|
|
70
|
+
n_informative=n_classes,
|
|
71
|
+
n_redundant=0,
|
|
72
|
+
n_repeated=0,
|
|
73
|
+
n_classes=n_classes,
|
|
74
|
+
)
|
|
75
|
+
cv = StratifiedBootstrap(n_splits=n_splits, random_state=42)
|
|
76
|
+
# Check splits
|
|
77
|
+
results = list(cv.split(X, y))
|
|
78
|
+
assert len(results) == n_splits
|
|
79
|
+
# Check train and test indices are disjoint
|
|
80
|
+
for train_idxs, test_idxs in cv.split(X, y):
|
|
81
|
+
assert frozenset(train_idxs).isdisjoint(test_idxs)
|
|
@@ -97,7 +97,7 @@ def test_merger_errors() -> None:
|
|
|
97
97
|
pipe3 = GridSearchCV(SVC(), param_grid={"C": [1, 10]})
|
|
98
98
|
with pytest.raises(
|
|
99
99
|
ValueError,
|
|
100
|
-
match="All searchers must use a pipeline.",
|
|
100
|
+
match=r"All searchers must use a pipeline.",
|
|
101
101
|
):
|
|
102
102
|
merge_pipelines(pipe1, pipe3, search_params=None) # type: ignore
|
|
103
103
|
|
|
@@ -108,7 +108,7 @@ def test_merger_errors() -> None:
|
|
|
108
108
|
pipe4 = creator4.to_pipeline(search_params={"kind": "grid"})
|
|
109
109
|
with pytest.raises(
|
|
110
110
|
ValueError,
|
|
111
|
-
match="must have the same named steps.",
|
|
111
|
+
match=r"must have the same named steps.",
|
|
112
112
|
):
|
|
113
113
|
merge_pipelines(pipe1, pipe4, search_params=None) # type: ignore
|
|
114
114
|
|
|
@@ -1237,7 +1237,7 @@ def test_api_stacking_models() -> None:
|
|
|
1237
1237
|
return_estimator="final",
|
|
1238
1238
|
)
|
|
1239
1239
|
|
|
1240
|
-
# The final model should be a stacking model
|
|
1240
|
+
# The final model should be a stacking model in which the first estimator
|
|
1241
1241
|
# is a grid search
|
|
1242
1242
|
assert isinstance(
|
|
1243
1243
|
final.steps[1][1].estimators[0][1], # type: ignore
|
|
@@ -59,7 +59,7 @@ def test_SetColumnTypes_input_validation(
|
|
|
59
59
|
|
|
60
60
|
"""
|
|
61
61
|
with pytest.raises(
|
|
62
|
-
ValueError, match="Each value of X_types must be a list."
|
|
62
|
+
ValueError, match=r"Each value of X_types must be a list."
|
|
63
63
|
):
|
|
64
64
|
SetColumnTypes({"confound": "chicken"}).fit(X_iris) # type: ignore
|
|
65
65
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: julearn
|
|
3
|
-
Version: 0.3.5.
|
|
3
|
+
Version: 0.3.5.dev67
|
|
4
4
|
Summary: Juelich Machine Learning Library
|
|
5
5
|
Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
6
6
|
Maintainer-email: Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
@@ -55,6 +55,8 @@ docs/api/utils.rst
|
|
|
55
55
|
docs/api/viz.rst
|
|
56
56
|
docs/changes/contributors.inc
|
|
57
57
|
docs/changes/newsfragments/.gitignore
|
|
58
|
+
docs/changes/newsfragments/254.bugfix
|
|
59
|
+
docs/changes/newsfragments/254.change
|
|
58
60
|
docs/changes/newsfragments/277.enh
|
|
59
61
|
docs/changes/newsfragments/278.doc
|
|
60
62
|
docs/changes/newsfragments/279.doc
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
"""Class for Stratified Bootstrap cross-validation iterator."""
|
|
2
|
-
|
|
3
|
-
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
|
4
|
-
# Sami Hamdan <s.hamdan@fz-juelich.de>
|
|
5
|
-
# License: AGPL
|
|
6
|
-
|
|
7
|
-
from typing import Optional, Union
|
|
8
|
-
|
|
9
|
-
import numpy as np
|
|
10
|
-
from numpy.random import RandomState
|
|
11
|
-
from sklearn.model_selection import BaseShuffleSplit
|
|
12
|
-
from sklearn.model_selection._split import (
|
|
13
|
-
_validate_shuffle_split, # type: ignore
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class StratifiedBootstrap(BaseShuffleSplit):
|
|
18
|
-
"""Stratified Bootstrap cross-validation iterator.
|
|
19
|
-
|
|
20
|
-
Provides train/test indices using resampling with replacement, respecting
|
|
21
|
-
the distribution of samples for each class.
|
|
22
|
-
|
|
23
|
-
Parameters
|
|
24
|
-
----------
|
|
25
|
-
n_splits : int, default=5
|
|
26
|
-
Number of re-shuffling & splitting iterations.
|
|
27
|
-
test_size : float, int, default=0.2
|
|
28
|
-
If float, should be between 0.0 and 1.0 and represent the proportion
|
|
29
|
-
of groups to include in the test split (rounded up). If int,
|
|
30
|
-
represents the absolute number of test groups. If None, the value is
|
|
31
|
-
set to the complement of the train size.
|
|
32
|
-
The default will change in version 0.21. It will remain 0.2 only
|
|
33
|
-
if ``train_size`` is unspecified, otherwise it will complement
|
|
34
|
-
the specified ``train_size``.
|
|
35
|
-
train_size : float or int, default=None
|
|
36
|
-
If float, should be between 0.0 and 1.0 and represent the
|
|
37
|
-
proportion of the groups to include in the train split. If
|
|
38
|
-
int, represents the absolute number of train groups. If None,
|
|
39
|
-
the value is automatically set to the complement of the test size.
|
|
40
|
-
random_state : int or RandomState instance, default=None
|
|
41
|
-
Controls the randomness of the training and testing indices produced.
|
|
42
|
-
Pass an int for reproducible output across multiple function calls.
|
|
43
|
-
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def __init__(
|
|
47
|
-
self,
|
|
48
|
-
n_splits: int = 5,
|
|
49
|
-
test_size: float = 0.5,
|
|
50
|
-
train_size: Optional[float] = None,
|
|
51
|
-
random_state: Optional[Union[int, RandomState]] = None,
|
|
52
|
-
):
|
|
53
|
-
super().__init__(
|
|
54
|
-
n_splits=n_splits,
|
|
55
|
-
test_size=test_size,
|
|
56
|
-
train_size=train_size,
|
|
57
|
-
random_state=random_state,
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
def _iter_indices(
|
|
61
|
-
self,
|
|
62
|
-
X: np.ndarray, # noqa: N803
|
|
63
|
-
y: np.ndarray,
|
|
64
|
-
groups: Optional[np.ndarray] = None,
|
|
65
|
-
):
|
|
66
|
-
"""Generate (train, test) indices.
|
|
67
|
-
|
|
68
|
-
Parameters
|
|
69
|
-
----------
|
|
70
|
-
X : array-like of shape (n_samples, n_features)
|
|
71
|
-
Training vectors, where n_samples is the number of samples
|
|
72
|
-
and n_features is the number of features.
|
|
73
|
-
y : array-like of shape (n_samples,)
|
|
74
|
-
The target variable for supervised learning problems.
|
|
75
|
-
groups : array-like of shape (n_samples,), default=None
|
|
76
|
-
Group labels for stratifying the samples used while splitting the
|
|
77
|
-
dataset into train/test set.
|
|
78
|
-
|
|
79
|
-
Yields
|
|
80
|
-
------
|
|
81
|
-
train : ndarray
|
|
82
|
-
The training set indices for that split.
|
|
83
|
-
test : ndarray
|
|
84
|
-
The testing set indices for that split.
|
|
85
|
-
|
|
86
|
-
"""
|
|
87
|
-
y_labels = np.unique(y)
|
|
88
|
-
y_inds = [np.where(y == t_y)[0] for t_y in y_labels]
|
|
89
|
-
n_samples = [
|
|
90
|
-
_validate_shuffle_split(
|
|
91
|
-
len(t_inds),
|
|
92
|
-
self.test_size, # type: ignore
|
|
93
|
-
self.train_size, # type: ignore
|
|
94
|
-
default_test_size=self._default_test_size, # type: ignore
|
|
95
|
-
)
|
|
96
|
-
for t_inds in y_inds
|
|
97
|
-
]
|
|
98
|
-
for _ in range(self.n_splits): # type: ignore
|
|
99
|
-
train = []
|
|
100
|
-
test = []
|
|
101
|
-
for t_inds, (n_train, _) in zip(y_inds, n_samples):
|
|
102
|
-
bs_inds = np.random.choice(t_inds, len(t_inds), replace=True)
|
|
103
|
-
train.extend(bs_inds[:n_train])
|
|
104
|
-
test.extend(bs_inds[n_train:])
|
|
105
|
-
|
|
106
|
-
yield train, test
|
|
107
|
-
|
|
108
|
-
def split(
|
|
109
|
-
self,
|
|
110
|
-
X: np.ndarray, # noqa: N803
|
|
111
|
-
y: np.ndarray,
|
|
112
|
-
groups: Optional[np.ndarray] = None,
|
|
113
|
-
):
|
|
114
|
-
"""Generate indices to split data into training and test set.
|
|
115
|
-
|
|
116
|
-
Parameters
|
|
117
|
-
----------
|
|
118
|
-
X : array-like of shape (n_samples, n_features)
|
|
119
|
-
Training data, where n_samples is the number of samples
|
|
120
|
-
and n_features is the number of features.
|
|
121
|
-
Note that providing ``y`` is sufficient to generate the splits and
|
|
122
|
-
hence ``np.zeros(n_samples)`` may be used as a placeholder for
|
|
123
|
-
``X`` instead of actual training data.
|
|
124
|
-
y : array-like of shape (n_samples,) or (n_samples, n_labels)
|
|
125
|
-
The target variable for supervised learning problems.
|
|
126
|
-
Stratification is done based on the y labels.
|
|
127
|
-
groups : array-like of shape (n_samples,), default=None
|
|
128
|
-
Group labels for stratifying the samples used while splitting the
|
|
129
|
-
dataset into train/test set.
|
|
130
|
-
|
|
131
|
-
Yields
|
|
132
|
-
------
|
|
133
|
-
train : ndarray
|
|
134
|
-
The training set indices for that split.
|
|
135
|
-
test : ndarray
|
|
136
|
-
The testing set indices for that split.
|
|
137
|
-
|
|
138
|
-
Notes
|
|
139
|
-
-----
|
|
140
|
-
Randomized CV splitters may return different results for each call of
|
|
141
|
-
split. You can make the results identical by setting `random_state`
|
|
142
|
-
to an integer.
|
|
143
|
-
|
|
144
|
-
"""
|
|
145
|
-
return super().split(X, y, groups)
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"""Provides tests for the stratified bootstrap CV generator."""
|
|
2
|
-
|
|
3
|
-
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
|
4
|
-
# License: AGPL
|
|
5
|
-
|
|
6
|
-
import numpy as np
|
|
7
|
-
import pytest
|
|
8
|
-
|
|
9
|
-
from julearn.model_selection import StratifiedBootstrap
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@pytest.mark.parametrize(
|
|
13
|
-
"n_classes, test_size",
|
|
14
|
-
[
|
|
15
|
-
(3, 0.2),
|
|
16
|
-
(2, 0.5),
|
|
17
|
-
(4, 0.8),
|
|
18
|
-
],
|
|
19
|
-
)
|
|
20
|
-
def test_stratified_bootstrap(n_classes: int, test_size: float) -> None:
|
|
21
|
-
"""Test stratified bootstrap CV generator.
|
|
22
|
-
|
|
23
|
-
Parameters
|
|
24
|
-
----------
|
|
25
|
-
n_classes : int
|
|
26
|
-
Number of classes.
|
|
27
|
-
test_size : float
|
|
28
|
-
Test size.
|
|
29
|
-
|
|
30
|
-
"""
|
|
31
|
-
n_samples = 100
|
|
32
|
-
X = np.random.rand(n_samples, 2)
|
|
33
|
-
|
|
34
|
-
y = np.random.randint(0, n_classes, n_samples)
|
|
35
|
-
|
|
36
|
-
cv = StratifiedBootstrap(n_splits=10, test_size=test_size)
|
|
37
|
-
|
|
38
|
-
for train, test in cv.split(X, y):
|
|
39
|
-
y_train = y[train]
|
|
40
|
-
y_test = y[test]
|
|
41
|
-
for i in range(n_classes):
|
|
42
|
-
n_y = (y == i).sum()
|
|
43
|
-
n_y_train = (y_train == i).sum()
|
|
44
|
-
n_y_test = (y_test == i).sum()
|
|
45
|
-
assert abs(n_y_train - (n_y * (1 - test_size))) < 1
|
|
46
|
-
assert abs(n_y_test - (n_y * test_size)) < 1
|
|
File without changes
|
|
File without changes
|
{julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/documentation_request.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|