Metadata-Version: 2.1
Name: river-torch
Version: 0.0.13
Summary: Online Deep Learning for river
Home-page: https://github.com/kulbachcedric/IncrementalTorch
Author: Cedric Kulbach
Author-email: cedric.kulbach@googlemail.com
License: BSD-3
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=3.6.0
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: scikit-learn (==1.0.2)
Requires-Dist: scikit-surprise (==1.1.1)
Requires-Dist: torch (==1.11)
Requires-Dist: pandas (~=1.3.2)
Requires-Dist: numpy (>=1.21.6)
Requires-Dist: river (~=0.10.1)
Requires-Dist: tqdm (~=4.61.2)
Requires-Dist: pytest (==7.0.1)
Requires-Dist: dataclasses ; python_version == '3.6'
Provides-Extra: all
Requires-Dist: scikit-learn (==1.0.2) ; extra == 'all'
Requires-Dist: scikit-surprise (==1.1.1) ; extra == 'all'
Requires-Dist: torch (==1.11) ; extra == 'all'
Requires-Dist: pandas (~=1.3.2) ; extra == 'all'
Requires-Dist: numpy (>=1.21.6) ; extra == 'all'
Requires-Dist: river (~=0.10.1) ; extra == 'all'
Requires-Dist: tqdm (~=4.61.2) ; extra == 'all'
Requires-Dist: pytest (==7.0.1) ; extra == 'all'
Requires-Dist: graphviz (>=0.10.1) ; extra == 'all'
Requires-Dist: matplotlib (>=3.0.2) ; extra == 'all'
Requires-Dist: mypy (>=0.761) ; extra == 'all'
Requires-Dist: pre-commit (>=2.9.2) ; extra == 'all'
Requires-Dist: pytest (>=4.5.0) ; extra == 'all'
Requires-Dist: pytest-cov (>=2.6.1) ; extra == 'all'
Requires-Dist: scikit-learn (>=0.22.1) ; extra == 'all'
Requires-Dist: black (>=22.1.0) ; extra == 'all'
Requires-Dist: flake8 (>=4.0.1) ; extra == 'all'
Requires-Dist: isort (>=5.9.3) ; extra == 'all'
Requires-Dist: jupyter (==1.0.0) ; extra == 'all'
Requires-Dist: flask (==2.0.2) ; extra == 'all'
Requires-Dist: ipykernel (==6.9.0) ; extra == 'all'
Requires-Dist: mike (==0.5.3) ; extra == 'all'
Requires-Dist: mkdocs (==1.2.3) ; extra == 'all'
Requires-Dist: mkdocs-awesome-pages-plugin (==2.7.0) ; extra == 'all'
Requires-Dist: mkdocs-material (==8.1.11) ; extra == 'all'
Requires-Dist: mkdocstrings (==0.18.0) ; extra == 'all'
Requires-Dist: ipython-genutils (==0.1.0) ; extra == 'all'
Requires-Dist: mkdocs-jupyter (==0.20.0) ; extra == 'all'
Requires-Dist: nbconvert (==6.4.2) ; extra == 'all'
Requires-Dist: numpydoc (==1.2) ; extra == 'all'
Requires-Dist: spacy (==3.2.2) ; extra == 'all'
Requires-Dist: jinja2 (==3.0.3) ; extra == 'all'
Provides-Extra: dev
Requires-Dist: scikit-learn (==1.0.2) ; extra == 'dev'
Requires-Dist: scikit-surprise (==1.1.1) ; extra == 'dev'
Requires-Dist: torch (==1.11) ; extra == 'dev'
Requires-Dist: pandas (~=1.3.2) ; extra == 'dev'
Requires-Dist: numpy (>=1.21.6) ; extra == 'dev'
Requires-Dist: river (~=0.10.1) ; extra == 'dev'
Requires-Dist: tqdm (~=4.61.2) ; extra == 'dev'
Requires-Dist: pytest (==7.0.1) ; extra == 'dev'
Requires-Dist: graphviz (>=0.10.1) ; extra == 'dev'
Requires-Dist: matplotlib (>=3.0.2) ; extra == 'dev'
Requires-Dist: mypy (>=0.761) ; extra == 'dev'
Requires-Dist: pre-commit (>=2.9.2) ; extra == 'dev'
Requires-Dist: pytest (>=4.5.0) ; extra == 'dev'
Requires-Dist: pytest-cov (>=2.6.1) ; extra == 'dev'
Requires-Dist: scikit-learn (>=0.22.1) ; extra == 'dev'
Requires-Dist: black (>=22.1.0) ; extra == 'dev'
Requires-Dist: flake8 (>=4.0.1) ; extra == 'dev'
Requires-Dist: isort (>=5.9.3) ; extra == 'dev'
Requires-Dist: jupyter (==1.0.0) ; extra == 'dev'
Provides-Extra: docs
Requires-Dist: flask (==2.0.2) ; extra == 'docs'
Requires-Dist: ipykernel (==6.9.0) ; extra == 'docs'
Requires-Dist: mike (==0.5.3) ; extra == 'docs'
Requires-Dist: mkdocs (==1.2.3) ; extra == 'docs'
Requires-Dist: mkdocs-awesome-pages-plugin (==2.7.0) ; extra == 'docs'
Requires-Dist: mkdocs-material (==8.1.11) ; extra == 'docs'
Requires-Dist: mkdocstrings (==0.18.0) ; extra == 'docs'
Requires-Dist: ipython-genutils (==0.1.0) ; extra == 'docs'
Requires-Dist: mkdocs-jupyter (==0.20.0) ; extra == 'docs'
Requires-Dist: nbconvert (==6.4.2) ; extra == 'docs'
Requires-Dist: numpydoc (==1.2) ; extra == 'docs'
Requires-Dist: spacy (==3.2.2) ; extra == 'docs'
Requires-Dist: jinja2 (==3.0.3) ; extra == 'docs'
Provides-Extra: test
Requires-Dist: scikit-learn (==1.0.2) ; extra == 'test'
Requires-Dist: scikit-surprise (==1.1.1) ; extra == 'test'
Requires-Dist: torch (==1.11) ; extra == 'test'
Requires-Dist: pandas (~=1.3.2) ; extra == 'test'
Requires-Dist: numpy (>=1.21.6) ; extra == 'test'
Requires-Dist: river (~=0.10.1) ; extra == 'test'
Requires-Dist: tqdm (~=4.61.2) ; extra == 'test'
Requires-Dist: pytest (==7.0.1) ; extra == 'test'
Requires-Dist: graphviz (>=0.10.1) ; extra == 'test'
Requires-Dist: matplotlib (>=3.0.2) ; extra == 'test'
Requires-Dist: mypy (>=0.761) ; extra == 'test'
Requires-Dist: pre-commit (>=2.9.2) ; extra == 'test'
Requires-Dist: pytest (>=4.5.0) ; extra == 'test'
Requires-Dist: pytest-cov (>=2.6.1) ; extra == 'test'
Requires-Dist: scikit-learn (>=0.22.1) ; extra == 'test'
Requires-Dist: black (>=22.1.0) ; extra == 'test'
Requires-Dist: flake8 (>=4.0.1) ; extra == 'test'
Requires-Dist: isort (>=5.9.3) ; extra == 'test'
Requires-Dist: jupyter (==1.0.0) ; extra == 'test'


