Skip to main content

A PySpark MLOps library for simplified model training and optimization

Project description

smallaxe

CI

A PySpark MLOps library that simplifies model training, evaluation, and optimization for PySpark DataFrames.

Why smallaxe?

PySpark MLlib has a steep learning curve and verbose API. smallaxe provides a clean, scikit-learn-like interface for common ML workflows while leveraging the distributed power of Spark.

Features

  • Simple API - Train models with familiar fit()/predict() patterns
  • Multiple Algorithms - Random Forest (native), XGBoost, LightGBM, and CatBoost
  • Preprocessing Pipeline - Imputer, Scaler, Encoder with chainable pipelines
  • Cross-Validation - Train/test split and k-fold with stratified sampling
  • Metrics - Classification (accuracy, precision, recall, F1, AUC-ROC, AUC-PR, log loss) and regression (MSE, RMSE, MAE, R², MAPE)
  • Hyperparameter Optimization - hyperopt-backed search over any model's parameters

Installation

pip install smallaxe

Install with optional algorithm dependencies:

pip install smallaxe[xgboost]    # XGBoost support
pip install smallaxe[lightgbm]   # LightGBM support (SynapseML)
pip install smallaxe[catboost]   # CatBoost support
pip install smallaxe[all]        # All algorithms

Note on optional algorithms. Random Forest and XGBoost run anywhere PySpark runs. LightGBM (via SynapseML) and CatBoost (via catboost-spark) additionally require JVM Spark packages built for your Spark/Scala version and native libraries — they are intended for Linux Spark clusters (e.g. Databricks). See the compatibility matrix.

Quick Start

import smallaxe
from smallaxe.training import Regressors
from smallaxe.datasets import load_sample_regression

smallaxe.set_seed(42)  # reproducible splits

# Load sample data
df = load_sample_regression(spark)

# Train, evaluate, save, load, and predict in a handful of lines.
# Feature columns are inferred from the numeric columns when not specified.
model = Regressors.random_forest(n_estimators=100, max_depth=10)
model.fit(df, label_col="price", validation="train_test")
print(model.validation_scores)        # {'rmse': ..., 'r2': ..., ...}

model.save("/tmp/my_model")
reloaded = Regressors.load("/tmp/my_model")
predictions = reloaded.predict(df)     # identical to the original model

Usage Examples

Training with Cross-Validation

from smallaxe.training import Classifiers

model = Classifiers.xgboost(task="binary")
model.fit(
    df,
    label_col="churn",
    validation="kfold",
    n_folds=5,
    stratified=True,
)

print(model.validation_scores)   # includes mean_/std_ per metric across folds

Hyperparameter Optimization

smallaxe.search.optimize tunes any model using hyperopt. You pass a model template, a search space, and the metric to optimize; it returns the best params, the best validation score, a refit best_model, and the full trial history.

from hyperopt import hp
from smallaxe.search import optimize
from smallaxe.training import Regressors

result = optimize.run(
    Regressors.random_forest(seed=42),
    df,
    label_col="price",
    param_space={
        "n_estimators": hp.quniform("n_estimators", 40, 200, 20),
        "max_depth": hp.quniform("max_depth", 3, 15, 1),
        # a plain list is treated as discrete choices (hp.choice)
        "feature_subset_strategy": ["sqrt", "log2", "onethird"],
    },
    metric="rmse",            # minimized; r2/accuracy/auc_* are maximized
    validation="kfold",
    n_folds=5,
    max_evals=25,
    seed=42,
)

print(result.best_params, result.best_score)
predictions = result.best_model.predict(df)   # best_model is already fitted

Preprocessing Pipeline

from smallaxe.pipeline import Pipeline
from smallaxe.preprocessing import Imputer, Scaler, Encoder
from smallaxe.training import Regressors

pipeline = Pipeline([
    ("imputer", Imputer(numerical_strategy="median")),
    ("scaler", Scaler(method="standard")),
    ("encoder", Encoder(method="onehot")),
    ("model", Regressors.xgboost()),
])

pipeline.fit(
    df,
    label_col="target",
    numerical_cols=["age", "income"],
    categorical_cols=["city", "category"],
)

