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.
Files changed (252) hide show
  1. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/check-stale.yml +1 -1
  2. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/ci.yml +1 -1
  3. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/docs-preview.yml +1 -1
  4. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/docs.yml +2 -2
  5. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/lint.yml +1 -1
  6. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/publish.yml +1 -1
  7. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/PKG-INFO +1 -1
  8. julearn-0.3.5.dev67/docs/changes/newsfragments/254.bugfix +1 -0
  9. julearn-0.3.5.dev67/docs/changes/newsfragments/254.change +1 -0
  10. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/plot_confound_removal_classification.py +2 -2
  11. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/_version.py +3 -3
  12. julearn-0.3.5.dev67/julearn/model_selection/stratified_bootstrap.py +182 -0
  13. julearn-0.3.5.dev67/julearn/model_selection/tests/test_stratified_bootstrap.py +81 -0
  14. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_merger.py +2 -2
  15. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_api.py +1 -1
  16. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_set_column_types.py +1 -1
  17. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/PKG-INFO +1 -1
  18. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/SOURCES.txt +2 -0
  19. julearn-0.3.5.dev56/julearn/model_selection/stratified_bootstrap.py +0 -145
  20. julearn-0.3.5.dev56/julearn/model_selection/tests/test_stratified_bootstrap.py +0 -46
  21. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  22. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  23. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/documentation_request.yaml +0 -0
  24. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  25. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/dependabot.yml +0 -0
  26. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.github/workflows/ci-docs.yml +0 -0
  27. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.gitignore +0 -0
  28. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/.pre-commit-config.yaml +0 -0
  29. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/AUTHORS.rst +0 -0
  30. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/LICENSE.md +0 -0
  31. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/README.md +0 -0
  32. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/codecov.yml +0 -0
  33. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/Makefile +0 -0
  34. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_static/css/custom.css +0 -0
  35. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_static/js/custom.js +0 -0
  36. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/class.rst +0 -0
  37. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/function.rst +0 -0
  38. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/function_warning.rst +0 -0
  39. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/_templates/versions.html +0 -0
  40. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/base.rst +0 -0
  41. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/config.rst +0 -0
  42. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/index.rst +0 -0
  43. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/inspect.rst +0 -0
  44. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/main.rst +0 -0
  45. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/model_selection.rst +0 -0
  46. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/models.rst +0 -0
  47. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/pipeline.rst +0 -0
  48. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/prepare.rst +0 -0
  49. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/scoring.rst +0 -0
  50. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/stats.rst +0 -0
  51. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/transformers.rst +0 -0
  52. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/utils.rst +0 -0
  53. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/api/viz.rst +0 -0
  54. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/available_pipeline_steps.rst +0 -0
  55. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/contributors.inc +0 -0
  56. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/.gitignore +0 -0
  57. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/277.enh +0 -0
  58. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/278.doc +0 -0
  59. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/279.doc +0 -0
  60. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/282.doc +0 -0
  61. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/283.doc +0 -0
  62. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/changes/newsfragments/284.misc +0 -0
  63. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/conf.py +0 -0
  64. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/configuration.rst +0 -0
  65. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/contributing.rst +0 -0
  66. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/examples.rst +0 -0
  67. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/faq.rst +0 -0
  68. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/getting_started.rst +0 -0
  69. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/corrected_ttest.png +0 -0
  70. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/final_estimator.png +0 -0
  71. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_X.png +0 -0
  72. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_df.png +0 -0
  73. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/iris_y.png +0 -0
  74. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/condor_q.png +0 -0
  75. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_main.png +0 -0
  76. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_open.png +0 -0
  77. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/joblib_htcondor/ui_stacked.png +0 -0
  78. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo.png +0 -0
  79. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_calm.png +0 -0
  80. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_confbias.png +0 -0
  81. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_cv.png +0 -0
  82. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_generalization.png +0 -0
  83. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_it.png +0 -0
  84. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_ml.png +0 -0
  85. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/julearn_logo_mlit.png +0 -0
  86. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/multiple_scorers_run_cv.png +0 -0
  87. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/plot_scores.png +0 -0
  88. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv.png +0 -0
  89. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv_splitter.png +0 -0
  90. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/images/scores_run_cv_train.png +0 -0
  91. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/index.rst +0 -0
  92. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/links.inc +0 -0
  93. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/maintaining.rst +0 -0
  94. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/redirect.html +0 -0
  95. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/CBPM.rst +0 -0
  96. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/confound_removal.rst +0 -0
  97. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/cross_validation_splitter.rst +0 -0
  98. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/hyperparameter_tuning.rst +0 -0
  99. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/index.rst +0 -0
  100. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/joblib.rst +0 -0
  101. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/model_inspect.rst +0 -0
  102. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/stacked_models.rst +0 -0
  103. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/selected_deeper_topics/target_transformers.rst +0 -0
  104. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/cross_validation.rst +0 -0
  105. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/data.rst +0 -0
  106. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/index.rst +0 -0
  107. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/model_comparison.rst +0 -0
  108. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/model_evaluation.rst +0 -0
  109. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/what_really_need_know/pipeline.rst +0 -0
  110. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/docs/whats_new.rst +0 -0
  111. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/README.rst +0 -0
  112. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_cm_acc_multiclass.py +0 -0
  113. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_example_regression.py +0 -0
  114. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/plot_stratified_kfold_reg.py +0 -0
  115. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_combine_pandas.py +0 -0
  116. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_grouped_cv.py +0 -0
  117. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/00_starting/run_simple_binary_classification.py +0 -0
  118. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/01_model_comparison/README.rst +0 -0
  119. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/01_model_comparison/plot_simple_model_comparison.py +0 -0
  120. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/README.rst +0 -0
  121. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_groupcv_inspect_svm.py +0 -0
  122. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_inspect_random_forest.py +0 -0
  123. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/plot_preprocess.py +0 -0
  124. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/02_inspection/run_binary_inspect_folds.py +0 -0
  125. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/README.rst +0 -0
  126. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_apply_to_target.py +0 -0
  127. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_example_pca_featsets.py +0 -0
  128. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_multiple_grids.py +0 -0
  129. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_tuning.py +0 -0
  130. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_hyperparameter_tuning_bayessearch.py +0 -0
  131. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/03_complex_models/run_stacked_models.py +0 -0
  132. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/README.rst +0 -0
  133. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/04_confounds/run_return_confounds.py +0 -0
  134. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/05_customization/README.rst +0 -0
  135. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/05_customization/run_custom_scorers_regression.py +0 -0
  136. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/README.rst +0 -0
  137. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_cbpm_docs.py +0 -0
  138. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_confound_removal_docs.py +0 -0
  139. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_cv_splitters_docs.py +0 -0
  140. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_data_docs.py +0 -0
  141. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_hyperparameters_docs.py +0 -0
  142. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_comparison_docs.py +0 -0
  143. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_evaluation_docs.py +0 -0
  144. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_model_inspection_docs.py +0 -0
  145. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_pipeline_docs.py +0 -0
  146. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_stacked_models_docs.py +0 -0
  147. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/99_docs/run_target_transformer_docs.py +0 -0
  148. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/README.rst +0 -0
  149. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/XX_disabled/dis_run_n_jobs.py +0 -0
  150. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/examples/XX_disabled/dis_run_target_confound_removal.py +0 -0
  151. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/ignore_words.txt +0 -0
  152. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/__init__.py +0 -0
  153. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/api.py +0 -0
  154. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/__init__.py +0 -0
  155. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/column_types.py +0 -0
  156. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/estimators.py +0 -0
  157. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/tests/test_base_estimators.py +0 -0
  158. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/base/tests/test_column_types.py +0 -0
  159. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/config.py +0 -0
  160. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/conftest.py +0 -0
  161. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/external/optuna_searchcv.py +0 -0
  162. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/__init__.py +0 -0
  163. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_cv.py +0 -0
  164. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_pipeline.py +0 -0
  165. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/_preprocess.py +0 -0
  166. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/inspector.py +0 -0
  167. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_cv.py +0 -0
  168. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_inspector.py +0 -0
  169. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_pipeline.py +0 -0
  170. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/inspect/tests/test_preprocess.py +0 -0
  171. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/__init__.py +0 -0
  172. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/_optuna_searcher.py +0 -0
  173. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/_skopt_searcher.py +0 -0
  174. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/available_searchers.py +0 -0
  175. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/continuous_stratified_kfold.py +0 -0
  176. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/final_model_cv.py +0 -0
  177. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_available_searchers.py +0 -0
  178. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_continous_stratified_kfold.py +0 -0
  179. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_final_model_cv.py +0 -0
  180. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_optuna_searcher.py +0 -0
  181. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/tests/test_skopt_searcher.py +0 -0
  182. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/model_selection/utils.py +0 -0
  183. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/__init__.py +0 -0
  184. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/available_models.py +0 -0
  185. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/dynamic.py +0 -0
  186. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_available_models.py +0 -0
  187. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_dynamic.py +0 -0
  188. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/models/tests/test_models.py +0 -0
  189. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/__init__.py +0 -0
  190. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/merger.py +0 -0
  191. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/pipeline_creator.py +0 -0
  192. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/target_pipeline.py +0 -0
  193. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/target_pipeline_creator.py +0 -0
  194. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_pipeline_creator.py +0 -0
  195. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_target_pipeline.py +0 -0
  196. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/pipeline/tests/test_target_pipeline_creator.py +0 -0
  197. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/prepare.py +0 -0
  198. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/__init__.py +0 -0
  199. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/available_scorers.py +0 -0
  200. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/metrics.py +0 -0
  201. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/tests/test_available_scorers.py +0 -0
  202. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/scoring/tests/test_metrics.py +0 -0
  203. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/__init__.py +0 -0
  204. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/corrected_ttest.py +0 -0
  205. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/stats/tests/test_corrected_ttest.py +0 -0
  206. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_config.py +0 -0
  207. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/tests/test_prepare.py +0 -0
  208. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/__init__.py +0 -0
  209. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/available_transformers.py +0 -0
  210. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/cbpm.py +0 -0
  211. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/confound_remover.py +0 -0
  212. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/__init__.py +0 -0
  213. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/change_column_types.py +0 -0
  214. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/drop_columns.py +0 -0
  215. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/filter_columns.py +0 -0
  216. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/set_column_types.py +0 -0
  217. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_change_column_types.py +0 -0
  218. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_drop_columns.py +0 -0
  219. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/dataframe/tests/test_filter_columns.py +0 -0
  220. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/ju_column_transformer.py +0 -0
  221. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/__init__.py +0 -0
  222. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/available_target_transformers.py +0 -0
  223. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/ju_target_transformer.py +0 -0
  224. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/ju_transformed_target_model.py +0 -0
  225. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/target_confound_remover.py +0 -0
  226. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_available_target_transformers.py +0 -0
  227. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_ju_target_transformer.py +0 -0
  228. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_ju_transformed_target_model.py +0 -0
  229. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/target/tests/test_target_confound_remover.py +0 -0
  230. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_available_transformers.py +0 -0
  231. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_cbpm.py +0 -0
  232. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_confounds.py +0 -0
  233. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/transformers/tests/test_jucolumntransformers.py +0 -0
  234. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/__init__.py +0 -0
  235. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/_cv.py +0 -0
  236. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/checks.py +0 -0
  237. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/logging.py +0 -0
  238. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/testing.py +0 -0
  239. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/tests/test_logging.py +0 -0
  240. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/tests/test_version.py +0 -0
  241. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/typing.py +0 -0
  242. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/utils/versions.py +0 -0
  243. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/__init__.py +0 -0
  244. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/_scores.py +0 -0
  245. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn/viz/res/julearn_logo_generalization.png +0 -0
  246. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/dependency_links.txt +0 -0
  247. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/requires.txt +0 -0
  248. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/julearn.egg-info/top_level.txt +0 -0
  249. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/pyproject.toml +0 -0
  250. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/setup.cfg +0 -0
  251. {julearn-0.3.5.dev56 → julearn-0.3.5.dev67}/setup.py +0 -0
  252. {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@v9
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
@@ -29,7 +29,7 @@ jobs:
29
29
 
30
30
  steps:
31
31
  - uses: actions/checkout@v5
32
- - uses: actions/setup-python@v5
32
+ - uses: actions/setup-python@v6
33
33
  with:
34
34
  python-version: ${{ matrix.python-version }}
35
35
  - name: Install Python dependencies
@@ -22,7 +22,7 @@ jobs:
22
22
  - uses: actions/checkout@v5
23
23
  with:
24
24
  fetch-depth: 0
25
- - uses: actions/setup-python@v5
25
+ - uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: "3.x"
28
28
  - name: Install Python dependencies
@@ -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@v5
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@v3
42
+ - uses: peaceiris/actions-gh-pages@v4
43
43
  with:
44
44
  github_token: ${{ secrets.GITHUB_TOKEN }}
45
45
  publish_dir: docs/_build
@@ -9,7 +9,7 @@ jobs:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
11
  - uses: actions/checkout@v5
12
- - uses: actions/setup-python@v5
12
+ - uses: actions/setup-python@v6
13
13
  with:
14
14
  python-version: "3.x"
15
15
  - name: Install Python dependencies
@@ -21,7 +21,7 @@ jobs:
21
21
  with:
22
22
  fetch-depth: 0
23
23
  submodules: true
24
- - uses: actions/setup-python@v5
24
+ - uses: actions/setup-python@v6
25
25
  with:
26
26
  python-version: "3.x"
27
27
  - name: Install build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: julearn
3
- Version: 0.3.5.dev56
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, test_size=0.3, random_state=42)
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, test_size=0.3, random_state=42)
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.dev56'
32
- __version_tuple__ = version_tuple = (0, 3, 5, 'dev56')
31
+ __version__ = version = '0.3.5.dev67'
32
+ __version_tuple__ = version_tuple = (0, 3, 5, 'dev67')
33
33
 
34
- __commit_id__ = commit_id = 'gf35d9bb15'
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 im which the first estimator
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.dev56
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
File without changes
File without changes
File without changes