Skip to main content

Fast, sklearn-compatible Factorization Machines and Field-aware Factorization Machines

Project description

modern_fm

PyPI Python versions CI License: MIT

Fast, sklearn-compatible Factorization Machines (FM) and Field-aware Factorization Machines (FFM) for Python.

Status: v0.3 (Beta). A Rust CPU backend (parity-tested against pure-NumPy reference implementations) drives sklearn-style estimators — FMClassifier (binary + multiclass softmax), FMRegressor, and FFMClassifier (binary + multiclass softmax) — with the SGD / AdaGrad / Adam / FTRL-Proximal optimizers, mini-batch gradient averaging (batch_size), multi-core training via rayon (n_jobs), plus sample_weight/class_weight, label_smoothing, early stopping, a CategoricalEncoder, and save_model/load_model. FTRL's L1 (l1_linear/l1_factors) yields exact-zero weights. The estimators are scikit-learn check_estimator-compatible (drop into Pipeline / GridSearchCV), accept pandas / polars DataFrames, and load_libffm / dump_libffm read and write the libffm text format. See docs/roadmap.md for remaining niche gaps (FTRL + early stopping, multiclass + early-stopping for FFM).

Installation

pip install modern-fm        # prebuilt wheels for Linux/macOS/Windows, no Rust toolchain needed

To build from source instead (e.g. on a platform without a prebuilt wheel), see Development below; it requires a Rust toolchain.

Usage

from modern_fm import FMClassifier, FFMClassifier

model = FMClassifier(
    n_factors=16,
    optimizer="adagrad",
    learning_rate=0.05,
    max_iter=100,
    batch_size=256,        # mini-batch gradient averaging (1 = per-row SGD)
    n_jobs=-1,             # train batches across all CPU cores
    l2_linear=1e-5,
    l2_factors=1e-5,
    random_state=42,
)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)

# FTRL-Proximal with L1 for sparse linear weights (classic CTR setup)
sparse = FMClassifier(optimizer="ftrl", l1_linear=1.0, batch_size=256, random_state=42)
sparse.fit(X_train, y_train)

ffm = FFMClassifier(n_factors=8, n_jobs=-1, random_state=42)
ffm.fit(X_train, y_train, field_ids=field_ids)

FMRegressor, multiclass FMClassifier (just pass a target with >2 classes), early stopping (early_stopping=True or eval_set=(X_val, y_val)), and the CategoricalEncoder are demonstrated in examples/basic_usage.py. benchmarks/bench_synthetic.py reports fit time and predict throughput against the NumPy reference floor.

Benchmarks

On synthetic CTR data (40k train / 20k test; 16 one-hot categorical fields → 256 features) with planted pairwise interactions between field pairs — signal a linear model cannot represent — FM/FFM recover most of it. n_jobs=-1 uses all cores (8 here); absolute numbers vary by machine.

Model Test AUC Fit (s) Predict (rows/s)
LogisticRegression (sklearn) 0.694 0.01 60M
FMClassifier (batch=1) 0.817 1.34 4.3M
FMClassifier (batch=512) 0.816 0.45 4.8M
FMClassifier (batch=512, n_jobs=-1) 0.816 0.33 5.0M
FFMClassifier (batch=512) 0.846 1.68 2.3M
FFMClassifier (batch=512, n_jobs=-1) 0.846 1.46 2.1M
  • Interactions matter: AUC climbs 0.69 → 0.82 (FM) → 0.85 (FFM) as the model captures the pairwise / field-aware structure the linear baseline misses.
  • Mini-batch: batch_size=512 trains ~3× faster than per-row SGD at equal AUC.
  • Multi-core: n_jobs=-1 adds a further ~1.2–1.4× here (more on larger/denser data).

Reproduce with python benchmarks/bench_vs_baseline.py. xlearn is auto-included if importable, but it does not build on every platform (it failed to build here on macOS/arm64 + CPython 3.11).

Development

Requires Python >= 3.10 and a recent Rust toolchain (1.74+; rustup update).

python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"   # builds the Rust extension via maturin
.venv/bin/pytest -q
.venv/bin/ruff check .

pip install -e . compiles rust/ and installs the extension as modern_fm._rust (maturin mixed layout, config in pyproject.toml). After editing Rust code, re-run pip install -e . to rebuild. Rust-only checks:

cd rust
PYO3_PYTHON=$PWD/../.venv/bin/python3 cargo test
PYO3_PYTHON=$PWD/../.venv/bin/python3 cargo clippy

Without the extension built, the package still works: modern_fm._backend falls back to the pure-NumPy reference implementations, and the parity tests in tests/test_rust_parity.py are skipped.

Design documents live in docs/ — start with docs/requirements.md and docs/math_spec.md. The roadmap is in docs/roadmap.md.

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

modern_fm-0.4.0.tar.gz (44.4 kB view details)

Uploaded Source

Built Distributions

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

modern_fm-0.4.0-cp310-abi3-win_amd64.whl (286.0 kB view details)

Uploaded CPython 3.10+Windows x86-64

modern_fm-0.4.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (398.7 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

modern_fm-0.4.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (682.6 kB view details)

Uploaded CPython 3.10+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file modern_fm-0.4.0.tar.gz.

File metadata

  • Download URL: modern_fm-0.4.0.tar.gz
  • Upload date:
  • Size: 44.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for modern_fm-0.4.0.tar.gz
Algorithm Hash digest
SHA256 c093a80dcf224ef7a20b31f3a58688cdbc19036bb70ee63f1da5f756338ee00f
MD5 c59232d4a394c7adc9cf2103bfd80c05
BLAKE2b-256 d4ea9b6716a3d7593e3b6a31bb7b5c4789ee8ef7d59cae906f32a63f2027680d

See more details on using hashes here.

Provenance

The following attestation bundles were made for modern_fm-0.4.0.tar.gz:

Publisher: release.yml on Matapanino/modern_fm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file modern_fm-0.4.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: modern_fm-0.4.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 286.0 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for modern_fm-0.4.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 0888b0b615804c5828fa33c1310fe2a91fefb06cb53206f9953f5e778fe83cd0
MD5 36007be1129104f2ee9e1b911dc57297
BLAKE2b-256 089d0583251a7e281df2912feb6a9def7acab0b5ce33915b499dcc4fb7e8387e

See more details on using hashes here.

Provenance

The following attestation bundles were made for modern_fm-0.4.0-cp310-abi3-win_amd64.whl:

Publisher: release.yml on Matapanino/modern_fm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file modern_fm-0.4.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for modern_fm-0.4.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6b2ec44131a348428a3afeb6bcc08f393d5123ea4b6d7e58fc6ca3db7c81acc
MD5 837ad8c14ae1a3c20e9cc8bcd2bcfbb1
BLAKE2b-256 d66b485570b5119ae7071488c41b7e50a33fb21cbfa399b0af90375ffbac4bf1

See more details on using hashes here.

Provenance

The following attestation bundles were made for modern_fm-0.4.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on Matapanino/modern_fm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file modern_fm-0.4.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for modern_fm-0.4.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 be5fe7759ccd0c8c3a3a1dc64eba07ba4caaaf01deff3658f3efc52ab8c7ec2f
MD5 d104e556805b87352438657f618083e1
BLAKE2b-256 f52d61ed9c7b56eac007637e77a12d137fa249c0895c1b74c9d765cdcdd2fe75

See more details on using hashes here.

Provenance

The following attestation bundles were made for modern_fm-0.4.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on Matapanino/modern_fm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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