predictions = pipeline.predict(new_df)

End-to-End Examples

Runnable scripts on real Kaggle datasets live in examples/:

Example Task Dataset
titanic_classification.py Binary classification Kaggle Titanic
house_prices_regression.py Regression Kaggle King County house sales

Each script covers the full workflow: load → train → evaluate → save/load → optimize → predict.

python examples/titanic_classification.py
python examples/house_prices_regression.py

Supported Algorithms

Algorithm Regressor Classifier Dependencies
Random Forest None (native PySpark)
XGBoost smallaxe[xgboost]
LightGBM smallaxe[lightgbm] + SynapseML Spark package
CatBoost smallaxe[catboost] + catboost-spark Spark package

Use Regressors.available_models() / Classifiers.available_models() to see which algorithms are installed in the current environment, with install hints for the rest.

Compatibility Matrix

Component Supported
Python 3.8 – 3.12
PySpark 3.3 – 3.5 (Spark < 4.0)
Java 8 or 11 (required by Spark)
LightGBM (SynapseML) Spark 3.x / Scala 2.12 only (no Scala 2.13 build), Linux
CatBoost (catboost-spark) Spark 3.5 / Scala 2.12 or 2.13, Linux

LightGBM and CatBoost depend on JVM packages compiled for a specific Spark/Scala build and on native shared libraries, so they run on Linux Spark/Databricks clusters rather than locally on Apple Silicon. CatBoost publishes both catboost-spark_3.5_2.12 and catboost-spark_3.5_2.13; SynapseML (LightGBM) publishes only synapseml_2.12, so LightGBM is unavailable on Scala 2.13 runtimes. Neither supports Spark 4.0 yet. Random Forest and XGBoost have no such constraints.

LightGBM additionally needs SynapseML's Python API on the path — its Maven jar does not expose Python, so pip install synapseml (version matching the jar) is required in addition to the synapseml_2.12 package.

Validated end-to-end on Databricks (Spark 3.5.2): Random Forest, XGBoost, LightGBM (Scala 2.12) and CatBoost (Scala 2.13) train/evaluate/predict and tune via search.optimize. See examples/databricks_validation.py.

Development

# Set up the environment (PySpark needs Java 8/11)
export JAVA_HOME=/path/to/jdk11
pip install -e ".[dev]"        # add ,xgboost / ,all for optional algorithms

# Ensure Spark workers use the same Python as the driver
export PYSPARK_PYTHON=$(which python)
export PYSPARK_DRIVER_PYTHON=$(which python)

pytest -q                      # run the test suite
black . && ruff check .        # format + lint
mypy smallaxe/                 # type check

The optional-algorithm and end-to-end Kaggle tests skip automatically when their dependencies or network are unavailable, so the core suite always runs offline.

Roadmap

Planned for future releases (not yet available):

  • AutomatedTraining — train all available algorithms and compare them.
  • Plotly-based evaluation visualizations.
  • Multiclass/multilabel metrics, quantile regression, MLflow integration.

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smallaxe-0.8.0.tar.gz (116.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smallaxe-0.8.0-py3-none-any.whl (68.8 kB view details)

Uploaded Python 3

File details

Details for the file smallaxe-0.8.0.tar.gz.

File metadata

  • Download URL: smallaxe-0.8.0.tar.gz
  • Upload date:
  • Size: 116.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for smallaxe-0.8.0.tar.gz
Algorithm Hash digest
SHA256 d3608c9c2e44f7395b773e4ba884ef5e4cc7632b4ddb7fdc7479d56899e0eeb7
MD5 0a5bdf734ce88abeb5706e369ea23a11
BLAKE2b-256 b6f8edd77be25e23c473b639391ef215b9884047077cac52093267e9c262a9d1

See more details on using hashes here.

File details

Details for the file smallaxe-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: smallaxe-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 68.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for smallaxe-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a07f81117842181a2323984abd56832f2a1e02edc928560378f9dee211415232
MD5 98b553318d2975e81c5425b971795c95
BLAKE2b-256 607dc98c5e5f9d845f01ec9954403e96e9aa090e66e1a42e65bcd06235f45501

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page