Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ __pycache__/
build/
dist/
sklearn_json.egg-info/

.ignore/*
test.*
16 changes: 16 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
exclude: "models/"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: 'v0.0.265'
hooks:
- id: ruff
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ deserialized_model.predict(X)
```

# Features
The list of supported models is rapidly growing. If you have a request for a model or feature, please reach out to support@mlrequest.com.
The list of supported models is rapidly growing. If you have a request for a model or feature, please reach out to aheldrich@yahoo.com.

sklearn-json requires scikit-learn >= 0.21.3.

Expand Down Expand Up @@ -65,3 +65,7 @@ sklearn-json requires scikit-learn >= 0.21.3.
* `sklearn.ensemble.RandomForestRegressor`
* `sklearn.ensemble.GradientBoostingRegressor`
* `sklearn.neural_network.MLPRegressor`

## Upcoming

* preproccessing
46 changes: 46 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
[tool.ruff]
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default. Add isort
select = ["E", "F", "I", "D"]
ignore = ["D100", "D101", "D102", "D103", "D104"]

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
unfixable = []

# Exclude a variety of commonly ignored directories.
exclude = [
".bzr",
".direnv",
".eggs",
".git",
".git-rewrite",
".hg",
".mypy_cache",
".nox",
".pants.d",
".pytype",
".ruff_cache",
".svn",
".tox",
".venv",
"__pypackages__",
"_build",
"buck-out",
"build",
"dist",
"node_modules",
"venv",
]

# Same as Black.
line-length = 88

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.10.
target-version = "py310"

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10
39 changes: 20 additions & 19 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
import setuptools

with open("README.md", "r") as fh:
long_description = fh.read()

setuptools.setup(
name='sklearn-json',
version='0.1.0',
author="Mathieu Rodrigue",
author_email="support@mlrequest.com",
description="A safe, transparent way to share and deploy scikit-learn models.",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/mlrequest/sklearn-json",
packages=setuptools.find_packages(),
install_requires=[
'scikit-learn>=0.21.3',
],
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.5',
)
name="sklearn-json",
version="0.1.0",
author="Mathieu Rodrigue",
author_email="support@mlrequest.com",
description="A safe, transparent way to share and deploy scikit-learn models.",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/mlrequest/sklearn-json",
packages=setuptools.find_packages(),
install_requires=[
"scikit-learn>=0.21.3",
],
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.5",
)
85 changes: 49 additions & 36 deletions sklearn_json/__init__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
from sklearn_json import classification as clf
from sklearn_json import regression as reg
from sklearn import svm, discriminant_analysis, dummy
from sklearn.linear_model import LogisticRegression, Perceptron
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, RandomForestRegressor, GradientBoostingRegressor, _gb_losses
from sklearn.naive_bayes import BernoulliNB, GaussianNB, MultinomialNB, ComplementNB
from sklearn.linear_model import LinearRegression, Lasso, Ridge
import json

from sklearn import discriminant_analysis, svm
from sklearn.ensemble import (
GradientBoostingClassifier,
GradientBoostingRegressor,
RandomForestClassifier,
RandomForestRegressor,
)
from sklearn.linear_model import (
Lasso,
LinearRegression,
LogisticRegression,
Perceptron,
Ridge,
)
from sklearn.naive_bayes import BernoulliNB, ComplementNB, GaussianNB, MultinomialNB
from sklearn.neural_network import MLPClassifier, MLPRegressor
from sklearn.svm import SVR
import json
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor

__version__ = '0.1.0'
from sklearn_json import classification as clf
from sklearn_json import regression as reg

__version__ = "0.1.0"


def serialize_model(model):
Expand Down Expand Up @@ -58,55 +70,55 @@ def serialize_model(model):
elif isinstance(model, MLPRegressor):
return reg.serialize_mlp_regressor(model)
else:
raise ModellNotSupported('This model type is not currently supported. Email support@mlrequest.com to request a feature or report a bug.')
raise ModellNotSupported("This model type is not currently supported.")


def deserialize_model(model_dict):
if model_dict['meta'] == 'lr':
if model_dict["meta"] == "lr":
return clf.deserialize_logistic_regression(model_dict)
elif model_dict['meta'] == 'bernoulli-nb':
elif model_dict["meta"] == "bernoulli-nb":
return clf.deserialize_bernoulli_nb(model_dict)
elif model_dict['meta'] == 'gaussian-nb':
elif model_dict["meta"] == "gaussian-nb":
return clf.deserialize_gaussian_nb(model_dict)
elif model_dict['meta'] == 'multinomial-nb':
elif model_dict["meta"] == "multinomial-nb":
return clf.deserialize_multinomial_nb(model_dict)
elif model_dict['meta'] == 'complement-nb':
elif model_dict["meta"] == "complement-nb":
return clf.deserialize_complement_nb(model_dict)
elif model_dict['meta'] == 'lda':
elif model_dict["meta"] == "lda":
return clf.deserialize_lda(model_dict)
elif model_dict['meta'] == 'qda':
elif model_dict["meta"] == "qda":
return clf.deserialize_qda(model_dict)
elif model_dict['meta'] == 'svm':
elif model_dict["meta"] == "svm":
return clf.deserialize_svm(model_dict)
elif model_dict['meta'] == 'perceptron':
elif model_dict["meta"] == "perceptron":
return clf.deserialize_perceptron(model_dict)
elif model_dict['meta'] == 'decision-tree':
elif model_dict["meta"] == "decision-tree":
return clf.deserialize_decision_tree(model_dict)
elif model_dict['meta'] == 'gb':
elif model_dict["meta"] == "gb":
return clf.deserialize_gradient_boosting(model_dict)
elif model_dict['meta'] == 'rf':
elif model_dict["meta"] == "rf":
return clf.deserialize_random_forest(model_dict)
elif model_dict['meta'] == 'mlp':
elif model_dict["meta"] == "mlp":
return clf.deserialize_mlp(model_dict)

elif model_dict['meta'] == 'linear-regression':
elif model_dict["meta"] == "linear-regression":
return reg.deserialize_linear_regressor(model_dict)
elif model_dict['meta'] == 'lasso-regression':
elif model_dict["meta"] == "lasso-regression":
return reg.deserialize_lasso_regressor(model_dict)
elif model_dict['meta'] == 'ridge-regression':
elif model_dict["meta"] == "ridge-regression":
return reg.deserialize_ridge_regressor(model_dict)
elif model_dict['meta'] == 'svr':
elif model_dict["meta"] == "svr":
return reg.deserialize_svr(model_dict)
elif model_dict['meta'] == 'decision-tree-regression':
elif model_dict["meta"] == "decision-tree-regression":
return reg.deserialize_decision_tree_regressor(model_dict)
elif model_dict['meta'] == 'gb-regression':
elif model_dict["meta"] == "gb-regression":
return reg.deserialize_gradient_boosting_regressor(model_dict)
elif model_dict['meta'] == 'rf-regression':
elif model_dict["meta"] == "rf-regression":
return reg.deserialize_random_forest_regressor(model_dict)
elif model_dict['meta'] == 'mlp-regression':
elif model_dict["meta"] == "mlp-regression":
return reg.deserialize_mlp_regressor(model_dict)
else:
raise ModellNotSupported('Model type not supported or corrupt JSON file. Email support@mlrequest.com to request a feature or report a bug.')
raise ModellNotSupported("Model type not supported or corrupt JSON file.")


def to_dict(model):
Expand All @@ -118,14 +130,15 @@ def from_dict(model_dict):


def to_json(model, model_name):
with open(model_name, 'w') as model_json:
with open(model_name, "w") as model_json:
json.dump(serialize_model(model), model_json)


def from_json(model_name):
with open(model_name, 'r') as model_json:
with open(model_name, "r") as model_json:
model_dict = json.load(model_json)
return deserialize_model(model_dict)


class ModellNotSupported(Exception):
pass
pass
Loading