Showing preview only (4,202K chars total). Download the full file or copy to clipboard to get everything.
Repository: EpistasisLab/tpot
Branch: main
Commit: 1bca6c6a51a7
Files: 141
Total size: 4.0 MB
Directory structure:
gitextract_i76kzk_w/
├── .github/
│ └── workflows/
│ ├── docs.yml
│ ├── publish_package.yml
│ └── tests.yml
├── .gitignore
├── ISSUE_TEMPLATE.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── Tutorial/
│ ├── 1_Using_TPOT.ipynb
│ ├── 2_Search_Spaces.ipynb
│ ├── 3_Feature_Set_Selector.ipynb
│ ├── 4_Genetic_Feature_Selection.ipynb
│ ├── 5_GraphPipeline.ipynb
│ ├── 6_Symbolic_Regression_and_Classification.ipynb
│ ├── 7_dask_parallelization.ipynb
│ ├── 8_SH_and_cv_early_pruning.ipynb
│ ├── 9_Genetic_Algorithm_Overview.ipynb
│ ├── amltk_search_space_parser_example.ipynb
│ └── simple_fss.csv
├── docs/
│ ├── archived/
│ │ ├── api.md
│ │ ├── citing.md
│ │ ├── contributing.md
│ │ ├── css/
│ │ │ └── archived.css
│ │ ├── examples.md
│ │ ├── index.md
│ │ ├── installing.md
│ │ ├── related.md
│ │ ├── releases.md
│ │ ├── support.md
│ │ └── using.md
│ ├── cite.md
│ ├── contribute.md
│ ├── css/
│ │ └── extra.css
│ ├── index.md
│ ├── installation.md
│ ├── related.md
│ ├── requirements_docs.txt
│ ├── scripts/
│ │ ├── build_docs_sources.sh
│ │ ├── build_mkdocs.sh
│ │ └── build_tutorial_toc_not_used.sh
│ ├── support.md
│ ├── tpot_api/
│ │ ├── classifier.md
│ │ ├── estimator.md
│ │ └── regressor.md
│ └── using.md
├── mkdocs_archived.yml
├── pyproject.toml
├── tox.ini
└── tpot/
├── __init__.py
├── _version.py
├── builtin_modules/
│ ├── __init__.py
│ ├── arithmetictransformer.py
│ ├── column_one_hot_encoder.py
│ ├── estimatortransformer.py
│ ├── feature_encoding_frequency_selector.py
│ ├── feature_set_selector.py
│ ├── feature_transformers.py
│ ├── genetic_encoders.py
│ ├── imputer.py
│ ├── nn.py
│ ├── passkbinsdiscretizer.py
│ ├── passthrough.py
│ ├── tests/
│ │ └── feature_set_selector_tests.py
│ └── zero_count.py
├── config/
│ ├── __init__.py
│ ├── autoqtl_builtins.py
│ ├── classifiers.py
│ ├── classifiers_sklearnex.py
│ ├── get_configspace.py
│ ├── imputers.py
│ ├── mdr_configs.py
│ ├── regressors.py
│ ├── regressors_sklearnex.py
│ ├── selectors.py
│ ├── special_configs.py
│ ├── template_search_spaces.py
│ ├── tests/
│ │ ├── __init__.py
│ │ └── test_get_configspace.py
│ └── transformers.py
├── evolvers/
│ ├── __init__.py
│ ├── base_evolver.py
│ └── steady_state_evolver.py
├── graphsklearn.py
├── individual.py
├── logbook.py
├── objectives/
│ ├── __init__.py
│ ├── average_path_length.py
│ ├── complexity.py
│ ├── number_of_leaves.py
│ ├── number_of_nodes.py
│ └── tests/
│ ├── test_complexity_objective.py
│ └── test_number_of_nodes.py
├── old_config_utils/
│ ├── __init__.py
│ └── old_config_utils.py
├── population.py
├── search_spaces/
│ ├── __init__.py
│ ├── base.py
│ ├── graph_utils.py
│ ├── nodes/
│ │ ├── __init__.py
│ │ ├── estimator_node.py
│ │ ├── estimator_node_gradual.py
│ │ ├── fss_node.py
│ │ └── genetic_feature_selection.py
│ ├── pipelines/
│ │ ├── __init__.py
│ │ ├── choice.py
│ │ ├── dynamic_linear.py
│ │ ├── dynamicunion.py
│ │ ├── graph.py
│ │ ├── sequential.py
│ │ ├── tests/
│ │ │ └── test_graphspace.py
│ │ ├── tree.py
│ │ ├── union.py
│ │ └── wrapper.py
│ ├── tests/
│ │ └── test_search_spaces.py
│ └── tuple_index.py
├── selectors/
│ ├── __init__.py
│ ├── lexicase_selection.py
│ ├── map_elites_selection.py
│ ├── max_weighted_average_selector.py
│ ├── nsgaii.py
│ ├── random_selector.py
│ ├── tournament_selection.py
│ └── tournament_selection_dominated.py
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_estimators.py
│ └── test_hello_world.py
├── tpot_estimator/
│ ├── __init__.py
│ ├── cross_val_utils.py
│ ├── estimator.py
│ ├── estimator_utils.py
│ ├── steady_state_estimator.py
│ ├── templates/
│ │ ├── __init__.py
│ │ ├── tpot_autoimputer.py
│ │ └── tpottemplates.py
│ └── tests/
│ ├── __init__.py
│ └── test_estimator_utils.py
└── utils/
├── __init__.py
├── amltk_parser.py
├── eval_utils.py
└── utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs Build
on:
push:
branches:
- main
jobs:
build_docs:
runs-on: ubuntu-latest
env:
GIT_COMMITTER_NAME: "Doc Build Bot"
GIT_COMMITTER_EMAIL: "jay-m-dev@users.noreply.github.com"
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('docs/requirements_docs.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: |
pip install --upgrade pip
pip install .
pip install -r docs/requirements_docs.txt
# - name: Convert notebooks to HTML
# # if: ${{ github.event_name == 'push' && contains(github.event.head_commit.modified, 'Tutorial/') && contains(github.event.head_commit.modified, '.ipynb') }}
# run: |
# # jupyter nbconvert --to html --allow-errors --no-input --show-input --template classic --output-dir docs/tutorial Tutorial/*.ipynb
# jupyter nbconvert --to html --allow-errors --template classic --output-dir docs/tutorial Tutorial/*.ipynb
# - name: Build Tutorial Table of Contents
# run: |
# bash docs/scripts/build_tutorial_toc.sh
- name: Build Documentation sources
run: |
bash docs/scripts/build_docs_sources.sh
- name: Build mkdocs.yml
run: |
bash docs/scripts/build_mkdocs.sh
- name: Checkout gh-pages
run: |
git fetch origin gh-pages
git checkout gh-pages || git checkout --orphan gh-pages
git pull origin gh-pages || echo "No remote changes to pull"
git checkout main # Switch back before continuing
- name: Build and Deploy Latest Docs
run: |
mike deploy --push --branch gh-pages latest
- name: Build and Deploy Archived Docs
run: |
mike deploy --config-file mkdocs_archived.yml --push --branch gh-pages archived
- name: Set Default Version
run: |
mike set-default latest --push --branch gh-pages
- name: Create alias for Latest Docs
run: |
mike alias latest stable --push --branch gh-pages
================================================
FILE: .github/workflows/publish_package.yml
================================================
name: Publish Package
on:
release:
types: [published]
workflow_dispatch:
jobs:
build-and-publish-pypi:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build twine
- name: Build package
run: python -m build
- name: Upload to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: twine upload dist/*
================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests
on:
- push
- pull_request
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
python-version: ['3.10', '3.11', '3.12', '3.13']
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox tox-gh-actions
- name: Test with tox
run: tox
================================================
FILE: .gitignore
================================================
*.pyc
.pytest_cache/
TPOT.egg-info
TPOT.egg-info
*.tar.gz
*.pkl
*.json
joblib/
cache_folder/
dask-worker-space/
.tox/
*.egg-info/
.coverage
target/
.venv/
build/*
*.egg
*.coverage*
docs/documentation/
mkdocs.yml
dist/
================================================
FILE: ISSUE_TEMPLATE.md
================================================
[provide general introduction to the issue and why it is relevant to this repository]
## Context of the issue
[provide more detailed introduction to the issue itself and why it is relevant]
[the remaining entries are only necessary if you are reporting a bug]
## Process to reproduce the issue
[ordered list the process to finding and recreating the issue, example below. A minimally reproducible example would be ideal. This refers to the minimum amount of code necessary to reproduce the issue.]
1. User creates TPOT instance
2. User calls TPOT `fit()` function with training data
3. TPOT crashes with a `KeyError` after 5 generations
## Expected result
[describe what you would expect to have resulted from this process]
## Current result
[describe what you currently experience from this process, and thereby explain the bug]
## Possible fix
[not necessary, but suggest fixes or reasons for the bug]
## `name of issue` screenshot
[if relevant, include a screenshot]
================================================
FILE: LICENSE
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
================================================
FILE: PULL_REQUEST_TEMPLATE.md
================================================
[please review the [Contribution Guidelines](http://epistasislab.github.io/tpot/contributing/) prior to submitting your pull request. go ahead and delete this line if you've already reviewed said guidelines.]
## What does this PR do?
## Where should the reviewer start?
## How should this PR be tested?
## Any background context you want to provide?
## What are the relevant issues?
[you can link directly to issues by entering # then the number of the issue]
## Screenshots (if appropriate)
## Questions:
- Do the docs need to be updated?
- Does this PR add new (Python) dependencies?
================================================
FILE: README.md
================================================
# TPOT
<center>
<img src="https://raw.githubusercontent.com/EpistasisLab/tpot/master/images/tpot-logo.jpg" width=300 />
</center>
<br>

[](https://pypi.org/project/TPOT)
[](https://anaconda.org/conda-forge/tpot)
TPOT stands for Tree-based Pipeline Optimization Tool. TPOT is a Python Automated Machine Learning tool that optimizes machine learning pipelines using genetic programming. Consider TPOT your Data Science Assistant.
## Contributors
TPOT recently went through a major refactoring. The package was rewritten from scratch to improve efficiency and performance, support new features, and fix numerous bugs. New features include genetic feature selection, a significantly expanded and more flexible method of defining search spaces, multi-objective optimization, a more modular framework allowing for easier customization of the evolutionary algorithm, and more. While in development, this new version was referred to as "TPOT2" but we have now merged what was once TPOT2 into the main TPOT package. You can learn more about this new version of TPOT in our GPTP paper titled "TPOT2: A New Graph-Based Implementation of the Tree-Based Pipeline Optimization Tool for Automated Machine Learning."
Ribeiro, P. et al. (2024). TPOT2: A New Graph-Based Implementation of the Tree-Based Pipeline Optimization Tool for Automated Machine Learning. In: Winkler, S., Trujillo, L., Ofria, C., Hu, T. (eds) Genetic Programming Theory and Practice XX. Genetic and Evolutionary Computation. Springer, Singapore. https://doi.org/10.1007/978-981-99-8413-8_1
The current version of TPOT was developed at Cedars-Sinai by:
- Pedro Henrique Ribeiro (Lead developer - https://github.com/perib, https://www.linkedin.com/in/pedro-ribeiro/)
- Anil Saini (anil.saini@cshs.org)
- Jose Hernandez (jgh9094@gmail.com)
- Jay Moran (jay.moran@cshs.org)
- Nicholas Matsumoto (nicholas.matsumoto@cshs.org)
- Hyunjun Choi (hyunjun.choi@cshs.org)
- Gabriel Ketron (gabriel.ketron@cshs.org)
- Miguel E. Hernandez (miguel.e.hernandez@cshs.org)
- Jason Moore (moorejh28@gmail.com)
The original version of TPOT was primarily developed at the University of Pennsylvania by:
- Randal S. Olson (rso@randalolson.com)
- Weixuan Fu (weixuanf@upenn.edu)
- Daniel Angell (dpa34@drexel.edu)
- Jason Moore (moorejh28@gmail.com)
- and many more generous open-source contributors
## License
Please see the [repository license](https://github.com/EpistasisLab/tpot/blob/main/LICENSE) for the licensing and usage information for TPOT.
Generally, we have licensed TPOT to make it as widely usable as possible.
TPOT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
TPOT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with TPOT. If not, see <http://www.gnu.org/licenses/>.
## Documentation
[The documentation webpage can be found here.](https://epistasislab.github.io/tpot/)
We also recommend looking at the Tutorials folder for jupyter notebooks with examples and guides.
## Installation
TPOT requires a working installation of Python.
### Creating a conda environment (optional)
We recommend using conda environments for installing TPOT, though it would work equally well if manually installed without it.
[More information on making anaconda environments found here.](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)
```
conda create --name tpotenv python=3.10
conda activate tpotenv
```
### Packages Used
python version >=3.10, <3.14
numpy
scipy
scikit-learn
update_checker
tqdm
stopit
pandas
joblib
xgboost
matplotlib
traitlets
lightgbm
optuna
jupyter
networkx
dask
distributed
dask-ml
dask-jobqueue
func_timeout
configspace
Many of the hyperparameter ranges used in our configspaces were adapted from either the original TPOT package or the AutoSklearn package.
### Note for M1 Mac or other Arm-based CPU users
You need to install the lightgbm package directly from conda using the following command before installing TPOT.
This is to ensure that you get the version that is compatible with your system.
```
conda install --yes -c conda-forge 'lightgbm>=3.3.3'
```
### Installing Extra Features with pip
If you want to utilize the additional features provided by TPOT along with `scikit-learn` extensions, you can install them using `pip`. The command to install TPOT with these extra features is as follows:
```
pip install tpot[sklearnex]
```
Please note that while these extensions can speed up scikit-learn packages, there are some important considerations:
These extensions may not be fully developed and tested on Arm-based CPUs, such as M1 Macs. You might encounter compatibility issues or reduced performance on such systems.
We recommend using Python 3.9 when installing these extra features, as it provides better compatibility and stability.
### Developer/Latest Branch Installation
```
pip install -e /path/to/tpotrepo
```
If you downloaded with git pull, then the repository folder will be named TPOT. (Note: this folder is the one that includes setup.py inside of it and not the folder of the same name inside it).
If you downloaded as a zip, the folder may be called tpot-main.
## Usage
See the Tutorials Folder for more instructions and examples.
### Best Practices
#### 1
TPOT uses dask for parallel processing. When Python is parallelized, each module is imported within each processes. Therefore it is important to protect all code within a `if __name__ == "__main__"` when running TPOT from a script. This is not required when running TPOT from a notebook.
For example:
```
#my_analysis.py
import tpot
if __name__ == "__main__":
X, y = load_my_data()
est = tpot.TPOTClassifier()
est.fit(X,y)
#rest of analysis
```
#### 2
When designing custom objective functions, avoid the use of global variables.
Don't Do:
```
global_X = [[1,2],[4,5]]
global_y = [0,1]
def foo(est):
return my_scorer(est, X=global_X, y=global_y)
```
Instead use a partial
```
from functools import partial
def foo_scorer(est, X, y):
return my_scorer(est, X, y)
if __name__=='__main__':
X = [[1,2],[4,5]]
y = [0,1]
final_scorer = partial(foo_scorer, X=X, y=y)
```
Similarly when using lambda functions.
Dont Do:
```
def new_objective(est, a, b)
#definition
a = 100
b = 20
bad_function = lambda est : new_objective(est=est, a=a, b=b)
```
Do:
```
def new_objective(est, a, b)
#definition
a = 100
b = 20
good_function = lambda est, a=a, b=b : new_objective(est=est, a=a, b=b)
```
### Tips
TPOT will not check if your data is correctly formatted. It will assume that you have passed in operators that can handle the type of data that was passed in. For instance, if you pass in a pandas dataframe with categorical features and missing data, then you should also include in your configuration operators that can handle those feautures of the data. Alternatively, if you pass in `preprocessing = True`, TPOT will impute missing values, one hot encode categorical features, then standardize the data. (Note that this is currently fitted and transformed on the entire training set before splitting for CV. Later there will be an option to apply per fold, and have the parameters be learnable.)
Setting `verbose` to 5 can be helpful during debugging as it will print out the error generated by failing pipelines.
## Contributing to TPOT
We welcome you to check the existing issues for bugs or enhancements to work on. If you have an idea for an extension to TPOT, please file a new issue so we can discuss it.
## Citing TPOT
If you use TPOT in a scientific publication, please consider citing at least one of the following papers:
Hernandez, J. G., Saini, A. K., Ghosh, A., & Moore, J. H. (2025). [The tree-based pipeline optimization tool: Tackling biomedical research problems with genetic programming and automated machine learning](https://www.cell.com/patterns/fulltext/S2666-3899(25)00162-X). Patterns, 6(7).
BibTeX entry:
```bibtext
@article{hernandez2025tree,
title={The tree-based pipeline optimization tool: Tackling biomedical research problems with genetic programming and automated machine learning},
author={Hernandez, Jose Guadalupe and Saini, Anil Kumar and Ghosh, Attri and Moore, Jason H},
journal={Patterns},
volume={6},
number={7},
year={2025},
publisher={Elsevier}
}
```
Ribeiro, P., Saini, A., Moran, J., Matsumoto, N., Choi, H., Hernandez, M., & Moore, J. H. (2024). [TPOT2: A New Graph-Based Implementation of the Tree-Based Pipeline Optimization Tool for Automated Machine Learning](https://link.springer.com/chapter/10.1007/978-981-99-8413-8_1). In Genetic programming theory and practice XX (pp. 1-17). Singapore: Springer Nature Singapore.
BitTex entry:
```bibtex
@incollection{ribeiro2024tpot2,
title={TPOT2: A New Graph-Based Implementation of the Tree-Based Pipeline Optimization Tool for Automated Machine Learning},
author={Ribeiro, Pedro and Saini, Anil and Moran, Jay and Matsumoto, Nicholas and Choi, Hyunjun and Hernandez, Miguel and Moore, Jason H},
booktitle={Genetic programming theory and practice XX},
pages={1--17},
year={2024},
publisher={Springer}
}
```
Randal S. Olson, Ryan J. Urbanowicz, Peter C. Andrews, Nicole A. Lavender, La Creis Kidd, and Jason H. Moore (2016). [Automating biomedical data science through tree-based pipeline optimization](http://link.springer.com/chapter/10.1007/978-3-319-31204-0_9). *Applications of Evolutionary Computation*, pages 123-137.
BibTeX entry:
```bibtex
@inbook{Olson2016EvoBio,
author={Olson, Randal S. and Urbanowicz, Ryan J. and Andrews, Peter C. and Lavender, Nicole A. and Kidd, La Creis and Moore, Jason H.},
editor={Squillero, Giovanni and Burelli, Paolo},
chapter={Automating Biomedical Data Science Through Tree-Based Pipeline Optimization},
title={Applications of Evolutionary Computation: 19th European Conference, EvoApplications 2016, Porto, Portugal, March 30 -- April 1, 2016, Proceedings, Part I},
year={2016},
publisher={Springer International Publishing},
pages={123--137},
isbn={978-3-319-31204-0},
doi={10.1007/978-3-319-31204-0_9},
url={http://dx.doi.org/10.1007/978-3-319-31204-0_9}
}
```
Randal S. Olson, Nathan Bartley, Ryan J. Urbanowicz, and Jason H. Moore (2016). [Evaluation of a Tree-based Pipeline Optimization Tool for Automating Data Science](http://dl.acm.org/citation.cfm?id=2908918). *Proceedings of GECCO 2016*, pages 485-492.
BibTeX entry:
```bibtex
@inproceedings{OlsonGECCO2016,
author = {Olson, Randal S. and Bartley, Nathan and Urbanowicz, Ryan J. and Moore, Jason H.},
title = {Evaluation of a Tree-based Pipeline Optimization Tool for Automating Data Science},
booktitle = {Proceedings of the Genetic and Evolutionary Computation Conference 2016},
series = {GECCO '16},
year = {2016},
isbn = {978-1-4503-4206-3},
location = {Denver, Colorado, USA},
pages = {485--492},
numpages = {8},
url = {http://doi.acm.org/10.1145/2908812.2908918},
doi = {10.1145/2908812.2908918},
acmid = {2908918},
publisher = {ACM},
address = {New York, NY, USA},
}
```
## Related Papers
Trang T. Le, Weixuan Fu and Jason H. Moore (2020). [Scaling tree-based automated machine learning to biomedical big data with a feature set selector](https://academic.oup.com/bioinformatics/article/36/1/250/5511404). *Bioinformatics*.36(1): 250-256.
BibTeX entry:
```bibtex
@article{le2020scaling,
title={Scaling tree-based automated machine learning to biomedical big data with a feature set selector},
author={Le, Trang T and Fu, Weixuan and Moore, Jason H},
journal={Bioinformatics},
volume={36},
number={1},
pages={250--256},
year={2020},
publisher={Oxford University Press}
}
```
## Support for TPOT
TPOT was developed in the [Artificial Intelligence Innovation (A2I) Lab](http://epistasis.org/) at Cedars-Sinai with funding from the [NIH](http://www.nih.gov/) under grants U01 AG066833 and R01 LM010098. We are incredibly grateful for the support of the NIH and the Cedars-Sinai during the development of this project.
The TPOT logo was designed by Todd Newmuis, who generously donated his time to the project.
================================================
FILE: Tutorial/1_Using_TPOT.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# What to expect from AutoML software\n",
"Automated machine learning (AutoML) takes a higher-level approach to machine learning than most practitioners are used to, so we've gathered a handful of guidelines on what to expect when running AutoML software such as TPOT.\n",
"\n",
"#### AUTOML ALGORITHMS AREN'T INTENDED TO RUN FOR ONLY A FEW MINUTES\n",
"Of course, you can run TPOT for only a few minutes, and it will find a reasonably good pipeline for your dataset. However, if you don't run TPOT for long enough, it may not find the best possible pipeline for your dataset. It may not even find any suitable pipeline at all, in which case a RuntimeError('A pipeline has not yet been optimized. Please call fit() first.') will be raised. Often it is worthwhile to run multiple instances of TPOT in parallel for a long time (hours to days) to allow TPOT to thoroughly search the pipeline space for your dataset.\n",
"\n",
"#### AUTOML ALGORITHMS CAN TAKE A LONG TIME TO FINISH THEIR SEARCH\n",
"AutoML algorithms aren't as simple as fitting one model on the dataset; they consider multiple machine learning algorithms (random forests, linear models, SVMs, etc.) in a pipeline with multiple preprocessing steps (missing value imputation, scaling, PCA, feature selection, etc.), the hyperparameters for all of the models and preprocessing steps, and multiple ways to ensemble or stack the algorithms within the pipeline.\n",
"\n",
"As such, TPOT will take a while to run on larger datasets, but it's important to realize why. With the default TPOT settings (100 generations with 100 population size), TPOT will evaluate 10,000 pipeline configurations before finishing. To put this number into context, think about a grid search of 10,000 hyperparameter combinations for a machine learning algorithm and how long that grid search will take. That is 10,000 model configurations to evaluate with 10-fold cross-validation, which means that roughly 100,000 models are fit and evaluated on the training data in one grid search. That's a time-consuming procedure, even for simpler models like decision trees.\n",
"\n",
"Typical TPOT runs will take hours to days to finish (unless it's a small dataset), but you can always interrupt the run partway through and see the best results so far. TPOT also provides a warm_start and a periodic_checkpoint_folder parameter that lets you restart a TPOT run from where it left off.\n",
"\n",
"#### AUTOML ALGORITHMS CAN RECOMMEND DIFFERENT SOLUTIONS FOR THE SAME DATASET\n",
"If you're working with a reasonably complex dataset or run TPOT for a short amount of time, different TPOT runs may result in different pipeline recommendations. TPOT's optimization algorithm is stochastic, which means that it uses randomness (in part) to search the possible pipeline space. When two TPOT runs recommend different pipelines, this means that the TPOT runs didn't converge due to lack of time or that multiple pipelines perform more-or-less the same on your dataset.\n",
"\n",
"This is actually an advantage over fixed grid search techniques: TPOT is meant to be an assistant that gives you ideas on how to solve a particular machine learning problem by exploring pipeline configurations that you might have never considered, then leaves the fine-tuning to more constrained parameter tuning techniques such as grid search or bayesian optimization."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TPOT with code\n",
"\n",
"We've designed the TPOT interface to be as similar as possible to scikit-learn.\n",
"\n",
"TPOT can be imported just like any regular Python module. To import TPOT, type:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Matplotlib is building the font cache; this may take a moment.\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n"
]
}
],
"source": [
"import tpot\n",
"from tpot import TPOTClassifier"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"then create an instance of TPOT as follows:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"classification_optimizer = TPOTClassifier()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's also possible to use TPOT for regression problems with the TPOTRegressor class. Other than the class name, a TPOTRegressor is used the same way as a TPOTClassifier. You can read more about the TPOTClassifier and TPOTRegressor classes in the API documentation."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from tpot import TPOTRegressor\n",
"regression_optimizer = TPOTRegressor()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fitting a TPOT model works exactly like any other sklearn estimator. Some example code with custom TPOT parameters might look like:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Generation: : 5it [00:32, 6.57s/it]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"auroc_score: 0.9950396825396826\n"
]
}
],
"source": [
"import sklearn\n",
"import sklearn.datasets\n",
"import sklearn.metrics\n",
"import tpot\n",
"\n",
"classification_optimizer = TPOTClassifier(search_space=\"linear-light\", max_time_mins=30/60, n_jobs=30, cv=5)\n",
"\n",
"X, y = sklearn.datasets.load_breast_cancer(return_X_y=True)\n",
"X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, random_state=1, test_size=0.2)\n",
"\n",
"classification_optimizer.fit(X_train, y_train)\n",
"\n",
"auroc_score = sklearn.metrics.roc_auc_score(y_test, classification_optimizer.predict_proba(X_test)[:,1])\n",
"print(\"auroc_score: \", auroc_score)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Scorers, Objective Functions, and multi objective optimization.\n",
"\n",
"There are two ways of passing objectives into TPOT. \n",
"\n",
"1. `scorers`: Scorers are functions that have the signature (estimator, X_test, y_test) and take in estimators that are expected to be fitted to training data. These can be produced with the [sklearn.metrics.make_scorer](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html) function. This function is used to evaluate the test folds during cross validation (defined in the `cv` parameter). These are passed into TPOT via the scorers parameter. This can take in the scorer itself or the string corresponding to a scoring function ([as listed here](https://scikit-learn.org/stable/modules/model_evaluation.html)). TPOT also supports passing in a list of several scorers for multi-objective optimization. For each fold of CV, TPOT only fits the estimator once, then evaluates all provided scorers in a loop.\n",
"\n",
"2. `other_objective_functions` : Other objective functions in TPOT have the signature (estimator) and returns a float or list of floats. These get passed a single unfitted estimator once, outside of cross validation. The user may choose to fit the pipeline within this objective function as well.\n",
"\n",
"\n",
"\n",
"Each scorer and objective function must be accompanied by a list of weights corresponding to the list of objectives, these are `scorers_weights` and `other_objective_function_weights`, respectively. By default, TPOT maximizes objective functions (this can be changed by `bigger_is_better=False`). Positive weights means that TPOT will seek to maximize that objective, and negative weights correspond to minimization. For most selectors (and the default), only the sign matters. The scale of the weight may matter if using a custom selection function for the optimization algorithm. A zero weight means that the score will not have an impact on the selection algorithm.\n",
"\n",
"Here is an example of using two scorers\n",
"\n",
" scorers=['roc_auc_ovr',tpot.objectives.complexity_scorer],\n",
" scorers_weights=[1,-1],\n",
"\n",
"\n",
"Here is an example with a scorer and a secondary objective function\n",
"\n",
" scorers=['roc_auc_ovr'],\n",
" scorers_weights=[1],\n",
" other_objective_functions=[tpot.objectives.number_of_leaves_objective],\n",
" other_objective_functions_weights=[-1],\n",
"\n",
"\n",
"TPOT will always automatically name the scorers based on the function name for the columns in the final results dataframe. TPOT will use the function name as the column name for `other_objective_functions`. However, if you would like to specify custom column names, you can set the `objective_function_names` to be a list of names (str) for each value returned by the function in `other_objective_functions`. This can be useful if your additional functions return more than one value per function.\n",
"\n",
"It is possible to have either the scorer or other_objective_function to return multiple values. In that case, just make sure that the `scorers_weights` and `other_objective_function_weights` are the same length as the number of returned scores.\n",
"\n",
"\n",
"TPOT comes with a few additional built in objective functions you can use. The first table are objectives applied to fitted pipelines, and thus are passee into the `scorers` parameter. The second table are objective functions for the `other_objective_functions` param.\n",
"\n",
"Scorers:\n",
"| Function | Description |\n",
"| :--- | :----: |\n",
"| tpot.objectives.complexity_scorer | Estimates the number of learned parameters across all classifiers and regressors in the pipelines. Additionally, currently transformers add 1 point and selectors add 0 points (since they don't affect the complexity of the \"final\" predictive pipeline.) |\n",
"\n",
"Other Objective Functions.\n",
"\n",
"| Function | Description |\n",
"| :--- | :----: |\n",
"| tpot.objectives.average_path_length | Computes the average shortest path from all nodes to the root/final estimator (only supported for GraphPipeline) |\n",
"| tpot.objectives.number_of_leaves_objective | Calculates the number of leaves (input nodes) in a GraphPipeline |\n",
"| tpot.objectives.number_of_nodes_objective | Calculates the number of nodes in a pipeline (whether it is an scikit-learn Pipeline, GraphPipeline, Feature Union, or the previous nested within each other) |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measuring Model Complexity\n",
"\n",
"When running TPOT, including a secondary objective that measures model complexity can sometimes be beneficial. More complex models can yield higher performance, but this comes at the cost of interpretability. Simpler models may be more interpretable but often have lower predictive performance. Sometimes, however, vast increases in complexity only marginally improve predictive performance. There may be other simpler and more interpretable pipelines with marginal performance decreases that could be acceptable for the increased interpretability. However, these pipelines are often missed when optimizing purely for performance. By including both performance and complexity as objective functions, TPOT will attempt to optimize the best pipeline for all complexity levels simultaneously. After optimization, the user will be able to see the complexity vs performance tradeoff and decide which pipeline best suits their needs. \n",
"\n",
"Two methods of measuring complexity to consider would be `tpot.objectives.number_of_nodes_objective` or `tpot.objectives.complexity_scorer`. The number of nodes objective simply calculates the number of steps within a pipeline. This is a simple metric, however it does not differentiate between the complexity of different model types. For example, a simple LogisticRegression counts the same as the much more complex XGBoost. The complexity scorer tries to estimate the number of learned parameters included in the classifiers and regressors of the pipeline. It is challenging and potentially subjective how to exactly quantify and compare complexity between different classes of models. However, this function provides a reasonable heuristic for the evolutionary algorithm that at least separates out qualitatively more or less complex algorithms from one another. While it may be hard to compare the relative complexities of LogisticRegression and XGBoost exactly, for example, both will always be on opposite ends of the complexity values returned by this function. This allows for pareto fronts with LogisticRegression on one side, and XGBoost on the other.\n",
"\n",
"An example of this analysis is demonstrated in a following section."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Built In Configurations\n",
"TPOT can be used to optimize hyperparameters, select models, and optimize pipelines of models including determining the sequence of steps. **Tutorial 2** goes into more detail on how to customize search spaces with custom hyperparameter ranges, model types, and possible pipeline configurations. TPOT also comes with a handful of default operators and parameter configurations that we believe work well for optimizing machine learning pipelines. Below is a list of the current built-in configurations that come with TPOT. These can be passed in as strings to the `search space` parameter of any of the TPOT estimators.\n",
"\n",
"| String | Description |\n",
"| :--- | :----: |\n",
"| linear | A linear pipeline with the structure of \"Selector->(transformers+Passthrough)->(classifiers/regressors+Passthrough)->final classifier/regressor.\" For both the transformer and inner estimator layers, TPOT may choose one or more transformers/classifiers, or it may choose none. The inner classifier/regressor layer is optional. |\n",
"| linear-light | Same search space as linear, but without the inner classifier/regressor layer and with a reduced set of faster running estimators. |\n",
"| graph | TPOT will optimize a pipeline in the shape of a directed acyclic graph. The nodes of the graph can include selectors, scalers, transformers, or classifiers/regressors (inner classifiers/regressors can optionally be not included). This will return a custom GraphPipeline rather than an sklearn Pipeline. More details in Tutorial 6. |\n",
"| graph-light | Same as graph search space, but without the inner classifier/regressors and with a reduced set of faster running estimators. |\n",
"| mdr |TPOT will search over a series of feature selectors and Multifactor Dimensionality Reduction models to find a series of operators that maximize prediction accuracy. The TPOT MDR configuration is specialized for genome-wide association studies (GWAS), and is described in detail online here.\n",
"\n",
"Note that TPOT MDR may be slow to run because the feature selection routines are computationally expensive, especially on large datasets. |\n",
"\n",
"The `linear` and `graph` configurations by default allow for additional stacked classifiers/regressors within the pipeline in addition to the final classifier/regressor. If you would like to disable this, you can manually get the search space without inner classifier/regressors through the function `tpot.config.template_search_spaces.get_template_search_spaces` with `inner_predictios=False`. You can pass the resulting search space into the `search space` param. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import tpot\n",
"from tpot.search_spaces.pipelines import SequentialPipeline\n",
"from tpot.config import get_search_space\n",
"\n",
"stc_search_space = SequentialPipeline([\n",
" get_search_space(\"selectors\"),\n",
" get_search_space(\"all_transformers\"),\n",
" get_search_space(\"classifiers\"),\n",
"])\n",
"\n",
"est = tpot.TPOTEstimator(\n",
" search_space = stc_search_space,\n",
" scorers=[\"roc_auc_ovr\", tpot.objectives.complexity_scorer],\n",
" scorers_weights=[1.0, -1.0],\n",
" classification = True,\n",
" cv = 5,\n",
" max_eval_time_mins = 10,\n",
" early_stop = 2,\n",
" verbose = 2,\n",
" n_jobs=4,\n",
")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using a built in method"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"est = tpot.TPOTEstimator(\n",
" search_space = \"linear\",\n",
" scorers=[\"roc_auc_ovr\", tpot.objectives.complexity_scorer],\n",
" scorers_weights=[1.0, -1.0],\n",
" classification = True,\n",
" cv = 5,\n",
" max_eval_time_mins = 10,\n",
" early_stop = 2,\n",
" verbose = 2,\n",
" n_jobs=4,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The specific hyperparameter ranges used by TPOT can be found in files in the tpot/config folder. The template search spaces listed above are defined in tpot/config/template_search_spaces.py. Search spaces for individual models can be acquired in the tpot/config/get_configspace.py file (`tpot.config.get_search_space`). More details on customizing search spaces can be found in Tutorial 2.\n",
"\n",
"\n",
" `tpot.config.template_search_spaces.get_template_search_spaces`\n",
" Returns a search space which can be optimized by TPOT.\n",
"\n",
" Parameters\n",
" ----------\n",
" search_space: str or SearchSpace\n",
" The default search space to use. If a string, it should be one of the following:\n",
" - 'linear': A search space for linear pipelines\n",
" - 'linear-light': A search space for linear pipelines with a smaller, faster search space\n",
" - 'graph': A search space for graph pipelines\n",
" - 'graph-light': A search space for graph pipelines with a smaller, faster search space\n",
" - 'mdr': A search space for MDR pipelines\n",
" If a SearchSpace object, it should be a valid search space object for TPOT.\n",
" \n",
" classification: bool, default=True\n",
" Whether the problem is a classification problem or a regression problem.\n",
"\n",
" inner_predictors: bool, default=None\n",
" Whether to include additional classifiers/regressors before the final classifier/regressor (allowing for ensembles). \n",
" Defaults to False for 'linear-light' and 'graph-light' search spaces, and True otherwise. (Not used for 'mdr' search space)\n",
" \n",
" cross_val_predict_cv: int, default=None\n",
" The number of folds to use for cross_val_predict. \n",
" Defaults to 0 for 'linear-light' and 'graph-light' search spaces, and 5 otherwise. (Not used for 'mdr' search space)\n",
"\n",
" get_search_space_params: dict\n",
" Additional parameters to pass to the get_search_space function.\n",
"\n",
"### cross_val_predict_cv\n",
"\n",
"Additionally, utilizing `cross_val_predict_cv` may increase performance when training models with inner classifiers/regressors. If this parameter is set, during model training any classifiers or regressors that is not the final predictor will use `sklearn.model_selection.cross_val_predict` to pass out of sample predictions into the following steps of the model. The model will still be fit to the full data which will be used for predictions after training. Training downstream models on out of sample predictions can often prevent overfitting and increase performance. The reason is that this gives downstream models a estimate of how upstream models compare on unseen data. Otherwise, if an upsteam model heavily overfits the data, downsteam models may simply learn to blindly trust the seemingly well-predicting model, propagating the over-fitting through to the end result.\n",
"\n",
"The downside is that cross_val_predict_cv is significantly more computationally demanding, and may not be necessary for your given dataset. \n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"linear_with_cross_val_predict_sp = tpot.config.template_search_spaces.get_template_search_spaces(search_space=\"linear\", classification=True, inner_predictors=True, cross_val_predict_cv=5)\n",
"classification_optimizer = TPOTClassifier(search_space=linear_with_cross_val_predict_sp, max_time_mins=30/60, n_jobs=30, cv=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Terminating Optimization (Early Stopping)\n",
"\n",
"Note that we use a short time duration for a quick example, but in practice, you may need to run TPOT for a longer duration. By default, TPOT sets a time limit of 1 hour with a max limit of 5 minutes per pipeline. In practice, you may want to increase these values.\n",
"\n",
"There are three methods of terminating a TPOT run and ending the optimization process. TPOT will terminate as soon as one of the conditions is met.\n",
"* `max_time_mins` : (Default, 60 minutes) After this many minutes, TPOT will terminate and return the best pipeline it found so far.\n",
"* `early_stop` : The number of generations without seeing an improvement in performance, after which TPOT terminates. Generally, a value of around 5 to 20 is sufficient to be reasonably sure that performance has converged.\n",
"* `generations`: The total number of generations of the evolutionary algorithm to run.\n",
"\n",
"By default, TPOT will run until the time limit is up, with no generation or early stop limits."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Best Practices and tips:\n",
"\n",
"* When running tpot from an .py script, it is important to protect code with `if __name__==\"__main__\":` . This is because of how TPOT handles parallelization with Python and Dask."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Generation: : 1it [03:13, 193.20s/it]\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 0 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 1 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 2 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 3 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 4 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 5 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 6 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 7 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 8 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 9 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 10 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 11 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 12 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 13 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 14 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 15 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 16 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 17 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 18 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 19 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 20 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 21 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 22 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 23 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 24 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 25 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 26 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 27 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 28 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 29 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 30 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 31 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 32 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 33 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 34 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 35 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 36 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 37 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 38 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 39 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 40 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 41 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 42 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 43 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 44 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 45 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 46 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 47 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 48 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 49 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 50 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 51 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 52 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 53 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 54 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 55 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 56 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 57 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 58 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/preprocessing/_discretization.py:307: UserWarning: Bins whose width are too small (i.e., <= 1e-8) in feature 59 are removed. Consider decreasing the number of bins.\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.999621947852182\n"
]
}
],
"source": [
"from dask.distributed import Client, LocalCluster\n",
"import tpot\n",
"import sklearn\n",
"import sklearn.datasets\n",
"import numpy as np\n",
"\n",
"if __name__==\"__main__\":\n",
" scorer = sklearn.metrics.get_scorer('roc_auc_ovo')\n",
" X, y = sklearn.datasets.load_digits(return_X_y=True)\n",
" X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, train_size=0.75, test_size=0.25)\n",
"\n",
"\n",
" est = tpot.TPOTClassifier(n_jobs=4, max_time_mins=3, verbose=2, early_stop=3)\n",
" est.fit(X_train, y_train)\n",
"\n",
"\n",
" print(scorer(est, X_test, y_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example analysis and the Estimator class \n",
"\n",
"Here we use a toy example dataset included in scikit-learn. We will use the `light` configuration and the `complexity_scorer` to estimate complexity.\n",
"\n",
"Note, for this toy example, we set a relatively short run time. In practice, we would recommend running TPOT for a longer duration with an `early_stop` value of around 5 to 20 (more details below)."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Generation: : 4it [02:34, 38.64s/it]\n",
"/opt/anaconda3/envs/tpotenv/lib/python3.10/site-packages/sklearn/neural_network/_multilayer_perceptron.py:690: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n",
" warnings.warn(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9978289188015632\n"
]
}
],
"source": [
"from dask.distributed import Client, LocalCluster\n",
"import tpot\n",
"import sklearn\n",
"import sklearn.datasets\n",
"import numpy as np\n",
"\n",
"import tpot.objectives\n",
"\n",
"\n",
"scorer = sklearn.metrics.get_scorer('roc_auc_ovr')\n",
"\n",
"X, y = sklearn.datasets.load_breast_cancer(return_X_y=True)\n",
"X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, train_size=0.75, test_size=0.25)\n",
"\n",
"\n",
"est = tpot.TPOTClassifier(\n",
" scorers=[scorer, tpot.objectives.complexity_scorer],\n",
" scorers_weights=[1.0, -1.0],\n",
"\n",
" search_space=\"linear\",\n",
" n_jobs=4, \n",
" max_time_mins=60, \n",
" max_eval_time_mins=10,\n",
" early_stop=2,\n",
" verbose=2,)\n",
"est.fit(X_train, y_train)\n",
"\n",
"print(scorer(est, X_test, y_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can access the best pipeline selected by TPOT with the `fitted_pipeline_` attribute. This is the pipeline with the highest cross validation score (on the first scorer, or first objective function if no scorer is provided.)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-1 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-1 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-1 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-1 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-1 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-1 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-1 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-1 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n",
" display: block;\n",
"}\n",
"\n",
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[('minmaxscaler', MinMaxScaler()),\n",
" ('selectpercentile',\n",
" SelectPercentile(percentile=68.60012151662)),\n",
" ('featureunion-1',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('featureunion-2',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('mlpclassifier',\n",
" MLPClassifier(activation='identity', alpha=0.0023692590029,\n",
" hidden_layer_sizes=[139, 139],\n",
" learning_rate='invscaling',\n",
" learning_rate_init=0.0004707733364,\n",
" n_iter_no_change=32))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> Pipeline<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[('minmaxscaler', MinMaxScaler()),\n",
" ('selectpercentile',\n",
" SelectPercentile(percentile=68.60012151662)),\n",
" ('featureunion-1',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('featureunion-2',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('mlpclassifier',\n",
" MLPClassifier(activation='identity', alpha=0.0023692590029,\n",
" hidden_layer_sizes=[139, 139],\n",
" learning_rate='invscaling',\n",
" learning_rate_init=0.0004707733364,\n",
" n_iter_no_change=32))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> MinMaxScaler<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.preprocessing.MinMaxScaler.html\">?<span>Documentation for MinMaxScaler</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>MinMaxScaler()</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> SelectPercentile<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.feature_selection.SelectPercentile.html\">?<span>Documentation for SelectPercentile</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>SelectPercentile(percentile=68.60012151662)</pre></div> </div></div><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> featureunion-1: FeatureUnion<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.pipeline.FeatureUnion.html\">?<span>Documentation for featureunion-1: FeatureUnion</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>FeatureUnion(transformer_list=[('skiptransformer', SkipTransformer()),\n",
" ('passthrough', Passthrough())])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>skiptransformer</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">SkipTransformer</label><div class=\"sk-toggleable__content fitted\"><pre>SkipTransformer()</pre></div> </div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>passthrough</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">Passthrough</label><div class=\"sk-toggleable__content fitted\"><pre>Passthrough()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> featureunion-2: FeatureUnion<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.pipeline.FeatureUnion.html\">?<span>Documentation for featureunion-2: FeatureUnion</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>FeatureUnion(transformer_list=[('skiptransformer', SkipTransformer()),\n",
" ('passthrough', Passthrough())])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>skiptransformer</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">SkipTransformer</label><div class=\"sk-toggleable__content fitted\"><pre>SkipTransformer()</pre></div> </div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><label>passthrough</label></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">Passthrough</label><div class=\"sk-toggleable__content fitted\"><pre>Passthrough()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> MLPClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neural_network.MLPClassifier.html\">?<span>Documentation for MLPClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>MLPClassifier(activation='identity', alpha=0.0023692590029,\n",
" hidden_layer_sizes=[139, 139], learning_rate='invscaling',\n",
" learning_rate_init=0.0004707733364, n_iter_no_change=32)</pre></div> </div></div></div></div></div></div>"
],
"text/plain": [
"Pipeline(steps=[('minmaxscaler', MinMaxScaler()),\n",
" ('selectpercentile',\n",
" SelectPercentile(percentile=68.60012151662)),\n",
" ('featureunion-1',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('featureunion-2',\n",
" FeatureUnion(transformer_list=[('skiptransformer',\n",
" SkipTransformer()),\n",
" ('passthrough',\n",
" Passthrough())])),\n",
" ('mlpclassifier',\n",
" MLPClassifier(activation='identity', alpha=0.0023692590029,\n",
" hidden_layer_sizes=[139, 139],\n",
" learning_rate='invscaling',\n",
" learning_rate_init=0.0004707733364,\n",
" n_iter_no_change=32))])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"best_pipeline = est.fitted_pipeline_\n",
"best_pipeline"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,\n",
" 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0,\n",
" 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1,\n",
" 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,\n",
" 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0,\n",
" 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,\n",
" 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"best_pipeline.predict(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving the Pipeline\n",
"\n",
"We recommend using dill or pickle to save the instance of the fitted_pipeline_. Note that we do not recommend pickling the TPOT object itself."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import dill as pickle\n",
"with open(\"best_pipeline.pkl\", \"wb\") as f:\n",
" pickle.dump(best_pipeline, f)\n",
"\n",
"#load the pipeline\n",
"import dill as pickle\n",
"with open(\"best_pipeline.pkl\", \"rb\") as f:\n",
" my_loaded_best_pipeline = pickle.load(f)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The evaluated_individuals Dataframe - Further analysis of results\n",
"\n",
"The `evaluated_individuals` attribute of the tpot estimator object is a Pandas Dataframe containing information about a run. Each row corresponds to an individual pipeline explored by tpot. The dataframe contains the following columns:\n",
"\n",
"| Column | Description |\n",
"| :--- | :----: |\n",
"| \\<n objective function columns\\> | The first set of columns will correspond to each objective function. These can either be automatically named by TPOT, or passed in by the user. |\n",
"| Parents | This contains a tuple that contains the indexes of the 'parents' of the current pipeline. For example, (29, 42) means that the pipelines in indexes 29 and 42 were utilized to generate that pipeline. |\n",
"| Variation_Function | The function applied to the parents to generate the new pipeline |\n",
"| Individual | The individual class that represents a specific pipeline and hyperparameter configuration. This class also contains functions for mutation and crossover. To get the sklearn estimator/pipeline object from the individual you can call the `export_pipeline()` function. (as in, `pipe = ind.export_pipeline()`) |\n",
"| Generation | The generation where the individual was created. (Note that the higher performing pipelines from previous generations may still be present in the current \"population\" of a given generation if selected.) |\n",
"| Submitted Timestamp | Timestamp, in seconds, at which the pipeline was sent to be evaluated. This is the output of time.time(), which is \"Return the time in seconds since the epoch as a floating-point number. \" |\n",
"| Completed Timestamp | Timestamp at which the pipeline evaluation completed in the same units as Submitted Timestamp |\n",
"| Pareto_Front\t | If you have multiple parameters, this column is True if the pipeline performance fall on the pareto front line. This is the set of pipelines with scores that are strictly better than pipelines not on the line, but not strictly better than one another. |\n",
"| Instance | This contains the unfitted pipeline evaluated for this row. (This is the pipeline returned by calling the export_pipeline() function of the individual class) |\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['roc_auc_score', 'complexity_scorer']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#get the score/objective column names generated by TPOT\n",
"est.objective_names"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>roc_auc_score</th>\n",
" <th>complexity_scorer</th>\n",
" <th>Parents</th>\n",
" <th>Variation_Function</th>\n",
" <th>Individual</th>\n",
" <th>Generation</th>\n",
" <th>Submitted Timestamp</th>\n",
" <th>Completed Timestamp</th>\n",
" <th>Eval Error</th>\n",
" <th>Pareto_Front</th>\n",
" <th>Instance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>0.0</td>\n",
" <td>1.740178e+09</td>\n",
" <td>1.740178e+09</td>\n",
" <td>INVALID</td>\n",
" <td>NaN</td>\n",
" <td>(MaxAbsScaler(), RFE(estimator=ExtraTreesClass...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>0.0</td>\n",
" <td>1.740178e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>INVALID</td>\n",
" <td>NaN</td>\n",
" <td>(RobustScaler(quantile_range=(0.1386847479391,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>0.0</td>\n",
" <td>1.740178e+09</td>\n",
" <td>1.740178e+09</td>\n",
" <td>INVALID</td>\n",
" <td>NaN</td>\n",
" <td>(RobustScaler(quantile_range=(0.0087917518794,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>0.0</td>\n",
" <td>1.740178e+09</td>\n",
" <td>1.740178e+09</td>\n",
" <td>INVALID</td>\n",
" <td>NaN</td>\n",
" <td>(Passthrough(), Passthrough(), FeatureUnion(tr...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.969262</td>\n",
" <td>241.2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>0.0</td>\n",
" <td>1.740178e+09</td>\n",
" <td>1.740178e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(RobustScaler(quantile_range=(0.0359502923061,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>245</th>\n",
" <td>0.986280</td>\n",
" <td>44.0</td>\n",
" <td>(184, 184)</td>\n",
" <td>ind_crossover</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(RobustScaler(quantile_range=(0.1428289713161,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>246</th>\n",
" <td>0.902845</td>\n",
" <td>9.0</td>\n",
" <td>(145, 148)</td>\n",
" <td>ind_mutate , ind_mutate , ind_crossover</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(MinMaxScaler(), SelectFwe(alpha=0.00184795618...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>247</th>\n",
" <td>0.992851</td>\n",
" <td>5301.0</td>\n",
" <td>(155, 133)</td>\n",
" <td>ind_mutate , ind_mutate , ind_crossover</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(MaxAbsScaler(), SelectFwe(alpha=0.00212090942...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>248</th>\n",
" <td>0.992349</td>\n",
" <td>7749.0</td>\n",
" <td>(152, 152)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(MinMaxScaler(), SelectFromModel(estimator=Ext...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>249</th>\n",
" <td>0.515242</td>\n",
" <td>9.0</td>\n",
" <td>(182, 182)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>NaN</td>\n",
" <td>(MaxAbsScaler(), VarianceThreshold(threshold=0...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>250 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" roc_auc_score complexity_scorer Parents \\\n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 NaN NaN NaN \n",
"3 NaN NaN NaN \n",
"4 0.969262 241.2 NaN \n",
".. ... ... ... \n",
"245 0.986280 44.0 (184, 184) \n",
"246 0.902845 9.0 (145, 148) \n",
"247 0.992851 5301.0 (155, 133) \n",
"248 0.992349 7749.0 (152, 152) \n",
"249 0.515242 9.0 (182, 182) \n",
"\n",
" Variation_Function \\\n",
"0 NaN \n",
"1 NaN \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN \n",
".. ... \n",
"245 ind_crossover \n",
"246 ind_mutate , ind_mutate , ind_crossover \n",
"247 ind_mutate , ind_mutate , ind_crossover \n",
"248 ind_mutate \n",
"249 ind_mutate \n",
"\n",
" Individual Generation \\\n",
"0 <tpot.search_spaces.pipelines.sequential.Seque... 0.0 \n",
"1 <tpot.search_spaces.pipelines.sequential.Seque... 0.0 \n",
"2 <tpot.search_spaces.pipelines.sequential.Seque... 0.0 \n",
"3 <tpot.search_spaces.pipelines.sequential.Seque... 0.0 \n",
"4 <tpot.search_spaces.pipelines.sequential.Seque... 0.0 \n",
".. ... ... \n",
"245 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"246 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"247 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"248 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"249 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"\n",
" Submitted Timestamp Completed Timestamp Eval Error Pareto_Front \\\n",
"0 1.740178e+09 1.740178e+09 INVALID NaN \n",
"1 1.740178e+09 1.740179e+09 INVALID NaN \n",
"2 1.740178e+09 1.740178e+09 INVALID NaN \n",
"3 1.740178e+09 1.740178e+09 INVALID NaN \n",
"4 1.740178e+09 1.740178e+09 None NaN \n",
".. ... ... ... ... \n",
"245 1.740179e+09 1.740179e+09 None NaN \n",
"246 1.740179e+09 1.740179e+09 None NaN \n",
"247 1.740179e+09 1.740179e+09 None NaN \n",
"248 1.740179e+09 1.740179e+09 None NaN \n",
"249 1.740179e+09 1.740179e+09 None NaN \n",
"\n",
" Instance \n",
"0 (MaxAbsScaler(), RFE(estimator=ExtraTreesClass... \n",
"1 (RobustScaler(quantile_range=(0.1386847479391,... \n",
"2 (RobustScaler(quantile_range=(0.0087917518794,... \n",
"3 (Passthrough(), Passthrough(), FeatureUnion(tr... \n",
"4 (RobustScaler(quantile_range=(0.0359502923061,... \n",
".. ... \n",
"245 (RobustScaler(quantile_range=(0.1428289713161,... \n",
"246 (MinMaxScaler(), SelectFwe(alpha=0.00184795618... \n",
"247 (MaxAbsScaler(), SelectFwe(alpha=0.00212090942... \n",
"248 (MinMaxScaler(), SelectFromModel(estimator=Ext... \n",
"249 (MaxAbsScaler(), VarianceThreshold(threshold=0... \n",
"\n",
"[250 rows x 11 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = est.evaluated_individuals\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let's plot the performances of the different pipelines, including the Pareto front\n",
"\n",
"Plotting the performance of multiple objectives in a scatterplot is a helpful way to visualize the tradeoff between model complexity and predictive performance. This is best visualized when plotting the Pareto front pipelines, which present the best-performing pipeline along the spectrum of complexity. Generally, higher complexity models may yield higher performance but be more difficult to interpret. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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33+XqlSpIr366quSO7/uCRMmSFWrVpU2b94sXbhwQfrkk0+kwMBA6ciRI5Ir+fXXX6W33npL2rBhA88EkX788UeDx1+8eFEKDg6Wxo8fL506dUpatGiR+DvfsmWLxdeCwOmG2rRpIyUkJCjvl5SUiH84s2fP1nk8f2CGh4dLnva6P/30U6lWrVqSQqGQPOl1a/r444+lcuXKSTk5OZI7v24+tlu3bmrb+EM1Pj5ecufXzV8OFi9erLbtsccek5555hnJVZERgZO/MDRs2FBt26BBg6SePXta/PzoqnUzCoWCDh8+TD169FCrx8v3Dxw4oPdxOTk5FBsbK7qv+vXrR//88w+5++v++eefqV27dqKrtlKlStSoUSOaNWsWlZSUkLv/vlV9+eWX9NRTT1FISAi58+tu3769eIzcrXnx4kXRLd+7d29y59ddWFioNfTCXdV79+4ld3bgwAG194n17NnT6H8XhiBwupm0tDTxwc+BQBXfv3nzps7H8JjP8uXL6aeffqJvvvlGrBjDHzJXr14ld37d/MG5bt068Tj+AH3nnXdo7ty5NGPGDHLn162Kg8jJkyfphRdeIFdizut++umnxVhfhw4dyM/PT4z58Xjvm2++Se78ujlYzJs3j86fPy/+bf/vf/+jDRs20I0bN8id3bx5U+f7xCuo5OfnW3RuBE4Qra7nn3+emjVrRp07dxb/qCpUqECff/45uTP+EKlYsSJ98cUX1LJlSxo0aBC99dZb9Nlnn5Gn4NZm48aNqU2bNuTuOFGEexQ++eQTOnLkiPg737x5M7333nvkzhYsWEB169al+++/n/z9/Wn06NE0bNiwMpfOAv08flkxdxMdHU0+Pj5069Ytte18v3Llykadg7+NN2/enJKSksidXzdn0vJr5cfJ6tevL76pcpcYf8i48+87NzeX1qxZI1phrsac1809Cs8995yydc1fGPg9ePHFF8UXJlcIJOa8bv4SzBmonD2cnp4uslInTZpEtWrVIndWuXJlne8TLzfGXdWWcP6/FDAJf9hz62nbtm1qLSu+zy1LY3BX0IkTJ0RgcefXHR8fL74c8HGyc+fOidftCkHT0t/32rVrxfjXs88+S67GnNedl5enFRzlL02uUrLbkt83j3NWq1aNiouLaf369SKXwZ21a9dO7X1i3E1t7OegQRanF4FTpqtz2v3KlStFGvaLL74o0tXlKSbPPfecNGnSJOXx7777rkjN51T1w4cPS0899ZRIV+dUd3d+3ZcvXxbZpKNHj5bOnj0rbdq0SapYsaI0Y8YMyZ1ft6xDhw4iy9BVmfq6p06dKn7fq1evFlMVtm7dKtWuXVt68sknJXd+3X/++ae0fv168e979+7dIrM4Li5OysjIkFzJnTt3pMTERHHj0DVv3jzx86VLl8R+fs382jWno7zxxhvS6dOnpSVLlmA6ChjGc5ZiYmLEfC9OX+d/PLLOnTtLQ4YMUd5/5ZVXlMdWqlRJzGt0tTle5rxutn//fqlt27big4inpsycOVMqLi6W3P11nzlzRnz4cPBwZaa87qKiImnatGkiWPIXwxo1akijRo1yuQBi6uvmucn169cXf+NRUVEiuFy7dk1yNTt27BB/s5o3+bXy//m1az6mWbNm4n3if9/WmquMZcUAAABMgDFOAAAAEyBwAgAAmACBEwAAwAQInAAAACZA4AQAADABAicAAIAJEDgBAABMgMAJAABgAgROAAAAEyBwAgAAmACBE8BGeGkysA68l+BMEDgBrKRLly5ikeBXXnlFrJvYs2dP2rVrl1gkOiAgQCxXxusg8rJOqktCffjhh1SnTh1xTExMDM2cOdOo55s4cSLdd999FBwcLNZW5PUmi4qKlPuHDh1K/fv3V3sMXxtfp6XPz4GMXyu/Jl6uKjY2lmbPnq3cn5mZSS+99BJVqlRJ7G/UqBFt2rRJuZ+XtWrYsKF4zpo1a9LcuXPVzs/beIFpXmCd10/kNTPZ3r17qWPHjmI9xRo1atDYsWPFmpoA9oSFrAGsaNWqVfTyyy/Tvn37xILYvXv3FgHsq6++ojNnztDIkSNFIJk2bZo4fvLkybR06VL6+OOPqUOHDnTjxg1xnDHKlStHK1euFAsT8/qpfG7eNmHCBKOv19znX7hwIf3888/0ww8/iGB75coVcZODca9evejOnTv0zTffUO3atenUqVPKtS8PHz5MTz75pHgPBg0aRPv376dRo0ZRVFSUeK9kH330EU2ZMoWmTp0q7l+4cIEefvhhmjFjBi1fvpxSU1NF8ObbihUrjH7NABazyhorACCWNGrevLny/ptvvinVq1dPKi0tVW7jNQFDQ0OlkpISKTs7Wyz1tHTpUqs8/5w5c6SWLVsq7/MyS/369VM7Zty4ccqllyx5/jFjxoh1HVVfm4zXdvX29hZrnOry9NNPSw8++KDaNl4zsUGDBsr7sbGxUv/+/dWOGTFihFh7UtWePXvEc+Xn55v8GgDMha5aACtq2bKl8ufTp0+L1ea9vLyU2+Lj4yknJ4euXr0q9hcWFlL37t3Neq7vv/9enK9y5coUGhpKb7/9Nl2+fNnox1vy/NwyPHr0KNWrV090l27dulW5j7dXr15ddCPre16+blV8//z581RSUqLc1qpVK7Vjjh07JlrY/FrlG3eHcws3OTnZ5NcAYC4ETgArCgkJMfpYHqcz14EDB+iZZ54RXcE8dpiYmEhvvfWWWhKNt7c39yipPU51DNSS52/RooUIVjwOmZ+fL7peH3/8cYvPa+i95C8cPG7KgVm+cTDlgMvdwQD2gsAJYCP169cXAU41ePHYJ49Dcousbt26Ishs27bN5HPzuCAn5HCw5JYZn+vSpUtqx1SoUEGMWariYCOz5PkZJ+3wGCWPkXLrlxN+bt++TU2aNBEt6nPnzul9X/h9UMX3uYUqj4PqC9Y8VsqJTJo3f39/s14DgFnM7uQFADU8dshjiLKrV69KwcHBUkJCgnT69Glp48aNUnR0tDR16lTlMdOmTZMiIyOlVatWSUlJSdKBAwekZcuWlflcP/30k+Tr6yutXr1aPG7BggVS+fLlpfDwcOUxW7Zskby8vMS5z507J02ZMkUKCwtTjnFa8vxz586VvvvuO/G6eCyTxx8rV64sxm5Zly5dpEaNGklbt26VLl68KP3666/Sb7/9JvYdPnxYjEtOnz5dPHblypVSUFCQtGLFCrUxzo8//ljtOY8dOyaO4/czMTFRvCZ+T/k+gD0hcALYKHCynTt3Sq1bt5b8/f1FYJk4caJUVFSk3M+BZsaMGSJQ+Pn5STExMdKsWbOMej5OqImKihLJRoMGDRKBRjVwMg6WlSpVEttfffVVafTo0WqB09zn/+KLL6RmzZpJISEhIhh3795dOnLkiHJ/enq6NGzYMHF9gYGBIohu2rRJuX/dunUiGUh+Tk5sUqUrcLKDBw+KxCJ+zfzcTZo0kWbOnGnU+wVgLV78H/PaqgAAAJ4HY5wAAAAmQOAEcEKzZs1Sm3aheuPiAu7+/ADODF21AE6Is1P5pgtnwlarVs2tnx/AmSFwAgAAmABdtQAAACZA4AQAADABAicAAIAJEDgBAABMgMAJAABgAgROAAAAEyBwAgAAkPH+H5r4UFDPQKkAAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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aJdO3X/9/OhrqN09U7qf+mWEa/hXjpY4pV+CaCuUhh/9AkB/T8l7M6XHLCXHHUAQsAAgwEycONHS/74WL15snTp1yjp06JA1depUK0uWLFb69Omtw4cPW3/++aeVNm1aa+DAgW6P3bZtmxUeHu42/YknnjDrGzt27E3P1bx5cys6Otpt2ubNm83yr776qtv0bt26mek//fSTc1qBAgXMtPnz57stu3TpUjO9ZMmS1tWrV53TGzdubIWFhVl16tRxWz4+Pt6sy9XFixdv2t7atWtbhQsXdpvm2Iaff/7ZOe3kyZNWZGSk1bVrV+e0vn37muVmzpx503pv3Lhhfn755ZdWmjRprBUrVrjN19dOH7ty5UrrVnQ/s2fPbvb50qVLzulz5swxj9XnT3qM169fb91J/fr1rYiICGvfvn3OaUePHrUyZsxoPf744zets0aNGs79UZ07dzbvlTNnzri9J/TmsGDBAvPYefPmuT136dKl3ZZLjr5H9bH9+vVL9v2l8wYMGOA2vVy5claFChWc9/X11uWmTJnitpy+r5KbnpQ+ty63Z88esz379++3xo0bZ94DOXLksC5cuGBdv37dunLlitvjTp8+bea/8sorzmn6WF1XbGyseR+5ql69ulWqVCnr8uXLzmn6WlepUsUqWrSoc9r06dPNOvRz4ErXp8eyVq1aVmJionP6p59+apafMGHCbffTcYyTu7l+7vQz4vr5sfPeTOkxu91xBxAc6NoHIGDpN9b6za92LdOWJG050NYg/TZcx31o64m2Ruk3045bzpw5pWjRojd1V9Jv1PXb6JTQghZKu4e50pYpNXfuXLfp2qKi314nR7vNuX7Drt9wawuHtgi50unaJVG7FDq4jrNyfAP/xBNPyB9//GHuu9Juf9pq46Cvm7b66LIO2mJQpkwZ8w16Uo5CBNr1SVsOHnroIbfX1dFFLOnr6mrDhg1m7JO2mmmXL4e6deua9SV93VJCWwa0aIK2eGh3RYdcuXLJv//9b9NylrQqnbaguBZW0NdF13PgwIHbvte0i9mUKVOc07SoydatW00L5t3S8UqudJtcj42+7trdrmbNmm6vu7Yo6vv+dq+7Kz3meuz1PaktXNo9U1937d6mLW2OMU762fnnn3/M+01bZjdt2nTTunR8laP7mtLltXCFfua0Ncuxjdraq+//vXv33tRNLilt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",
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"#replace nans in pareto front with 0\n",
"fig, ax = plt.subplots(figsize=(5,5))\n",
"sns.scatterplot(df[df['Pareto_Front']!=1], x='roc_auc_score', y='complexity_scorer', label='other', ax=ax)\n",
"sns.scatterplot(df[df['Pareto_Front']==1], x='roc_auc_score', y='complexity_scorer', label='Pareto Front', ax=ax)\n",
"ax.title.set_text('Performance of all pipelines')\n",
"#log scale y\n",
"ax.set_yscale('log')\n",
"plt.show()\n",
"\n",
"#replace nans in pareto front with 0\n",
"fig, ax = plt.subplots(figsize=(10,5))\n",
"sns.scatterplot(df[df['Pareto_Front']==1], x='roc_auc_score', y='complexity_scorer', label='Pareto Front', ax=ax)\n",
"ax.title.set_text('Performance of only the Pareto Front')\n",
"#log scale y\n",
"# ax.set_yscale('log')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>roc_auc_score</th>\n",
" <th>complexity_scorer</th>\n",
" <th>Parents</th>\n",
" <th>Variation_Function</th>\n",
" <th>Individual</th>\n",
" <th>Generation</th>\n",
" <th>Submitted Timestamp</th>\n",
" <th>Completed Timestamp</th>\n",
" <th>Eval Error</th>\n",
" <th>Pareto_Front</th>\n",
" <th>Instance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>0.996818</td>\n",
" <td>582.0</td>\n",
" <td>(13, 13)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>1.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(MinMaxScaler(), SelectPercentile(percentile=6...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>0.996239</td>\n",
" <td>31.0</td>\n",
" <td>(65, 65)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>2.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(StandardScaler(), SelectFwe(alpha=0.002276474...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>185</th>\n",
" <td>0.995843</td>\n",
" <td>30.9</td>\n",
" <td>(133, 133)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>3.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(StandardScaler(), SelectFwe(alpha=0.000234016...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>233</th>\n",
" <td>0.995115</td>\n",
" <td>30.7</td>\n",
" <td>(185, 185)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(StandardScaler(), SelectFwe(alpha=0.000234016...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85</th>\n",
" <td>0.990894</td>\n",
" <td>26.0</td>\n",
" <td>(6, 23)</td>\n",
" <td>ind_crossover</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>1.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(MaxAbsScaler(), SelectFwe(alpha=0.00114277554...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>228</th>\n",
" <td>0.990081</td>\n",
" <td>19.0</td>\n",
" <td>(162, 162)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(MaxAbsScaler(), VarianceThreshold(threshold=0...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>215</th>\n",
" <td>0.988614</td>\n",
" <td>9.0</td>\n",
" <td>(162, 162)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>4.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(MaxAbsScaler(), VarianceThreshold(threshold=0...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>121</th>\n",
" <td>0.982524</td>\n",
" <td>7.0</td>\n",
" <td>(10, 10)</td>\n",
" <td>ind_mutate</td>\n",
" <td><tpot.search_spaces.pipelines.sequential.Seque...</td>\n",
" <td>2.0</td>\n",
" <td>1.740179e+09</td>\n",
" <td>1.740179e+09</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>(MaxAbsScaler(), SelectFwe(alpha=0.03019980124...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" roc_auc_score complexity_scorer Parents Variation_Function \\\n",
"51 0.996818 582.0 (13, 13) ind_mutate \n",
"133 0.996239 31.0 (65, 65) ind_mutate \n",
"185 0.995843 30.9 (133, 133) ind_mutate \n",
"233 0.995115 30.7 (185, 185) ind_mutate \n",
"85 0.990894 26.0 (6, 23) ind_crossover \n",
"228 0.990081 19.0 (162, 162) ind_mutate \n",
"215 0.988614 9.0 (162, 162) ind_mutate \n",
"121 0.982524 7.0 (10, 10) ind_mutate \n",
"\n",
" Individual Generation \\\n",
"51 <tpot.search_spaces.pipelines.sequential.Seque... 1.0 \n",
"133 <tpot.search_spaces.pipelines.sequential.Seque... 2.0 \n",
"185 <tpot.search_spaces.pipelines.sequential.Seque... 3.0 \n",
"233 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"85 <tpot.search_spaces.pipelines.sequential.Seque... 1.0 \n",
"228 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"215 <tpot.search_spaces.pipelines.sequential.Seque... 4.0 \n",
"121 <tpot.search_spaces.pipelines.sequential.Seque... 2.0 \n",
"\n",
" Submitted Timestamp Completed Timestamp Eval Error Pareto_Front \\\n",
"51 1.740179e+09 1.740179e+09 None 1.0 \n",
"133 1.740179e+09 1.740179e+09 None 1.0 \n",
"185 1.740179e+09 1.740179e+09 None 1.0 \n",
"233 1.740179e+09 1.740179e+09 None 1.0 \n",
"85 1.740179e+09 1.740179e+09 None 1.0 \n",
"228 1.740179e+09 1.740179e+09 None 1.0 \n",
"215 1.740179e+09 1.740179e+09 None 1.0 \n",
"121 1.740179e+09 1.740179e+09 None 1.0 \n",
"\n",
" Instance \n",
"51 (MinMaxScaler(), SelectPercentile(percentile=6... \n",
"133 (StandardScaler(), SelectFwe(alpha=0.002276474... \n",
"185 (StandardScaler(), SelectFwe(alpha=0.000234016... \n",
"233 (StandardScaler(), SelectFwe(alpha=0.000234016... \n",
"85 (MaxAbsScaler(), SelectFwe(alpha=0.00114277554... \n",
"228 (MaxAbsScaler(), VarianceThreshold(threshold=0... \n",
"215 (MaxAbsScaler(), VarianceThreshold(threshold=0... \n",
"121 (MaxAbsScaler(), SelectFwe(alpha=0.03019980124... "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#plot only the pareto front pipelines\n",
"sorted_pareto_front = df[df['Pareto_Front']==1].sort_values('roc_auc_score', ascending=False)\n",
"sorted_pareto_front"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In some cases, you may want to select a slightly lower performing pipeline that is signficantly less complex."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-2 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: black;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-2 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-2 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-2 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-2 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: block;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content {\n",
" max-height: 0;\n",
" max-width: 0;\n",
" overflow: hidden;\n",
" text-align: left;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
" margin: 0.2em;\n",
" border-radius: 0.25em;\n",
" color: var(--sklearn-color-text);\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
" /* Expand drop-down */\n",
" max-height: 200px;\n",
" max-width: 100%;\n",
" overflow: auto;\n",
"}\n",
"\n",
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
" content: \"▾\";\n",
"}\n",
"\n",
"/* Pipeline/ColumnTransformer-specific style */\n",
"\n",
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator-specific style */\n",
"\n",
"/* Colorize estimator box */\n",
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
"#sk-container-id-2 div.sk-label label {\n",
" /* The background is the default theme color */\n",
" color: var(--sklearn-color-text-on-default-background);\n",
"}\n",
"\n",
"/* On hover, darken the color of the background */\n",
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"/* Label box, darken color on hover, fitted */\n",
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
" color: var(--sklearn-color-text);\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Estimator label */\n",
"\n",
"#sk-container-id-2 div.sk-label label {\n",
" font-family: monospace;\n",
" font-weight: bold;\n",
" display: inline-block;\n",
" line-height: 1.2em;\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-label-container {\n",
" text-align: center;\n",
"}\n",
"\n",
"/* Estimator-specific */\n",
"#sk-container-id-2 div.sk-estimator {\n",
" font-family: monospace;\n",
" border: 1px dotted var(--sklearn-color-border-box);\n",
" border-radius: 0.25em;\n",
" box-sizing: border-box;\n",
" margin-bottom: 0.5em;\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-0);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-0);\n",
"}\n",
"\n",
"/* on hover */\n",
"#sk-container-id-2 div.sk-estimator:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-2);\n",
"}\n",
"\n",
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-2);\n",
"}\n",
"\n",
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
"\n",
"/* Common style for \"i\" and \"?\" */\n",
"\n",
".sk-estimator-doc-link,\n",
"a:link.sk-estimator-doc-link,\n",
"a:visited.sk-estimator-doc-link {\n",
" float: right;\n",
" font-size: smaller;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1em;\n",
" height: 1em;\n",
" width: 1em;\n",
" text-decoration: none !important;\n",
" margin-left: 1ex;\n",
" /* unfitted */\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted,\n",
"a:link.sk-estimator-doc-link.fitted,\n",
"a:visited.sk-estimator-doc-link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
".sk-estimator-doc-link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover,\n",
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
".sk-estimator-doc-link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"/* Span, style for the box shown on hovering the info icon */\n",
".sk-estimator-doc-link span {\n",
" display: none;\n",
" z-index: 9999;\n",
" position: relative;\n",
" font-weight: normal;\n",
" right: .2ex;\n",
" padding: .5ex;\n",
" margin: .5ex;\n",
" width: min-content;\n",
" min-width: 20ex;\n",
" max-width: 50ex;\n",
" color: var(--sklearn-color-text);\n",
" box-shadow: 2pt 2pt 4pt #999;\n",
" /* unfitted */\n",
" background: var(--sklearn-color-unfitted-level-0);\n",
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link.fitted span {\n",
" /* fitted */\n",
" background: var(--sklearn-color-fitted-level-0);\n",
" border: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"\n",
".sk-estimator-doc-link:hover span {\n"
gitextract_i76kzk_w/
├── .github/
│ └── workflows/
│ ├── docs.yml
│ ├── publish_package.yml
│ └── tests.yml
├── .gitignore
├── ISSUE_TEMPLATE.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── Tutorial/
│ ├── 1_Using_TPOT.ipynb
│ ├── 2_Search_Spaces.ipynb
│ ├── 3_Feature_Set_Selector.ipynb
│ ├── 4_Genetic_Feature_Selection.ipynb
│ ├── 5_GraphPipeline.ipynb
│ ├── 6_Symbolic_Regression_and_Classification.ipynb
│ ├── 7_dask_parallelization.ipynb
│ ├── 8_SH_and_cv_early_pruning.ipynb
│ ├── 9_Genetic_Algorithm_Overview.ipynb
│ ├── amltk_search_space_parser_example.ipynb
│ └── simple_fss.csv
├── docs/
│ ├── archived/
│ │ ├── api.md
│ │ ├── citing.md
│ │ ├── contributing.md
│ │ ├── css/
│ │ │ └── archived.css
│ │ ├── examples.md
│ │ ├── index.md
│ │ ├── installing.md
│ │ ├── related.md
│ │ ├── releases.md
│ │ ├── support.md
│ │ └── using.md
│ ├── cite.md
│ ├── contribute.md
│ ├── css/
│ │ └── extra.css
│ ├── index.md
│ ├── installation.md
│ ├── related.md
│ ├── requirements_docs.txt
│ ├── scripts/
│ │ ├── build_docs_sources.sh
│ │ ├── build_mkdocs.sh
│ │ └── build_tutorial_toc_not_used.sh
│ ├── support.md
│ ├── tpot_api/
│ │ ├── classifier.md
│ │ ├── estimator.md
│ │ └── regressor.md
│ └── using.md
├── mkdocs_archived.yml
├── pyproject.toml
├── tox.ini
└── tpot/
├── __init__.py
├── _version.py
├── builtin_modules/
│ ├── __init__.py
│ ├── arithmetictransformer.py
│ ├── column_one_hot_encoder.py
│ ├── estimatortransformer.py
│ ├── feature_encoding_frequency_selector.py
│ ├── feature_set_selector.py
│ ├── feature_transformers.py
│ ├── genetic_encoders.py
│ ├── imputer.py
│ ├── nn.py
│ ├── passkbinsdiscretizer.py
│ ├── passthrough.py
│ ├── tests/
│ │ └── feature_set_selector_tests.py
│ └── zero_count.py
├── config/
│ ├── __init__.py
│ ├── autoqtl_builtins.py
│ ├── classifiers.py
│ ├── classifiers_sklearnex.py
│ ├── get_configspace.py
│ ├── imputers.py
│ ├── mdr_configs.py
│ ├── regressors.py
│ ├── regressors_sklearnex.py
│ ├── selectors.py
│ ├── special_configs.py
│ ├── template_search_spaces.py
│ ├── tests/
│ │ ├── __init__.py
│ │ └── test_get_configspace.py
│ └── transformers.py
├── evolvers/
│ ├── __init__.py
│ ├── base_evolver.py
│ └── steady_state_evolver.py
├── graphsklearn.py
├── individual.py
├── logbook.py
├── objectives/
│ ├── __init__.py
│ ├── average_path_length.py
│ ├── complexity.py
│ ├── number_of_leaves.py
│ ├── number_of_nodes.py
│ └── tests/
│ ├── test_complexity_objective.py
│ └── test_number_of_nodes.py
├── old_config_utils/
│ ├── __init__.py
│ └── old_config_utils.py
├── population.py
├── search_spaces/
│ ├── __init__.py
│ ├── base.py
│ ├── graph_utils.py
│ ├── nodes/
│ │ ├── __init__.py
│ │ ├── estimator_node.py
│ │ ├── estimator_node_gradual.py
│ │ ├── fss_node.py
│ │ └── genetic_feature_selection.py
│ ├── pipelines/
│ │ ├── __init__.py
│ │ ├── choice.py
│ │ ├── dynamic_linear.py
│ │ ├── dynamicunion.py
│ │ ├── graph.py
│ │ ├── sequential.py
│ │ ├── tests/
│ │ │ └── test_graphspace.py
│ │ ├── tree.py
│ │ ├── union.py
│ │ └── wrapper.py
│ ├── tests/
│ │ └── test_search_spaces.py
│ └── tuple_index.py
├── selectors/
│ ├── __init__.py
│ ├── lexicase_selection.py
│ ├── map_elites_selection.py
│ ├── max_weighted_average_selector.py
│ ├── nsgaii.py
│ ├── random_selector.py
│ ├── tournament_selection.py
│ └── tournament_selection_dominated.py
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_estimators.py
│ └── test_hello_world.py
├── tpot_estimator/
│ ├── __init__.py
│ ├── cross_val_utils.py
│ ├── estimator.py
│ ├── estimator_utils.py
│ ├── steady_state_estimator.py
│ ├── templates/
│ │ ├── __init__.py
│ │ ├── tpot_autoimputer.py
│ │ └── tpottemplates.py
│ └── tests/
│ ├── __init__.py
│ └── test_estimator_utils.py
└── utils/
├── __init__.py
├── amltk_parser.py
├── eval_utils.py
└── utils.py
SYMBOL INDEX (694 symbols across 72 files)
FILE: tpot/builtin_modules/arithmetictransformer.py
class ArithmeticTransformer (line 43) | class ArithmeticTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 46) | def __init__(self, function,):
method fit (line 71) | def fit(self, X, y=None):
method transform (line 74) | def transform(self, X):
method transform_helper (line 81) | def transform_helper(self, X):
function issorted (line 128) | def issorted(x, rev=False):
class AddTransformer (line 143) | class AddTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 144) | def __init__(self):
method fit (line 150) | def fit(self, X, y=None):
method transform (line 153) | def transform(self, X):
method transform_helper (line 160) | def transform_helper(self, X):
class mul_neg_1_Transformer (line 166) | class mul_neg_1_Transformer(TransformerMixin, BaseEstimator):
method __init__ (line 167) | def __init__(self):
method fit (line 173) | def fit(self, X, y=None):
method transform (line 176) | def transform(self, X):
method transform_helper (line 183) | def transform_helper(self, X):
class MulTransformer (line 189) | class MulTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 191) | def __init__(self):
method fit (line 197) | def fit(self, X, y=None):
method transform (line 200) | def transform(self, X):
method transform_helper (line 207) | def transform_helper(self, X):
class SafeReciprocalTransformer (line 213) | class SafeReciprocalTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 215) | def __init__(self):
method fit (line 221) | def fit(self, X, y=None):
method transform (line 224) | def transform(self, X):
method transform_helper (line 231) | def transform_helper(self, X):
class EQTransformer (line 237) | class EQTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 239) | def __init__(self):
method fit (line 245) | def fit(self, X, y=None):
method transform (line 248) | def transform(self, X):
method transform_helper (line 255) | def transform_helper(self, X):
class NETransformer (line 261) | class NETransformer(TransformerMixin, BaseEstimator):
method __init__ (line 263) | def __init__(self):
method fit (line 269) | def fit(self, X, y=None):
method transform (line 272) | def transform(self, X):
method transform_helper (line 279) | def transform_helper(self, X):
class GETransformer (line 287) | class GETransformer(TransformerMixin, BaseEstimator):
method __init__ (line 289) | def __init__(self):
method fit (line 295) | def fit(self, X, y=None):
method transform (line 298) | def transform(self, X):
method transform_helper (line 305) | def transform_helper(self, X):
class GTTransformer (line 313) | class GTTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 314) | def __init__(self):
method fit (line 320) | def fit(self, X, y=None):
method transform (line 323) | def transform(self, X):
method transform_helper (line 330) | def transform_helper(self, X):
class LETransformer (line 338) | class LETransformer(TransformerMixin, BaseEstimator):
method __init__ (line 339) | def __init__(self):
method fit (line 345) | def fit(self, X, y=None):
method transform (line 348) | def transform(self, X):
method transform_helper (line 355) | def transform_helper(self, X):
class LTTransformer (line 363) | class LTTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 364) | def __init__(self):
method fit (line 370) | def fit(self, X, y=None):
method transform (line 373) | def transform(self, X):
method transform_helper (line 380) | def transform_helper(self, X):
class MinTransformer (line 388) | class MinTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 389) | def __init__(self):
method fit (line 395) | def fit(self, X, y=None):
method transform (line 398) | def transform(self, X):
method transform_helper (line 405) | def transform_helper(self, X):
class MaxTransformer (line 413) | class MaxTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 415) | def __init__(self):
method fit (line 421) | def fit(self, X, y=None):
method transform (line 424) | def transform(self, X):
method transform_helper (line 431) | def transform_helper(self, X):
class ZeroTransformer (line 438) | class ZeroTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 440) | def __init__(self):
method fit (line 446) | def fit(self, X, y=None):
method transform (line 449) | def transform(self, X):
method transform_helper (line 456) | def transform_helper(self, X):
class OneTransformer (line 463) | class OneTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 464) | def __init__(self):
method fit (line 470) | def fit(self, X, y=None):
method transform (line 473) | def transform(self, X):
method transform_helper (line 480) | def transform_helper(self, X):
class NTransformer (line 487) | class NTransformer(TransformerMixin, BaseEstimator):
method __init__ (line 489) | def __init__(self, n):
method fit (line 495) | def fit(self, X, y=None):
method transform (line 498) | def transform(self, X):
method transform_helper (line 505) | def transform_helper(self, X):
FILE: tpot/builtin_modules/column_one_hot_encoder.py
function auto_select_categorical_features (line 49) | def auto_select_categorical_features(X, min_unique=10,):
function _X_selected (line 58) | def _X_selected(X, selected):
class ColumnOneHotEncoder (line 72) | class ColumnOneHotEncoder(TransformerMixin, BaseEstimator ):
method __init__ (line 75) | def __init__(self, columns='auto', drop=None, handle_unknown='infreque...
method fit (line 103) | def fit(self, X, y=None):
method transform (line 167) | def transform(self, X):
class ColumnOrdinalEncoder (line 208) | class ColumnOrdinalEncoder(TransformerMixin, BaseEstimator ):
method __init__ (line 211) | def __init__(self, columns='auto', handle_unknown='error', unknown_val...
method fit (line 238) | def fit(self, X, y=None):
method transform (line 300) | def transform(self, X):
FILE: tpot/builtin_modules/estimatortransformer.py
class EstimatorTransformer (line 44) | class EstimatorTransformer(TransformerMixin, BaseEstimator ):
method __init__ (line 45) | def __init__(self, estimator, method='auto', passthrough=False, cross_...
method fit (line 74) | def fit(self, X, y=None):
method transform (line 78) | def transform(self, X, y=None):
method fit_transform (line 105) | def fit_transform(self, X, y=None):
method _estimator_has (line 136) | def _estimator_has(attr):
method predict (line 146) | def predict(self, X, **predict_params):
method predict_proba (line 154) | def predict_proba(self, X, **predict_params):
method decision_function (line 160) | def decision_function(self, X, **predict_params):
method __sklearn_is_fitted__ (line 165) | def __sklearn_is_fitted__(self):
method classes_ (line 179) | def classes_(self):
FILE: tpot/builtin_modules/feature_encoding_frequency_selector.py
class FeatureEncodingFrequencySelector (line 9) | class FeatureEncodingFrequencySelector(SelectorMixin, BaseEstimator):
method __name__ (line 14) | def __name__(self):
method __init__ (line 18) | def __init__(self, threshold):
method fit (line 85) | def fit(self, X, y=None) :
method transform (line 118) | def transform(self, X):
method _get_support_mask (line 125) | def _get_support_mask(self):
FILE: tpot/builtin_modules/feature_set_selector.py
class FeatureSetSelector (line 48) | class FeatureSetSelector(SelectorMixin, BaseEstimator):
method __init__ (line 55) | def __init__(self, sel_subset=None, name=None):
method fit (line 73) | def fit(self, X, y=None):
method __sklearn_tags__ (line 112) | def __sklearn_tags__(self):
method _get_support_mask (line 118) | def _get_support_mask(self):
FILE: tpot/builtin_modules/feature_transformers.py
class CategoricalSelector (line 48) | class CategoricalSelector(TransformerMixin, BaseEstimator ):
method __init__ (line 63) | def __init__(self, threshold=10, minimum_fraction=None):
method fit (line 69) | def fit(self, X, y=None):
method transform (line 81) | def transform(self, X):
class ContinuousSelector (line 104) | class ContinuousSelector(TransformerMixin, BaseEstimator ):
method __init__ (line 138) | def __init__(self, threshold=10, svd_solver='randomized' ,iterated_pow...
method fit (line 146) | def fit(self, X, y=None):
method transform (line 158) | def transform(self, X):
FILE: tpot/builtin_modules/genetic_encoders.py
class DominantEncoder (line 12) | class DominantEncoder(TransformerMixin, BaseEstimator ):
method fit (line 16) | def fit(self, X, y=None):
method transform (line 26) | def transform(self, X, y=None):
class RecessiveEncoder (line 50) | class RecessiveEncoder(TransformerMixin, BaseEstimator ):
method fit (line 54) | def fit(self, X, y=None):
method transform (line 64) | def transform(self, X, y=None):
class HeterosisEncoder (line 88) | class HeterosisEncoder(TransformerMixin, BaseEstimator ):
method fit (line 92) | def fit(self, X, y=None):
method transform (line 102) | def transform(self, X, y=None):
class UnderDominanceEncoder (line 126) | class UnderDominanceEncoder(TransformerMixin, BaseEstimator ):
method fit (line 130) | def fit(self, X, y=None):
method transform (line 140) | def transform(self, X, y=None):
class OverDominanceEncoder (line 165) | class OverDominanceEncoder(TransformerMixin, BaseEstimator ):
method fit (line 169) | def fit(self, X, y=None):
method transform (line 179) | def transform(self, X, y=None):
FILE: tpot/builtin_modules/imputer.py
class ColumnSimpleImputer (line 53) | class ColumnSimpleImputer(TransformerMixin, BaseEstimator ):
method __init__ (line 54) | def __init__(self, columns="all",
method fit (line 88) | def fit(self, X, y=None):
method transform (line 127) | def transform(self, X):
FILE: tpot/builtin_modules/nn.py
function _pytorch_model_is_fully_initialized (line 65) | def _pytorch_model_is_fully_initialized(clf: BaseEstimator):
function _get_cuda_device_if_available (line 78) | def _get_cuda_device_if_available():
class PytorchEstimator (line 84) | class PytorchEstimator(BaseEstimator):
method fit (line 92) | def fit(self, X, y): # pragma: no cover
method transform (line 96) | def transform(self, X): # pragma: no cover
method predict (line 99) | def predict(self, X):
method fit_transform (line 102) | def fit_transform(self, X, y):
method set_params (line 106) | def set_params(self, **parameters):
class PytorchClassifier (line 112) | class PytorchClassifier(ClassifierMixin, PytorchEstimator):
method _init_model (line 114) | def _init_model(self, X, y): # pragma: no cover
method fit (line 117) | def fit(self, X, y):
method validate_inputs (line 167) | def validate_inputs(self, X, y):
method predict (line 194) | def predict(self, X):
method transform (line 209) | def transform(self, X):
class _LR (line 214) | class _LR(nn.Module):
method __init__ (line 216) | def __init__(self, input_size, num_classes):
method forward (line 220) | def forward(self, x):
class _MLP (line 224) | class _MLP(nn.Module):
method __init__ (line 226) | def __init__(self, input_size, num_classes):
method forward (line 235) | def forward(self, x):
class PytorchLRClassifier (line 242) | class PytorchLRClassifier(PytorchClassifier):
method __init__ (line 250) | def __init__(
method _init_model (line 273) | def _init_model(self, X, y):
method __sklearn_tags__ (line 296) | def __sklearn_tags__(self):
class PytorchMLPClassifier (line 302) | class PytorchMLPClassifier(PytorchClassifier):
method __init__ (line 306) | def __init__(
method _init_model (line 329) | def _init_model(self, X, y):
method __sklearn_tags__ (line 352) | def __sklearn_tags__(self):
FILE: tpot/builtin_modules/passkbinsdiscretizer.py
function select_features (line 42) | def select_features(X, min_unique=10,):
class PassKBinsDiscretizer (line 65) | class PassKBinsDiscretizer(TransformerMixin, BaseEstimator ):
method __init__ (line 66) | def __init__(self, n_bins=5, encode='onehot-dense', strategy='quantil...
method fit (line 77) | def fit(self, X, y=None):
method transform (line 94) | def transform(self, X):
FILE: tpot/builtin_modules/passthrough.py
class Passthrough (line 39) | class Passthrough(TransformerMixin,BaseEstimator):
method fit (line 44) | def fit(self, X=None, y=None):
method transform (line 50) | def transform(self, X):
class SkipTransformer (line 57) | class SkipTransformer(TransformerMixin,BaseEstimator):
method fit (line 61) | def fit(self, X=None, y=None):
method transform (line 67) | def transform(self, X):
FILE: tpot/builtin_modules/tests/feature_set_selector_tests.py
function test_FeatureSetSelector_1 (line 47) | def test_FeatureSetSelector_1():
function test_FeatureSetSelector_2 (line 58) | def test_FeatureSetSelector_2():
function test_FeatureSetSelector_3 (line 69) | def test_FeatureSetSelector_3():
function test_FeatureSetSelector_4 (line 80) | def test_FeatureSetSelector_4():
function test_FeatureSetSelector_5 (line 91) | def test_FeatureSetSelector_5():
function test_FeatureSetSelector_6 (line 102) | def test_FeatureSetSelector_6():
function test_FeatureSetSelector_7 (line 113) | def test_FeatureSetSelector_7():
function test_FeatureSetSelector_8 (line 128) | def test_FeatureSetSelector_8():
function test_FeatureSetSelector_9 (line 134) | def test_FeatureSetSelector_9():
FILE: tpot/builtin_modules/zero_count.py
class ZeroCount (line 43) | class ZeroCount(TransformerMixin, BaseEstimator ):
method fit (line 46) | def fit(self, X, y=None):
method transform (line 50) | def transform(self, X, y=None):
FILE: tpot/config/classifiers.py
function get_LogisticRegression_ConfigurationSpace (line 44) | def get_LogisticRegression_ConfigurationSpace(random_state, n_jobs=1):
function get_KNeighborsClassifier_ConfigurationSpace (line 72) | def get_KNeighborsClassifier_ConfigurationSpace(n_samples, n_jobs=1):
function get_BaggingClassifier_ConfigurationSpace (line 84) | def get_BaggingClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_DecisionTreeClassifier_ConfigurationSpace (line 111) | def get_DecisionTreeClassifier_ConfigurationSpace(n_featues, random_state):
function get_LinearSVC_ConfigurationSpace (line 132) | def get_LinearSVC_ConfigurationSpace(random_state):
function get_SVC_ConfigurationSpace (line 151) | def get_SVC_ConfigurationSpace(random_state):
function get_RandomForestClassifier_ConfigurationSpace (line 180) | def get_RandomForestClassifier_ConfigurationSpace( random_state, n_jobs=1):
function get_XGBClassifier_ConfigurationSpace (line 200) | def get_XGBClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_LGBMClassifier_ConfigurationSpace (line 223) | def get_LGBMClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_ExtraTreesClassifier_ConfigurationSpace (line 243) | def get_ExtraTreesClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_SGDClassifier_ConfigurationSpace (line 264) | def get_SGDClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_BernoulliNB_ConfigurationSpace (line 297) | def get_BernoulliNB_ConfigurationSpace():
function get_MultinomialNB_ConfigurationSpace (line 306) | def get_MultinomialNB_ConfigurationSpace():
function get_AdaBoostClassifier_ConfigurationSpace (line 316) | def get_AdaBoostClassifier_ConfigurationSpace(random_state):
function get_QuadraticDiscriminantAnalysis_ConfigurationSpace (line 330) | def get_QuadraticDiscriminantAnalysis_ConfigurationSpace():
function get_PassiveAggressiveClassifier_ConfigurationSpace (line 337) | def get_PassiveAggressiveClassifier_ConfigurationSpace(random_state):
function get_LinearDiscriminantAnalysis_ConfigurationSpace (line 351) | def get_LinearDiscriminantAnalysis_ConfigurationSpace():
function get_GradientBoostingClassifier_ConfigurationSpace (line 368) | def get_GradientBoostingClassifier_ConfigurationSpace(n_classes, random_...
function GradientBoostingClassifier_hyperparameter_parser (line 402) | def GradientBoostingClassifier_hyperparameter_parser(params):
function get_HistGradientBoostingClassifier_ConfigurationSpace (line 443) | def get_HistGradientBoostingClassifier_ConfigurationSpace(random_state):
function HistGradientBoostingClassifier_hyperparameter_parser (line 474) | def HistGradientBoostingClassifier_hyperparameter_parser(params):
function get_MLPClassifier_ConfigurationSpace (line 525) | def get_MLPClassifier_ConfigurationSpace(random_state):
function MLPClassifier_hyperparameter_parser (line 548) | def MLPClassifier_hyperparameter_parser(params):
function get_GaussianProcessClassifier_ConfigurationSpace (line 569) | def get_GaussianProcessClassifier_ConfigurationSpace(n_features, random_...
function GaussianProcessClassifier_hyperparameter_parser (line 584) | def GaussianProcessClassifier_hyperparameter_parser(params):
FILE: tpot/config/classifiers_sklearnex.py
function get_RandomForestClassifier_ConfigurationSpace (line 40) | def get_RandomForestClassifier_ConfigurationSpace(random_state, n_jobs=1):
function get_KNeighborsClassifier_ConfigurationSpace (line 57) | def get_KNeighborsClassifier_ConfigurationSpace(n_samples):
function get_LogisticRegression_ConfigurationSpace (line 67) | def get_LogisticRegression_ConfigurationSpace(random_state):
function get_SVC_ConfigurationSpace (line 83) | def get_SVC_ConfigurationSpace(random_state):
function get_NuSVC_ConfigurationSpace (line 100) | def get_NuSVC_ConfigurationSpace(random_state):
FILE: tpot/config/get_configspace.py
function get_configspace (line 187) | def get_configspace(name, n_classes=3, n_samples=1000, n_features=100, r...
function flatten_group_names (line 487) | def flatten_group_names(name):
function get_search_space (line 504) | def get_search_space(name, n_classes=3, n_samples=1000, n_features=100, ...
function get_node (line 560) | def get_node(name, n_classes=3, n_samples=100, n_features=100, random_st...
FILE: tpot/config/imputers.py
function get_IterativeImputer_config_space (line 56) | def get_IterativeImputer_config_space(n_features, random_state):
function get_IterativeImputer_config_space_no_estimator (line 80) | def get_IterativeImputer_config_space_no_estimator(n_features, random_st...
function get_KNNImputer_config_space (line 99) | def get_KNNImputer_config_space(n_samples):
function IterativeImputer_hyperparameter_parser (line 109) | def IterativeImputer_hyperparameter_parser(params):
FILE: tpot/config/mdr_configs.py
function get_skrebate_ReliefF_config_space (line 52) | def get_skrebate_ReliefF_config_space(n_features):
function get_skrebate_SURF_config_space (line 61) | def get_skrebate_SURF_config_space(n_features):
function get_skrebate_SURFstar_config_space (line 69) | def get_skrebate_SURFstar_config_space(n_features):
function get_skrebate_MultiSURF_config_space (line 75) | def get_skrebate_MultiSURF_config_space(n_features):
FILE: tpot/config/regressors.py
function get_RandomForestRegressor_ConfigurationSpace (line 50) | def get_RandomForestRegressor_ConfigurationSpace(random_state, n_jobs=1):
function get_SGDRegressor_ConfigurationSpace (line 69) | def get_SGDRegressor_ConfigurationSpace(random_state):
function get_Ridge_ConfigurationSpace (line 111) | def get_Ridge_ConfigurationSpace(random_state):
function get_Lasso_ConfigurationSpace (line 126) | def get_Lasso_ConfigurationSpace(random_state):
function get_ElasticNet_ConfigurationSpace (line 140) | def get_ElasticNet_ConfigurationSpace(random_state):
function get_Lars_ConfigurationSpace (line 154) | def get_Lars_ConfigurationSpace(random_state):
function get_OthogonalMatchingPursuit_ConfigurationSpace (line 165) | def get_OthogonalMatchingPursuit_ConfigurationSpace():
function get_BayesianRidge_ConfigurationSpace (line 171) | def get_BayesianRidge_ConfigurationSpace():
function get_LassoLars_ConfigurationSpace (line 183) | def get_LassoLars_ConfigurationSpace(random_state):
function get_BaggingRegressor_ConfigurationSpace (line 197) | def get_BaggingRegressor_ConfigurationSpace(random_state):
function get_ARDRegression_ConfigurationSpace (line 212) | def get_ARDRegression_ConfigurationSpace():
function get_TheilSenRegressor_ConfigurationSpace (line 225) | def get_TheilSenRegressor_ConfigurationSpace(random_state):
function get_Perceptron_ConfigurationSpace (line 240) | def get_Perceptron_ConfigurationSpace(random_state):
function get_DecisionTreeRegressor_ConfigurationSpace (line 258) | def get_DecisionTreeRegressor_ConfigurationSpace(random_state):
function get_KNeighborsRegressor_ConfigurationSpace (line 274) | def get_KNeighborsRegressor_ConfigurationSpace(n_samples, n_jobs=1):
function get_LinearSVR_ConfigurationSpace (line 285) | def get_LinearSVR_ConfigurationSpace(random_state):
function get_SVR_ConfigurationSpace (line 301) | def get_SVR_ConfigurationSpace():
function get_XGBRegressor_ConfigurationSpace (line 332) | def get_XGBRegressor_ConfigurationSpace(random_state, n_jobs=1):
function get_AdaBoostRegressor_ConfigurationSpace (line 356) | def get_AdaBoostRegressor_ConfigurationSpace(random_state):
function get_ExtraTreesRegressor_ConfigurationSpace (line 372) | def get_ExtraTreesRegressor_ConfigurationSpace(random_state, n_jobs=1):
function get_GaussianProcessRegressor_ConfigurationSpace (line 391) | def get_GaussianProcessRegressor_ConfigurationSpace(n_features, random_s...
function GaussianProcessRegressor_hyperparameter_parser (line 406) | def GaussianProcessRegressor_hyperparameter_parser(params):
function get_GradientBoostingRegressor_ConfigurationSpace (line 425) | def get_GradientBoostingRegressor_ConfigurationSpace(random_state):
function GradientBoostingRegressor_hyperparameter_parser (line 455) | def GradientBoostingRegressor_hyperparameter_parser(params):
function get_HistGradientBoostingRegressor_ConfigurationSpace (line 496) | def get_HistGradientBoostingRegressor_ConfigurationSpace(random_state):
function HistGradientBoostingRegressor_hyperparameter_parser (line 527) | def HistGradientBoostingRegressor_hyperparameter_parser(params):
function get_MLPRegressor_ConfigurationSpace (line 571) | def get_MLPRegressor_ConfigurationSpace(random_state):
function MLPRegressor_hyperparameter_parser (line 595) | def MLPRegressor_hyperparameter_parser(params):
function get_BaggingRegressor_ConfigurationSpace (line 612) | def get_BaggingRegressor_ConfigurationSpace(random_state, n_jobs=1):
function get_LGBMRegressor_ConfigurationSpace (line 639) | def get_LGBMRegressor_ConfigurationSpace(random_state, n_jobs=1):
FILE: tpot/config/regressors_sklearnex.py
function get_RandomForestRegressor_ConfigurationSpace (line 41) | def get_RandomForestRegressor_ConfigurationSpace(random_state):
function get_KNeighborsRegressor_ConfigurationSpace (line 58) | def get_KNeighborsRegressor_ConfigurationSpace(n_samples):
function get_Ridge_ConfigurationSpace (line 67) | def get_Ridge_ConfigurationSpace(random_state):
function get_Lasso_ConfigurationSpace (line 81) | def get_Lasso_ConfigurationSpace(random_state):
function get_ElasticNet_ConfigurationSpace (line 98) | def get_ElasticNet_ConfigurationSpace(random_state):
function get_SVR_ConfigurationSpace (line 112) | def get_SVR_ConfigurationSpace(random_state):
function get_NuSVR_ConfigurationSpace (line 128) | def get_NuSVR_ConfigurationSpace(random_state):
FILE: tpot/config/special_configs.py
function get_ArithmeticTransformer_ConfigurationSpace (line 45) | def get_ArithmeticTransformer_ConfigurationSpace():
FILE: tpot/config/template_search_spaces.py
function get_linear_search_space (line 44) | def get_linear_search_space(classification=True, inner_predictors=True, ...
function get_graph_search_space (line 95) | def get_graph_search_space(classification=True, inner_predictors=True, c...
function get_graph_search_space_light (line 127) | def get_graph_search_space_light(classification=True, inner_predictors=T...
function get_light_search_space (line 158) | def get_light_search_space(classification=True, inner_predictors=False, ...
function get_mdr_search_space (line 208) | def get_mdr_search_space(classification=True, **get_search_space_params ):
function get_template_search_spaces (line 229) | def get_template_search_spaces(search_space, classification=True, inner_...
FILE: tpot/config/tests/test_get_configspace.py
function test_loop_through_all_hyperparameters (line 14) | def test_loop_through_all_hyperparameters():
function test_loop_through_groupnames (line 31) | def test_loop_through_groupnames():
FILE: tpot/config/transformers.py
function get_FastICA_configspace (line 68) | def get_FastICA_configspace(n_features=100, random_state=None):
function get_FeatureAgglomeration_configspace (line 84) | def get_FeatureAgglomeration_configspace(n_features):
function FeatureAgglomeration_hyperparameter_parser (line 100) | def FeatureAgglomeration_hyperparameter_parser(params):
function get_Nystroem_configspace (line 115) | def get_Nystroem_configspace(n_features=100, random_state=None,):
function get_RBFSampler_configspace (line 132) | def get_RBFSampler_configspace(n_features=100, random_state=None):
function get_QuantileTransformer_configspace (line 148) | def get_QuantileTransformer_configspace(random_state=None, n_samples=1000):
function get_passkbinsdiscretizer_configspace (line 164) | def get_passkbinsdiscretizer_configspace(random_state=None):
function robust_scaler_hyperparameter_parser (line 188) | def robust_scaler_hyperparameter_parser(params):
FILE: tpot/evolvers/base_evolver.py
function ind_mutate (line 61) | def ind_mutate(ind, rng):
function ind_crossover (line 75) | def ind_crossover(ind1, ind2, rng):
class BaseEvolver (line 88) | class BaseEvolver():
method __init__ (line 89) | def __init__( self,
method optimize (line 436) | def optimize(self, generations=None):
method step (line 580) | def step(self,):
method generate_offspring (line 615) | def generate_offspring(self, ): #your EA Algorithm goes here
method evaluate_population (line 635) | def evaluate_population(self,):
method evaluate_population_full (line 688) | def evaluate_population_full(self, budget=None):
method get_unevaluated_individuals (line 724) | def get_unevaluated_individuals(self, column_names, budget=None, indiv...
method evaluate_population_selection_early_stop (line 759) | def evaluate_population_selection_early_stop(self,survival_counts, thr...
FILE: tpot/evolvers/steady_state_evolver.py
function ind_mutate (line 57) | def ind_mutate(ind, rng):
function ind_crossover (line 71) | def ind_crossover(ind1, ind2, rng):
class SteadyStateEvolver (line 84) | class SteadyStateEvolver():
method __init__ (line 85) | def __init__( self,
method optimize (line 352) | def optimize(self):
method get_unevaluated_individuals (line 750) | def get_unevaluated_individuals(self, column_names, budget=None, indiv...
FILE: tpot/graphsklearn.py
function plot (line 57) | def plot(graph: nx.DiGraph):
function _method_name (line 84) | def _method_name(name, estimator, method):
function estimator_fit_transform_override_cross_val_predict (line 104) | def estimator_fit_transform_override_cross_val_predict(estimator, X, y, ...
function _fit_transform_one (line 123) | def _fit_transform_one(model, X, y, fit_transform=True, **fit_params):
function fit_sklearn_digraph (line 136) | def fit_sklearn_digraph(graph: nx.DiGraph,
function transform_sklearn_digraph (line 187) | def transform_sklearn_digraph(graph: nx.DiGraph,
function get_inputs_to_node (line 227) | def get_inputs_to_node(graph: nx.DiGraph,
function _estimator_has (line 248) | def _estimator_has(attr):
function setup_ordered_successors (line 259) | def setup_ordered_successors(graph: nx.DiGraph):
function get_ordered_successors (line 263) | def get_ordered_successors(graph: nx.DiGraph, node):
class GraphPipeline (line 267) | class GraphPipeline(_BaseComposition):
method __init__ (line 268) | def __init__(
method __str__ (line 331) | def __str__(self):
method fit (line 337) | def fit(self, X, y):
method plot (line 359) | def plot(self, ):
method __sklearn_is_fitted__ (line 362) | def __sklearn_is_fitted__(self):
method predict (line 375) | def predict(self, X, **predict_params):
method predict_proba (line 393) | def predict_proba(self, X, **predict_params):
method decision_function (line 405) | def decision_function(self, X, **predict_params):
method transform (line 416) | def transform(self, X, **predict_params):
method classes_ (line 427) | def classes_(self):
method _estimator_type (line 436) | def _estimator_type(self):
method __sklearn_tags__ (line 440) | def __sklearn_tags__(self):
FILE: tpot/individual.py
class BaseIndividual (line 44) | class BaseIndividual:
method __init__ (line 47) | def __init__(self) -> None:
method mutate (line 51) | def mutate(self, rng=None):
method crossover (line 60) | def crossover(self, ind2, rng=None):
method optimize (line 70) | def optimize(self, objective_function, rng=None , steps=5):
method unique_id (line 77) | def unique_id(self):
FILE: tpot/logbook.py
class CallBackInterface (line 36) | class CallBackInterface():
method __init__ (line 37) | def __init__(self) -> None:
method step_callback (line 40) | def step_callback(self, population):
method population_mutate_callback (line 43) | def population_mutate_callback(self, offspring, parent=None):
method population_crossover_callback (line 46) | def population_crossover_callback(self, offspring, parent=None):
method evolutionary_algorithm_step_callback (line 49) | def evolutionary_algorithm_step_callback(self, population):
class Logbook (line 52) | class Logbook():
FILE: tpot/objectives/average_path_length.py
function average_path_length_objective (line 39) | def average_path_length_objective(graph_pipeline):
FILE: tpot/objectives/complexity.py
function _count_nonzero_coefficients_and_intercept (line 65) | def _count_nonzero_coefficients_and_intercept(est):
function tree_complexity (line 73) | def tree_complexity(tree):
function forest_complexity (line 77) | def forest_complexity(forest):
function histgradientboosting_complexity (line 84) | def histgradientboosting_complexity(forest):
function knn_complexity (line 90) | def knn_complexity(knn):
function support_vector_machine_complexity (line 94) | def support_vector_machine_complexity(svm):
function sklearn_MLP_complexity (line 102) | def sklearn_MLP_complexity(mlp):
function calculate_xgb_model_complexity (line 109) | def calculate_xgb_model_complexity(est):
function BernoulliNB_Complexity (line 122) | def BernoulliNB_Complexity(model):
function GaussianNB_Complexity (line 126) | def GaussianNB_Complexity(model):
function MultinomialNB_Complexity (line 130) | def MultinomialNB_Complexity(model):
function BaggingComplexity (line 134) | def BaggingComplexity(est):
function lightgbm_complexity (line 137) | def lightgbm_complexity(est):
function QuadraticDiscriminantAnalysis_complexity (line 149) | def QuadraticDiscriminantAnalysis_complexity(est):
function gaussian_process_classifier_complexity (line 154) | def gaussian_process_classifier_complexity(est):
function gaussian_process_regressor_complexity (line 163) | def gaussian_process_regressor_complexity(est):
function adaboost_complexity (line 166) | def adaboost_complexity(est):
function ensemble_complexity (line 169) | def ensemble_complexity(est):
function calculate_model_complexity (line 242) | def calculate_model_complexity(est):
function complexity_scorer (line 266) | def complexity_scorer(est, X=None, y=None):
FILE: tpot/objectives/number_of_leaves.py
function number_of_leaves_scorer (line 36) | def number_of_leaves_scorer(est,X=None, y=None):
function number_of_leaves_objective (line 39) | def number_of_leaves_objective(est):
FILE: tpot/objectives/number_of_nodes.py
function number_of_nodes_objective (line 40) | def number_of_nodes_objective(est):
FILE: tpot/objectives/tests/test_number_of_nodes.py
function test_number_of_nodes_objective_Graphpipeline (line 18) | def test_number_of_nodes_objective_Graphpipeline():
function test_number_of_nodes_objective_Pipeline (line 35) | def test_number_of_nodes_objective_Pipeline():
function test_number_of_nodes_objective_not_pipeline_or_graphpipeline (line 40) | def test_number_of_nodes_objective_not_pipeline_or_graphpipeline():
function test_number_of_nodes_objective_pipeline_in_graphpipeline (line 45) | def test_number_of_nodes_objective_pipeline_in_graphpipeline():
function test_number_of_nodes_objective_graphpipeline_in_pipeline (line 57) | def test_number_of_nodes_objective_graphpipeline_in_pipeline():
function test_number_of_nodes_objective_graphpipeline_in_graphpipeline (line 79) | def test_number_of_nodes_objective_graphpipeline_in_graphpipeline():
function test_number_of_nodes_objective_pipeline_in_pipeline (line 110) | def test_number_of_nodes_objective_pipeline_in_pipeline():
FILE: tpot/old_config_utils/old_config_utils.py
function load_get_module_from_string (line 48) | def load_get_module_from_string(module_string):
function hyperparameter_parser (line 67) | def hyperparameter_parser(hdict, function_params_conversion_dict):
function get_node_space (line 74) | def get_node_space(module_string, params):
function convert_config_dict_to_list (line 162) | def convert_config_dict_to_list(config_dict):
function convert_config_dict_to_choicepipeline (line 182) | def convert_config_dict_to_choicepipeline(config_dict):
function convert_config_dict_to_graphpipeline (line 203) | def convert_config_dict_to_graphpipeline(config_dict):
function convert_config_dict_to_linearpipeline (line 245) | def convert_config_dict_to_linearpipeline(config_dict):
FILE: tpot/population.py
function mutate (line 50) | def mutate(individual, rng):
function crossover (line 59) | def crossover(parents, rng):
function mutate_and_crossover (line 64) | def mutate_and_crossover(parents, rng):
function crossover_and_mutate (line 71) | def crossover_and_mutate(parents, rng):
class Population (line 87) | class Population():
method __init__ (line 110) | def __init__( self,
method survival_select (line 129) | def survival_select(self, selector, weights, columns_names, n_survivor...
method parent_select (line 138) | def parent_select(self, selector, weights, columns_names, k, n_parents...
method remove_invalid_from_population (line 149) | def remove_invalid_from_population(self, column_names, invalid_value =...
method add_to_population (line 174) | def add_to_population(self, individuals: typing.List[BaseIndividual], ...
method update_column (line 222) | def update_column(self, individual, column_names, data):
method get_column (line 242) | def get_column(self, individual, column_names=None, to_numpy=True):
method get_unevaluated_individuals (line 272) | def get_unevaluated_individuals(self, column_names, individual_list=No...
method set_population (line 290) | def set_population(self, new_population, rng, keep_repeats=True):
method create_offspring (line 300) | def create_offspring(self, parents_list, var_op_list, rng, add_to_popu...
method create_offspring2 (line 360) | def create_offspring2(self, parents_list, var_op_list, mutation_functi...
function get_id (line 440) | def get_id(individual):
function parallel_create_offspring (line 443) | def parallel_create_offspring(parents_list, var_op_list, rng, n_jobs=1):
function nonparallel_create_offpring (line 459) | def nonparallel_create_offpring(parents_list, var_op_list, rng, n_jobs=1):
function copy_and_change (line 473) | def copy_and_change(parents, var_op, rng):
function copy_and_mutate (line 481) | def copy_and_mutate(parents, var_op, rng):
function copy_and_crossover (line 489) | def copy_and_crossover(parents, var_op, rng):
function parallel_get_id (line 495) | def parallel_get_id(n_jobs, individual_list):
FILE: tpot/search_spaces/base.py
class SklearnIndividual (line 46) | class SklearnIndividual(tpot.BaseIndividual):
method __init_subclass__ (line 48) | def __init_subclass__(cls):
method __init__ (line 52) | def __init__(self,) -> None:
method mutate (line 55) | def mutate(self, rng=None):
method crossover (line 58) | def crossover(self, other, rng=None, **kwargs):
method validate_same_type (line 62) | def validate_same_type(func):
method export_pipeline (line 71) | def export_pipeline(self, **kwargs) -> BaseEstimator:
method unique_id (line 74) | def unique_id(self):
method get_size (line 95) | def get_size(self):
method export_flattened_graphpipeline (line 99) | def export_flattened_graphpipeline(self, **graphpipeline_kwargs) -> tp...
class SearchSpace (line 102) | class SearchSpace():
method __init__ (line 103) | def __init__(self,):
method generate (line 106) | def generate(self, rng=None) -> SklearnIndividual:
function flatten_graphpipeline (line 110) | def flatten_graphpipeline(est):
function flatten_pipeline (line 142) | def flatten_pipeline(est):
function flatten_estimator (line 161) | def flatten_estimator(est):
function flatten_any (line 166) | def flatten_any(est):
function flatten_to_graphpipeline (line 175) | def flatten_to_graphpipeline(est, **graphpipeline_kwargs):
FILE: tpot/search_spaces/graph_utils.py
function remove_and_stitch (line 40) | def remove_and_stitch(graph, node):
function remove_nodes_disconnected_from_node (line 51) | def remove_nodes_disconnected_from_node(graph, node):
function get_roots (line 59) | def get_roots(graph):
function get_leaves (line 62) | def get_leaves(graph):
function get_max_path_through_node (line 65) | def get_max_path_through_node(graph, root, node):
function get_max_path_size (line 74) | def get_max_path_size(graph, fromnode1,tonode2, return_path=False):
function invert_dictionary (line 86) | def invert_dictionary(d):
function select_nodes_same_depth (line 93) | def select_nodes_same_depth(g1, node1, g2, node2, rng=None):
function select_nodes_randomly (line 124) | def select_nodes_randomly(g1, g2, rng=None):
FILE: tpot/search_spaces/nodes/estimator_node.py
function default_hyperparameter_parser (line 44) | def default_hyperparameter_parser(params:dict) -> dict:
class EstimatorNodeIndividual (line 48) | class EstimatorNodeIndividual(SklearnIndividual):
method __init__ (line 61) | def __init__(self, method: type,
method mutate (line 81) | def mutate(self, rng=None):
method crossover (line 90) | def crossover(self, other, rng=None):
method export_pipeline (line 109) | def export_pipeline(self, **kwargs):
method unique_id (line 112) | def unique_id(self):
class EstimatorNode (line 122) | class EstimatorNode(SearchSpace):
method __init__ (line 123) | def __init__(self, method, space, hyperparameter_parser=default_hyperp...
method generate (line 128) | def generate(self, rng=None):
FILE: tpot/search_spaces/nodes/estimator_node_gradual.py
function default_hyperparameter_parser (line 44) | def default_hyperparameter_parser(params:dict) -> dict:
class EstimatorNodeIndividual_gradual (line 49) | class EstimatorNodeIndividual_gradual(SklearnIndividual):
method __init__ (line 62) | def __init__(self, method: type,
method mutate (line 82) | def mutate(self, rng=None):
method crossover (line 88) | def crossover(self, other, rng=None):
method export_pipeline (line 106) | def export_pipeline(self, **kwargs):
method unique_id (line 109) | def unique_id(self):
function gradual_hyperparameter_update (line 119) | def gradual_hyperparameter_update(params:dict, configspace:Configuration...
class EstimatorNode_gradual (line 156) | class EstimatorNode_gradual(SearchSpace):
method __init__ (line 157) | def __init__(self, method, space, hyperparameter_parser=default_hyperp...
method generate (line 162) | def generate(self, rng=None):
FILE: tpot/search_spaces/nodes/fss_node.py
class FSSIndividual (line 52) | class FSSIndividual(SklearnIndividual):
method __init__ (line 53) | def __init__( self,
method mutate (line 109) | def mutate(self, rng=None):
method crossover (line 117) | def crossover(self, other, rng=None):
method export_pipeline (line 121) | def export_pipeline(self, **kwargs):
method unique_id (line 125) | def unique_id(self):
class FSSNode (line 130) | class FSSNode(SearchSpace):
method __init__ (line 131) | def __init__(self,
method generate (line 158) | def generate(self, rng=None) -> SklearnIndividual:
FILE: tpot/search_spaces/nodes/genetic_feature_selection.py
class MaskSelector (line 50) | class MaskSelector(SelectorMixin, BaseEstimator):
method __init__ (line 53) | def __init__(self, mask, set_output_transform=None):
method fit (line 59) | def fit(self, X, y=None):
method __sklearn_tags__ (line 67) | def __sklearn_tags__(self):
method _get_support_mask (line 73) | def _get_support_mask(self):
method get_feature_names_out (line 76) | def get_feature_names_out(self, input_features=None):
class GeneticFeatureSelectorIndividual (line 79) | class GeneticFeatureSelectorIndividual(SklearnIndividual):
method __init__ (line 80) | def __init__( self,
method mutate (line 115) | def mutate(self, rng=None):
method crossover (line 125) | def crossover(self, other, rng=None):
method _mutate_add (line 150) | def _mutate_add(self, rng=None):
method _mutate_remove (line 171) | def _mutate_remove(self, rng=None):
method _crossover_swap (line 196) | def _crossover_swap(self, ss2, rng=None):
method export_pipeline (line 202) | def export_pipeline(self, **kwargs):
method unique_id (line 206) | def unique_id(self):
class GeneticFeatureSelectorNode (line 212) | class GeneticFeatureSelectorNode(SearchSpace):
method __init__ (line 213) | def __init__(self,
method generate (line 249) | def generate(self, rng=None) -> SklearnIndividual:
FILE: tpot/search_spaces/pipelines/choice.py
class ChoicePipelineIndividual (line 45) | class ChoicePipelineIndividual(SklearnIndividual):
method __init__ (line 46) | def __init__(self, search_spaces : List[SearchSpace], rng=None) -> None:
method mutate (line 53) | def mutate(self, rng=None):
method _mutate_select_new_node (line 60) | def _mutate_select_new_node(self, rng=None):
method _mutate_node (line 65) | def _mutate_node(self, rng=None):
method crossover (line 68) | def crossover(self, other, rng=None):
method export_pipeline (line 71) | def export_pipeline(self, **kwargs):
method unique_id (line 74) | def unique_id(self):
class ChoicePipeline (line 78) | class ChoicePipeline(SearchSpace):
method __init__ (line 79) | def __init__(self, search_spaces : List[SearchSpace] ) -> None:
method generate (line 87) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/dynamic_linear.py
class DynamicLinearPipelineIndividual (line 48) | class DynamicLinearPipelineIndividual(SklearnIndividual):
method __init__ (line 52) | def __init__(self, search_space : SearchSpace, max_length: int , rng=N...
method _generate_pipeline (line 63) | def _generate_pipeline(self, rng=None):
method mutate (line 74) | def mutate(self, rng=None):
method _mutate_add_node (line 85) | def _mutate_add_node(self, rng=None):
method _mutate_remove_node (line 91) | def _mutate_remove_node(self, rng=None):
method _mutate_step (line 96) | def _mutate_step(self, rng=None):
method crossover (line 103) | def crossover(self, other, rng=None):
method _crossover_swap_multiple_nodes (line 116) | def _crossover_swap_multiple_nodes(self, other, rng):
method _crossover_swap_node (line 137) | def _crossover_swap_node(self, other, rng):
method _crossover_node (line 150) | def _crossover_node(self, other, rng):
method export_pipeline (line 165) | def export_pipeline(self, memory=None, **kwargs):
method unique_id (line 168) | def unique_id(self):
class DynamicLinearPipeline (line 174) | class DynamicLinearPipeline(SearchSpace):
method __init__ (line 175) | def __init__(self, search_space : SearchSpace, max_length: int ) -> None:
method generate (line 185) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/dynamicunion.py
class DynamicUnionPipelineIndividual (line 46) | class DynamicUnionPipelineIndividual(SklearnIndividual):
method __init__ (line 54) | def __init__(self, search_space : SearchSpace, max_estimators=None, al...
method mutate (line 78) | def mutate(self, rng=None):
method _mutate_add_step (line 86) | def _mutate_add_step(self, rng):
method _mutate_remove_step (line 97) | def _mutate_remove_step(self, rng):
method _mutate_replace_step (line 104) | def _mutate_replace_step(self, rng):
method _mutate_note (line 110) | def _mutate_note(self, rng):
method crossover (line 123) | def crossover(self, other, rng=None):
method _crossover_swap_multiple_nodes (line 135) | def _crossover_swap_multiple_nodes(self, other, rng):
method _crossover_node (line 155) | def _crossover_node(self, other, rng):
method export_pipeline (line 174) | def export_pipeline(self, **kwargs):
method unique_id (line 178) | def unique_id(self):
class DynamicUnionPipeline (line 187) | class DynamicUnionPipeline(SearchSpace):
method __init__ (line 188) | def __init__(self, search_space : SearchSpace, max_estimators=None, al...
method generate (line 197) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/graph.py
class GraphPipelineIndividual (line 51) | class GraphPipelineIndividual(SklearnIndividual):
method __init__ (line 96) | def __init__(
method mutate (line 146) | def mutate(self, rng=None):
method _mutate_insert_leaf (line 181) | def _mutate_insert_leaf(self, rng=None):
method _mutate_insert_inner_node (line 208) | def _mutate_insert_inner_node(self, rng=None):
method _mutate_remove_node (line 238) | def _mutate_remove_node(self, rng=None):
method _mutate_node (line 274) | def _mutate_node(self, rng=None):
method _mutate_remove_edge (line 287) | def _mutate_remove_edge(self, rng=None):
method _mutate_add_edge (line 307) | def _mutate_add_edge(self, rng=None):
method _mutate_insert_bypass_node (line 330) | def _mutate_insert_bypass_node(self, rng=None):
method crossover (line 358) | def crossover(self, ind2, rng=None):
method _crossover_swap_branch (line 392) | def _crossover_swap_branch(self, G2, rng=None):
method _crossover_take_branch (line 444) | def _crossover_take_branch(self, G2, rng=None):
method _crossover_nodes (line 491) | def _crossover_nodes(self, G2, rng=None):
method _crossover_swap_leaf_at_node (line 526) | def _crossover_swap_leaf_at_node(self, G2, rng=None):
method _crossover_swap_node (line 561) | def _crossover_swap_node(self, G2, rng=None):
method _merge_duplicated_nodes (line 605) | def _merge_duplicated_nodes(self):
method export_pipeline (line 634) | def export_pipeline(self, memory=None, **kwargs):
method plot (line 663) | def plot(self):
method unique_id (line 711) | def unique_id(self):
class GraphSearchPipeline (line 724) | class GraphSearchPipeline(SearchSpace):
method __init__ (line 725) | def __init__(self,
method generate (line 791) | def generate(self, rng=None):
class GraphKey (line 822) | class GraphKey():
method __init__ (line 834) | def __init__(self, graph, matched_label='label') -> None:#['hyperparam...
method __hash__ (line 845) | def __hash__(self) -> int:
method __eq__ (line 850) | def __eq__(self, other):
function node_match (line 853) | def node_match(n1,n2, matched_labels):
FILE: tpot/search_spaces/pipelines/sequential.py
class SequentialPipelineIndividual (line 46) | class SequentialPipelineIndividual(SklearnIndividual):
method __init__ (line 50) | def __init__(self, search_spaces : List[SearchSpace], rng=None) -> None:
method mutate (line 61) | def mutate(self, rng=None):
method crossover (line 73) | def crossover(self, other, rng=None):
method _crossover_swap_node (line 88) | def _crossover_swap_node(self, other, rng):
method _crossover_swap_multiple_nodes (line 99) | def _crossover_swap_multiple_nodes(self, other, rng):
method _crossover_swap_segment (line 125) | def _crossover_swap_segment(self, other, rng):
method _crossover_node (line 143) | def _crossover_node(self, other, rng):
method export_pipeline (line 163) | def export_pipeline(self, memory=None, **kwargs):
method unique_id (line 166) | def unique_id(self):
class SequentialPipeline (line 174) | class SequentialPipeline(SearchSpace):
method __init__ (line 175) | def __init__(self, search_spaces : List[SearchSpace] ) -> None:
method generate (line 182) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/tests/test_graphspace.py
function test_merge_duplicate_nodes (line 14) | def test_merge_duplicate_nodes():
FILE: tpot/search_spaces/pipelines/tree.py
class TreePipelineIndividual (line 53) | class TreePipelineIndividual(GraphPipelineIndividual):
method __init__ (line 54) | def __init__(self,
class TreePipeline (line 64) | class TreePipeline(SearchSpace):
method __init__ (line 65) | def __init__(self, root_search_space : SearchSpace,
method generate (line 84) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/union.py
class UnionPipelineIndividual (line 46) | class UnionPipelineIndividual(SklearnIndividual):
method __init__ (line 54) | def __init__(self, search_spaces : List[SearchSpace], rng=None) -> None:
method mutate (line 62) | def mutate(self, rng=None):
method crossover (line 68) | def crossover(self, other, rng=None):
method _crossover_swap_node (line 80) | def _crossover_swap_node(self, other, rng):
method _crossover_node (line 87) | def _crossover_node(self, other, rng):
method export_pipeline (line 98) | def export_pipeline(self, **kwargs):
method unique_id (line 101) | def unique_id(self):
class UnionPipeline (line 107) | class UnionPipeline(SearchSpace):
method __init__ (line 108) | def __init__(self, search_spaces : List[SearchSpace] ) -> None:
method generate (line 115) | def generate(self, rng=None):
FILE: tpot/search_spaces/pipelines/wrapper.py
class WrapperPipelineIndividual (line 48) | class WrapperPipelineIndividual(SklearnIndividual):
method __init__ (line 49) | def __init__(
method mutate (line 75) | def mutate(self, rng=None):
method _mutate_hyperparameters (line 82) | def _mutate_hyperparameters(self, rng=None):
method _mutate_node (line 90) | def _mutate_node(self, rng=None):
method crossover (line 93) | def crossover(self, other, rng=None):
method _crossover_hyperparameters (line 101) | def _crossover_hyperparameters(self, other, rng=None):
method export_pipeline (line 118) | def export_pipeline(self, **kwargs):
method unique_id (line 131) | def unique_id(self):
class WrapperPipeline (line 142) | class WrapperPipeline(SearchSpace):
method __init__ (line 143) | def __init__(
method generate (line 165) | def generate(self, rng=None):
FILE: tpot/search_spaces/tests/test_search_spaces.py
function test_EstimatorNodeCrossover (line 49) | def test_EstimatorNodeCrossover():
function test_ValueError_different_types (line 67) | def test_ValueError_different_types():
FILE: tpot/search_spaces/tuple_index.py
class TupleIndex (line 38) | class TupleIndex():
method __init__ (line 47) | def __init__(self, tup):
method __eq__ (line 50) | def __eq__(self,other) -> bool:
method __hash__ (line 53) | def __hash__(self) -> int:
method __str__ (line 56) | def __str__(self) -> str:
method __repr__ (line 59) | def __repr__(self) -> str:
FILE: tpot/selectors/lexicase_selection.py
function lexicase_selection (line 38) | def lexicase_selection(scores, k, n_parents=1, rng=None):
FILE: tpot/selectors/map_elites_selection.py
function create_nd_matrix (line 39) | def create_nd_matrix(matrix, grid_steps=None, bins=None):
function manhattan (line 84) | def manhattan(a, b):
function map_elites_survival_selector (line 102) | def map_elites_survival_selector(scores, k=None, rng=None, grid_steps= ...
function map_elites_parent_selector (line 141) | def map_elites_parent_selector(scores, k, n_parents=1, rng=None, manhat...
function get_bins_quantiles (line 227) | def get_bins_quantiles(arr, k=None, q=None):
function get_bins (line 255) | def get_bins(arr, k):
FILE: tpot/selectors/max_weighted_average_selector.py
function max_weighted_average_selector (line 38) | def max_weighted_average_selector(scores,k, n_parents=1, rng=None):
FILE: tpot/selectors/nsgaii.py
function nondominated_sorting (line 41) | def nondominated_sorting(matrix):
function dominates (line 101) | def dominates(list1, list2):
function crowding_distance (line 122) | def crowding_distance(matrix):
function survival_select_NSGA2 (line 162) | def survival_select_NSGA2(scores, k, rng=None):
FILE: tpot/selectors/random_selector.py
function random_selector (line 38) | def random_selector(scores, k, n_parents=1, rng=None, ):
FILE: tpot/selectors/tournament_selection.py
function tournament_selection (line 38) | def tournament_selection(scores, k, n_parents=1, rng=None, tournament_si...
FILE: tpot/selectors/tournament_selection_dominated.py
function tournament_selection_dominated (line 41) | def tournament_selection_dominated(scores, k, n_parents=2, rng=None):
FILE: tpot/tests/conftest.py
function capture_stdout (line 41) | def capture_stdout(monkeypatch):
FILE: tpot/tests/test_estimators.py
function sample_dataset (line 43) | def sample_dataset():
function tpot_estimator (line 49) | def tpot_estimator():
function tpot_classifier (line 76) | def tpot_classifier():
function tpot_regressor (line 80) | def tpot_regressor():
function tpot_estimator_with_pipeline (line 85) | def tpot_estimator_with_pipeline(tpot_estimator,sample_dataset):
function test_tpot_estimator_predict (line 89) | def test_tpot_estimator_predict(tpot_estimator_with_pipeline,sample_data...
function test_tpot_estimator_generations_type (line 96) | def test_tpot_estimator_generations_type():
function test_tpot_estimator_population_size_type (line 100) | def test_tpot_estimator_population_size_type():
function test_tpot_estimator_verbosity_type (line 104) | def test_tpot_estimator_verbosity_type():
function test_tpot_estimator_scoring_type (line 108) | def test_tpot_estimator_scoring_type():
function test_tpot_estimator_cv_type (line 112) | def test_tpot_estimator_cv_type():
function test_tpot_estimator_n_jobs_type (line 116) | def test_tpot_estimator_n_jobs_type():
function test_tpot_estimator_config_dict_type (line 120) | def test_tpot_estimator_config_dict_type():
function test_tpot_classifier_fit (line 128) | def test_tpot_classifier_fit(tpot_classifier,sample_dataset):
function test_tpot_regressor_fit (line 135) | def test_tpot_regressor_fit(tpot_regressor):
FILE: tpot/tests/test_hello_world.py
function test_hello_world (line 16) | def test_hello_world(test_input, expected):
function test_print (line 21) | def test_print(capture_stdout):
FILE: tpot/tpot_estimator/cross_val_utils.py
function cross_val_score_objective (line 43) | def cross_val_score_objective(estimator, X, y, scorers, cv, fold=None):
FILE: tpot/tpot_estimator/estimator.py
function set_dask_settings (line 63) | def set_dask_settings():
class TPOTEstimator (line 71) | class TPOTEstimator(BaseEstimator):
method __init__ (line 72) | def __init__(self,
method fit (line 518) | def fit(self, X, y):
method _estimator_has (line 932) | def _estimator_has(attr):
method predict (line 947) | def predict(self, X, **predict_params):
method predict_proba (line 958) | def predict_proba(self, X, **predict_params):
method decision_function (line 964) | def decision_function(self, X, **predict_params):
method transform (line 970) | def transform(self, X, **predict_params):
method classes_ (line 976) | def classes_(self):
method _estimator_type (line 985) | def _estimator_type(self):
method __sklearn_tags__ (line 988) | def __sklearn_tags__(self):
method make_evaluated_individuals (line 1012) | def make_evaluated_individuals(self):
method pareto_front (line 1026) | def pareto_front(self):
function check_empty_values (line 1037) | def check_empty_values(data):
FILE: tpot/tpot_estimator/estimator_utils.py
function convert_parents_tuples_to_integers (line 44) | def convert_parents_tuples_to_integers(row, object_to_int):
function apply_make_pipeline (line 68) | def apply_make_pipeline(ind, preprocessing_pipeline=None, export_graphpi...
function objective_function_generator (line 107) | def objective_function_generator(pipeline, x,y, scorers, cv, other_objec...
function val_objective_function_generator (line 176) | def val_objective_function_generator(pipeline, X_train, y_train, X_test,...
function remove_underrepresented_classes (line 230) | def remove_underrepresented_classes(x, y, min_count):
function convert_to_float (line 269) | def convert_to_float(x):
function check_if_y_is_encoded (line 278) | def check_if_y_is_encoded(y):
FILE: tpot/tpot_estimator/steady_state_estimator.py
function set_dask_settings (line 61) | def set_dask_settings():
class TPOTEstimatorSteadyState (line 68) | class TPOTEstimatorSteadyState(BaseEstimator):
method __init__ (line 69) | def __init__(self,
method fit (line 562) | def fit(self, X, y):
method _estimator_has (line 949) | def _estimator_has(attr):
method predict (line 964) | def predict(self, X, **predict_params):
method predict_proba (line 974) | def predict_proba(self, X, **predict_params):
method decision_function (line 980) | def decision_function(self, X, **predict_params):
method transform (line 986) | def transform(self, X, **predict_params):
method classes_ (line 992) | def classes_(self):
method _estimator_type (line 1001) | def _estimator_type(self):
method __sklearn_tags__ (line 1004) | def __sklearn_tags__(self):
method make_evaluated_individuals (line 1026) | def make_evaluated_individuals(self):
method pareto_front (line 1040) | def pareto_front(self):
FILE: tpot/tpot_estimator/templates/tpottemplates.py
class TPOTRegressor (line 46) | class TPOTRegressor(TPOTEstimator):
method __init__ (line 47) | def __init__( self,
method fit (line 267) | def fit(self, X, y):
class TPOTClassifier (line 308) | class TPOTClassifier(TPOTEstimator):
method __init__ (line 309) | def __init__( self,
method fit (line 528) | def fit(self, X, y):
method predict (line 571) | def predict(self, X, **predict_params):
FILE: tpot/tpot_estimator/tests/test_estimator_utils.py
function test_remove_underrepresented_classes (line 41) | def test_remove_underrepresented_classes():
function test_check_if_y_is_encoded (line 71) | def test_check_if_y_is_encoded():
FILE: tpot/utils/amltk_parser.py
function component_to_estimatornode (line 41) | def component_to_estimatornode(component: Component) -> EstimatorNode:
function fixed_to_estimatornode (line 53) | def fixed_to_estimatornode(node: Fixed) -> EstimatorNode:
function sequential_to_sequentialpipeline (line 72) | def sequential_to_sequentialpipeline(sequential: Sequential) -> Sequenti...
function choice_to_choicepipeline (line 77) | def choice_to_choicepipeline(choice: Choice) -> ChoicePipeline:
function split_to_unionpipeline (line 83) | def split_to_unionpipeline(split: Split) -> UnionPipeline:
function tpot_parser (line 88) | def tpot_parser(
FILE: tpot/utils/eval_utils.py
function process_scores (line 56) | def process_scores(scores, n):
function objective_nan_wrapper (line 79) | def objective_nan_wrapper( individual,
function eval_objective_list (line 112) | def eval_objective_list(ind, objective_list, verbose=0,**objective_kwargs):
function parallel_eval_objective_list (line 118) | def parallel_eval_objective_list(individual_list,
function optimize_objective (line 278) | def optimize_objective(ind, objective, steps=5, verbose=0):
function parallel_optimize_objective (line 301) | def parallel_optimize_objective(individual_list,
FILE: tpot/utils/utils.py
function get_thresholds (line 43) | def get_thresholds(scores, start=0, end=1, scale=.5, n=10,):
function equalize_list (line 47) | def equalize_list(lst, n_steps):
function beta_interpolation (line 64) | def beta_interpolation(start=0, end=1, scale=1, n=10, n_steps=None):
function remove_items (line 85) | def remove_items(items, indexes_to_remove):
function is_pareto_efficient (line 98) | def is_pareto_efficient(scores, return_mask = True):
function get_pareto_frontier (line 123) | def get_pareto_frontier(df, column_names, weights):
function get_pareto_front (line 140) | def get_pareto_front(df, column_names, weights):
Condensed preview — 141 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,378K chars).
[
{
"path": ".github/workflows/docs.yml",
"chars": 2405,
"preview": "name: Docs Build\n\non:\n push:\n branches:\n - main\n\njobs:\n build_docs:\n runs-on: ubuntu-latest\n env:\n "
},
{
"path": ".github/workflows/publish_package.yml",
"chars": 654,
"preview": "name: Publish Package\n\non:\n release:\n types: [published]\n workflow_dispatch:\n\njobs:\n build-and-publish-pypi:\n r"
},
{
"path": ".github/workflows/tests.yml",
"chars": 570,
"preview": "name: Tests\n\non:\n - push\n - pull_request\n\njobs:\n test:\n runs-on: ${{ matrix.os }}\n strategy:\n matrix:\n "
},
{
"path": ".gitignore",
"chars": 218,
"preview": "*.pyc\n.pytest_cache/\nTPOT.egg-info\nTPOT.egg-info\n*.tar.gz\n*.pkl\n*.json\njoblib/\ncache_folder/\ndask-worker-space/\n.tox/\n*."
},
{
"path": "ISSUE_TEMPLATE.md",
"chars": 984,
"preview": "[provide general introduction to the issue and why it is relevant to this repository]\n\n## Context of the issue\n\n[provide"
},
{
"path": "LICENSE",
"chars": 7651,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "PULL_REQUEST_TEMPLATE.md",
"chars": 605,
"preview": "[please review the [Contribution Guidelines](http://epistasislab.github.io/tpot/contributing/) prior to submitting your "
},
{
"path": "README.md",
"chars": 12949,
"preview": "# TPOT\n\n<center>\n<img src=\"https://raw.githubusercontent.com/EpistasisLab/tpot/master/images/tpot-logo.jpg\" width=300 />"
},
{
"path": "Tutorial/1_Using_TPOT.ipynb",
"chars": 278914,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# What to expect from AutoML softwa"
},
{
"path": "Tutorial/2_Search_Spaces.ipynb",
"chars": 1599405,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Intro\\n\",\n \"\\n\",\n \"TPOT giv"
},
{
"path": "Tutorial/3_Feature_Set_Selector.ipynb",
"chars": 339728,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Genetic Feature Selection nodes i"
},
{
"path": "Tutorial/4_Genetic_Feature_Selection.ipynb",
"chars": 189917,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# GeneticFeatureSelectorNode\\n\",\n "
},
{
"path": "Tutorial/5_GraphPipeline.ipynb",
"chars": 88427,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# GraphPipeli"
},
{
"path": "Tutorial/6_Symbolic_Regression_and_Classification.ipynb",
"chars": 340290,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Symbolic Regression and Classific"
},
{
"path": "Tutorial/7_dask_parallelization.ipynb",
"chars": 15305,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Paralleliza"
},
{
"path": "Tutorial/8_SH_and_cv_early_pruning.ipynb",
"chars": 126547,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Strategies for reducing computati"
},
{
"path": "Tutorial/9_Genetic_Algorithm_Overview.ipynb",
"chars": 57133,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Objective fun"
},
{
"path": "Tutorial/amltk_search_space_parser_example.ipynb",
"chars": 193907,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"The AMLTK (https://github.com/autom"
},
{
"path": "Tutorial/simple_fss.csv",
"chars": 31,
"preview": "one,a,b,c\ntwo,d,e,f\nthree,g,h,i"
},
{
"path": "docs/archived/api.md",
"chars": 45536,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/citing.md",
"chars": 3364,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/contributing.md",
"chars": 6645,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/css/archived.css",
"chars": 33,
"preview": ".md-grid {\n max-width: 100%;\n}"
},
{
"path": "docs/archived/examples.md",
"chars": 11415,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/index.md",
"chars": 1952,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/installing.md",
"chars": 4872,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/related.md",
"chars": 2676,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/releases.md",
"chars": 17335,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/support.md",
"chars": 872,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/archived/using.md",
"chars": 38682,
"preview": "<div style=\"border: 2px solid #f39c12; background-color: #fdf3e7; padding: 15px; border-radius: 5px; color: #c0392b; mar"
},
{
"path": "docs/cite.md",
"chars": 3597,
"preview": "# Citing TPOT\nIf you use TPOT in a scientific publication, please consider citing at least one of the following papers:\n"
},
{
"path": "docs/contribute.md",
"chars": 4901,
"preview": "# Contributing\n\nWe welcome you to check the existing issues for bugs or enhancements to work on. If you have an idea for"
},
{
"path": "docs/css/extra.css",
"chars": 33,
"preview": ".md-grid {\n max-width: 100%;\n}"
},
{
"path": "docs/index.md",
"chars": 41,
"preview": "{%\n include-markdown \"../README.md\"\n%}"
},
{
"path": "docs/installation.md",
"chars": 1111,
"preview": "# Installation\n\nTPOT requires a working installation of Python.\n\n### Creating a conda environment (optional)\n\nWe recomme"
},
{
"path": "docs/related.md",
"chars": 4271,
"preview": "Other Automated Machine Learning (AutoML) tools and related projects:\n\n<table>\n<tr>\n<th width=\"20%\">Name</th>\n<th width="
},
{
"path": "docs/requirements_docs.txt",
"chars": 192,
"preview": "griffe==1.3.1\nmike==2.1.3\nmkdocs==1.6.1\nmkdocs-include-markdown-plugin==6.2.2\nmkdocs-jupyter==0.25.0\nmkdocs-material==9."
},
{
"path": "docs/scripts/build_docs_sources.sh",
"chars": 810,
"preview": "#!/bin/bash\n\nfunction iterate_files() {\n local directory=\"$1\"\n base_dir=\"docs/documentation\"\n\n for file in \"$di"
},
{
"path": "docs/scripts/build_mkdocs.sh",
"chars": 3139,
"preview": "#!/bin/bash\n\ncat > mkdocs.yml <<EOF\nsite_name: TPOT\nsite_url: http://epistasislab.github.io/tpot\n\nrepo_url: https://gith"
},
{
"path": "docs/scripts/build_tutorial_toc_not_used.sh",
"chars": 201,
"preview": "#!/bin/bash\n\nfor file in docs/tutorial/*.html; do\n base=$(basename \"$file\" .html)\n echo \"<div><embed width=\\\"100%\\"
},
{
"path": "docs/support.md",
"chars": 423,
"preview": "# Support\n\nTPOT was developed in the [Artificial Intelligence Innovation (A2I) Lab](http://epistasis.org/) at Cedars-Sin"
},
{
"path": "docs/tpot_api/classifier.md",
"chars": 62,
"preview": "::: tpot.tpot_estimator.templates.tpottemplates.TPOTClassifier"
},
{
"path": "docs/tpot_api/estimator.md",
"chars": 33,
"preview": "::: tpot.tpot_estimator.estimator"
},
{
"path": "docs/tpot_api/regressor.md",
"chars": 61,
"preview": "::: tpot.tpot_estimator.templates.tpottemplates.TPOTRegressor"
},
{
"path": "docs/using.md",
"chars": 2167,
"preview": "# Using TPOT\nSee the Tutorials Folder for more instructions and examples.\n\n## Best Practices\n\n### 1 \nTPOT uses dask for "
},
{
"path": "mkdocs_archived.yml",
"chars": 1489,
"preview": "site_name: TPOT\nsite_url: http://epistasislab.github.io/tpot\nsite_author: Randal S. Olson\nsite_description: Documentatio"
},
{
"path": "pyproject.toml",
"chars": 2047,
"preview": "[build-system]\nrequires = [\"setuptools>=61\", \"setuptools_scm>=7.0\", \"wheel\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[p"
},
{
"path": "tox.ini",
"chars": 666,
"preview": "[tox]\nminversion = 3.28.0\n# flake8 and mypy outputs severla errors, so we disable them for now\n# envlist = py310, flake8"
},
{
"path": "tpot/__init__.py",
"chars": 2136,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/_version.py",
"chars": 162,
"preview": "try:\n from importlib.metadata import version\nexcept ImportError:\n from importlib_metadata import version # for Py"
},
{
"path": "tpot/builtin_modules/__init__.py",
"chars": 963,
"preview": "from .feature_set_selector import FeatureSetSelector\nfrom .zero_count import ZeroCount\nfrom .column_one_hot_encoder impo"
},
{
"path": "tpot/builtin_modules/arithmetictransformer.py",
"chars": 15340,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/column_one_hot_encoder.py",
"chars": 13218,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/estimatortransformer.py",
"chars": 7528,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/feature_encoding_frequency_selector.py",
"chars": 5179,
"preview": "\"\"\"\nFrom https://github.com/EpistasisLab/autoqtl\n\"\"\"\n\nimport numpy as np\nfrom sklearn.base import BaseEstimator\nfrom skl"
},
{
"path": "tpot/builtin_modules/feature_set_selector.py",
"chars": 4244,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/feature_transformers.py",
"chars": 6488,
"preview": "# -*- coding: utf-8 -*-\n\n\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars"
},
{
"path": "tpot/builtin_modules/genetic_encoders.py",
"chars": 6822,
"preview": "\"\"\"\nCode from https://github.com/EpistasisLab/autoqtl\nThis file contains the class definition for all the genetic encode"
},
{
"path": "tpot/builtin_modules/imputer.py",
"chars": 5408,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/nn.py",
"chars": 11249,
"preview": "# -*- coding: utf-8 -*-\n\n\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars"
},
{
"path": "tpot/builtin_modules/passkbinsdiscretizer.py",
"chars": 3982,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/passthrough.py",
"chars": 2379,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/tests/feature_set_selector_tests.py",
"chars": 5828,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/builtin_modules/zero_count.py",
"chars": 2779,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/__init__.py",
"chars": 1529,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/autoqtl_builtins.py",
"chars": 2136,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/classifiers.py",
"chars": 21830,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/classifiers_sklearnex.py",
"chars": 4595,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/get_configspace.py",
"chars": 38535,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/imputers.py",
"chars": 5413,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/mdr_configs.py",
"chars": 2740,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/regressors.py",
"chars": 23910,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/regressors_sklearnex.py",
"chars": 5007,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/selectors.py",
"chars": 2628,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/special_configs.py",
"chars": 2607,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/template_search_spaces.py",
"chars": 14531,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/config/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tpot/config/tests/test_get_configspace.py",
"chars": 1911,
"preview": "import pytest\nimport tpot\nimport sys\nfrom sklearn.datasets import load_iris\nimport random\nimport sklearn\nimport warnings"
},
{
"path": "tpot/config/transformers.py",
"chars": 6383,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/evolvers/__init__.py",
"chars": 63,
"preview": "from .base_evolver import *\nfrom .steady_state_evolver import *"
},
{
"path": "tpot/evolvers/base_evolver.py",
"chars": 50609,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/evolvers/steady_state_evolver.py",
"chars": 44340,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/graphsklearn.py",
"chars": 16272,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/individual.py",
"chars": 3210,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/logbook.py",
"chars": 1889,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/objectives/__init__.py",
"chars": 759,
"preview": "from .average_path_length import average_path_length_objective\nfrom .number_of_nodes import number_of_nodes_objective\nfr"
},
{
"path": "tpot/objectives/average_path_length.py",
"chars": 1990,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/objectives/complexity.py",
"chars": 13515,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/objectives/number_of_leaves.py",
"chars": 1896,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/objectives/number_of_nodes.py",
"chars": 2304,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/objectives/tests/test_complexity_objective.py",
"chars": 0,
"preview": ""
},
{
"path": "tpot/objectives/tests/test_number_of_nodes.py",
"chars": 3997,
"preview": "import pytest\nimport tpot\nfrom sklearn.datasets import load_iris\nimport random\nimport sklearn\n\nfrom sklearn.svm import S"
},
{
"path": "tpot/old_config_utils/__init__.py",
"chars": 1657,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/old_config_utils/old_config_utils.py",
"chars": 10978,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/population.py",
"chars": 22176,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/__init__.py",
"chars": 63,
"preview": "from .base import *\nfrom . import nodes\nfrom . import pipelines"
},
{
"path": "tpot/search_spaces/base.py",
"chars": 6634,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/graph_utils.py",
"chars": 4508,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/nodes/__init__.py",
"chars": 1578,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/nodes/estimator_node.py",
"chars": 5027,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/nodes/estimator_node_gradual.py",
"chars": 7042,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/nodes/fss_node.py",
"chars": 6991,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/nodes/genetic_feature_selection.py",
"chars": 9438,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/__init__.py",
"chars": 190,
"preview": "from .choice import *\nfrom .dynamic_linear import *\nfrom .sequential import *\nfrom .graph import *\nfrom .tree import *\nf"
},
{
"path": "tpot/search_spaces/pipelines/choice.py",
"chars": 3145,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/dynamic_linear.py",
"chars": 6858,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/dynamicunion.py",
"chars": 7324,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/graph.py",
"chars": 36496,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/sequential.py",
"chars": 6521,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/tests/test_graphspace.py",
"chars": 1260,
"preview": "# Test all nodes have all dictionaries\nimport pytest\nimport tpot\n\nimport tpot\nfrom ConfigSpace import ConfigurationSpace"
},
{
"path": "tpot/search_spaces/pipelines/tree.py",
"chars": 3339,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/union.py",
"chars": 4357,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/pipelines/wrapper.py",
"chars": 6169,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/tests/test_search_spaces.py",
"chars": 2780,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/search_spaces/tuple_index.py",
"chars": 2414,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/__init__.py",
"chars": 965,
"preview": "from .lexicase_selection import lexicase_selection\nfrom .max_weighted_average_selector import max_weighted_average_selec"
},
{
"path": "tpot/selectors/lexicase_selection.py",
"chars": 2804,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/map_elites_selection.py",
"chars": 10535,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/max_weighted_average_selector.py",
"chars": 2446,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/nsgaii.py",
"chars": 7005,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/random_selector.py",
"chars": 2375,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/tournament_selection.py",
"chars": 3175,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/selectors/tournament_selection_dominated.py",
"chars": 3774,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tpot/tests/conftest.py",
"chars": 1771,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tests/test_estimators.py",
"chars": 5387,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tests/test_hello_world.py",
"chars": 693,
"preview": "\"\"\"\nTest hello world.\nNotes:\n parameterizing the test_input and expected values allows tests continue running even if"
},
{
"path": "tpot/tpot_estimator/__init__.py",
"chars": 1634,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/cross_val_utils.py",
"chars": 4898,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/estimator.py",
"chars": 56515,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/estimator_utils.py",
"chars": 11007,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/steady_state_estimator.py",
"chars": 55812,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/templates/__init__.py",
"chars": 28,
"preview": "from .tpottemplates import *"
},
{
"path": "tpot/tpot_estimator/templates/tpot_autoimputer.py",
"chars": 0,
"preview": ""
},
{
"path": "tpot/tpot_estimator/templates/tpottemplates.py",
"chars": 36367,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/tests/__init__.py",
"chars": 1484,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/tpot_estimator/tests/test_estimator_utils.py",
"chars": 3436,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/utils/__init__.py",
"chars": 1848,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/utils/amltk_parser.py",
"chars": 4205,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/utils/eval_utils.py",
"chars": 14253,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
},
{
"path": "tpot/utils/utils.py",
"chars": 5889,
"preview": "\"\"\"\nThis file is part of the TPOT library.\n\nThe current version of TPOT was developed at Cedars-Sinai by:\n - Pedro He"
}
]
About this extraction
This page contains the full source code of the EpistasisLab/tpot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 141 files (4.0 MB), approximately 1.1M tokens, and a symbol index with 694 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.