![GitHub last commit](https://img.shields.io/github/last-commit/kulbachcedric/DeepRiver)
[![unit-tests](https://github.com/kulbachcedric/DeepRiver/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/kulbachcedric/DeepRiver/actions/workflows/unit-tests.yml)
![Codecov](https://img.shields.io/codecov/c/github/kulbachcedric/DeepRiver)
[![docs](https://github.com/kulbachcedric/IncrementalTorch/actions/workflows/mkdocs.yml/badge.svg)](https://github.com/kulbachcedric/IncrementalTorch/actions/workflows/unit_test.yml)

<p align="center">
  <img height="150px" src="docs/img/logo.png" alt="incremental dl logo">
</p>

<p align="center">
    DeepRiver is a Python library for online deep learning.
    DeepRivers ambition is to enable <a href="https://www.wikiwand.com/en/Online_machine_learning">online machine learning</a> for neural networks.
    It combines the <a href="https://www.riverml.xyz">river</a> API with the capabilities of designing neural networks based on <a href="https://pytorch.org">PyTorch</a>.
</p>

## 💈 Installation
```shell
pip install river-torch
```
You can install the latest development version from GitHub as so:
```shell
pip install https://github.com/online-ml/river-torch --upgrade
```

Or, through SSH:
```shell
pip install git@github.com:online-ml/river-torch.git --upgrade
```


## 🍫 Quickstart
We build the development of neural networks on top of the <a href="https://www.riverml.xyz">river API</a> and refer to the rivers design principles.
The following example creates a simple MLP architecture based on PyTorch and incrementally predicts and trains on the website phishing dataset.
For further examples check out the <a href="https://online-ml.github.io/river-torch">Documentation</a>.
### Classification
```python
>>> from river import datasets
>>> from river import metrics
>>> from river import preprocessing
>>> from river import compose
>>> from river_torch import classification
>>> from torch import nn
>>> from torch import optim
>>> from torch import manual_seed

>>> _ = manual_seed(42)


>>> def build_torch_mlp_classifier(n_features):  # build neural architecture
...     net = nn.Sequential(
...         nn.Linear(n_features, 5),
...         nn.Linear(5, 5),
...         nn.Linear(5, 5),
...         nn.Linear(5, 5),
...         nn.Linear(5, 1),
...         nn.Sigmoid()
...     )
...     return net


>>> model = compose.Pipeline(
...     preprocessing.StandardScaler(),
...     classification.Classifier(build_fn=build_torch_mlp_classifier, loss_fn='bce', optimizer_fn=optim.Adam, learning_rate=1e-3)
... )

>>> dataset = datasets.Phishing()
>>> metric = metrics.Accuracy()

>>> for x, y in dataset:
...     y_pred = model.predict_one(x)  # make a prediction
...     metric = metric.update(y, y_pred)  # update the metric
...     model = model.learn_one(x, y)  # make the model learn

>>> print(f'Accuracy: {metric.get()}')
Accuracy: 0.8304

```

### Anomaly Detection

```python
>>> import math
>>> from river import datasets, metrics
>>> from river_torch.base import AutoencodedAnomalyDetector
>>> from river_torch.utils import get_activation_fn
>>> from torch import manual_seed, nn

>>> _ = manual_seed(42)

>>> def get_encoder(activation_fn="selu", dropout=0.5, n_features=3):
...     activation = get_activation_fn(activation_fn)
...     encoder = nn.Sequential(
...         nn.Dropout(p=dropout),
...         nn.Linear(in_features=n_features, out_features=math.ceil(n_features / 2)),
...         activation(),
...         nn.Linear(in_features=math.ceil(n_features / 2), out_features=math.ceil(n_features / 4)),
...         activation(),
...     )
...     return encoder

>>> def get_decoder(activation_fn="selu", dropout=0.5, n_features=3):
...     activation = get_activation_fn(activation_fn)
...     decoder = nn.Sequential(
...         nn.Linear(in_features=math.ceil(n_features / 4), out_features=math.ceil(n_features / 2)),
...         activation(),
...         nn.Linear(in_features=math.ceil(n_features / 2), out_features=n_features),
...     )
...     return decoder


>>> dataset = datasets.CreditCard().take(5000)
>>> metric = metrics.ROCAUC()
>>> encoder_fn = get_encoder
>>> decoder_fn = get_decoder
>>> dataset = datasets.CreditCard().take(5000)
>>> metric = metrics.ROCAUC()

>>> model = AutoencodedAnomalyDetector(encoder_fn=encoder_fn,decoder_fn=decoder_fn, lr=0.01)

>>> for x,y in dataset:
...     score = model.score_one(x)
...     metric = metric.update(y_true=y, y_pred=score)
...     model = model.learn_one(x=x)

```

## 🏫 Affiliations
<p align="center">
    <img src="https://upload.wikimedia.org/wikipedia/de/thumb/4/44/Fzi_logo.svg/1200px-Fzi_logo.svg.png?raw=true" alt="FZI Logo" height="200"/>
</p>
