WRSVM

Open-Source Python, R, and Julia Toolkit for Robust Multiclass Classification Under Class Imbalance and Label Noise.

Python 3.9+ R 4.0+ Julia 1.9+ MIT License

What is WRSVM?

WRSVM combines class-weighted regularization with per-class slack relaxation, producing a multiclass SVM that remains accurate when (a) class sizes are severely imbalanced and (b) a fraction of training labels are corrupted. The framework supports four decomposition strategies (Crammer-Singer, SimMSVM, One-vs-One, One-vs-Rest) crossed with four formulations: SVM, RSVM, WSVM, and WRSVM.

Class-weighted

Per-class regularization caps prevent the majority class from dominating the dual.

Noise-robust

Per-class slack budgets absorb mislabeled minority samples without sacrificing margin.

Three runtimes

Identical formulation in Python (CVXPY), R (reticulate wrapper), and Julia (JuMP).

Install

Pick your language. Full troubleshooting is in each package’s INSTALL.md.

Python (wrsvm)

Requires Python 3.9+.

# core install
pip install wrsvm

# from a local clone
cd wrsvm_package
pip install -e .

# optional extras
pip install "wrsvm[gpu]"      # PyTorch kernel backend
pip install "wrsvm[gurobi]"   # Gurobi solver
pip install "wrsvm[dev]"      # pytest + coverage

Quick start

from wrsvm import WRSVMClassifier, inject_outliers_minority
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X = StandardScaler().fit_transform(X)

y_noisy = inject_outliers_minority(X, y, outlier_rate=0.3, seed=0)

clf = WRSVMClassifier(C=100.0, gamma=0.1, upsilon=0.2)
clf.fit(X, y_noisy)
print("accuracy:", clf.score(X, y))

Full Python install guide →

R (WRSVMr)

Requires R 4.0+ and a working Python with the wrsvm package.

# 1) Python backend (one-time)
reticulate::install_python(version = "3.11.9")
reticulate::py_install("wrsvm", pip = TRUE)

# 2) R wrapper
remotes::install_github("annicenajafi/wrsvm", subdir = "WRSVMr")

# or from a local clone:
remotes::install_local("path/to/WRSVMr")

Quick start

library(WRSVMr)

data(iris)
X <- scale(as.matrix(iris[, 1:4]))
y <- as.integer(iris$Species)

y_noisy <- inject_outliers_minority(X, y, outlier_rate = 0.3, seed = 0)

fit <- wrsvm_fit(X, y_noisy,
                 strategy = "cs",
                 C = 100, gamma = 0.1, upsilon = 0.2)

mean(wrsvm_predict(fit, X) == y)

Full R install guide →

Julia (WRSVM.jl)

Requires Julia 1.9+. Pure Julia, no Python required.

using Pkg

# from a local clone (recommended while iterating)
Pkg.develop(path = "path/to/WRSVM.jl")
Pkg.instantiate()

# or activate the package's own environment for reproducibility
Pkg.activate("path/to/WRSVM.jl")
Pkg.instantiate()

Quick start

using WRSVM, Statistics

X = randn(100, 4)
y = rand(1:3, 100)
y_noisy = inject_outliers_minority(X, y; outlier_rate = 0.3, seed = 0)

model = solve_crammer_singer(X, y_noisy;
                             C = 100.0, gamma = 0.1, upsilon = 0.2)

preds = predict_cs(model, X)
println("accuracy = ", mean(preds .== y))

Full Julia install guide →

Decomposition strategies

StrategyDual sizeNotes
cs N × K Crammer-Singer direct formulation
simmsvm N Simultaneous multiclass, ~10× faster than cs
ovo Nk + Nj One-vs-One pairs, majority vote
ovr N One-vs-Rest, K binary problems

Downloads

Python

wrsvm v0.2.0

pip / source

R

WRSVMr v0.1.0

remotes / source

Julia

WRSVM.jl v0.1.0

Pkg / source

Citation

@article{najafi2026wrsvm,
  title   = {Open-Source Python, R, and Julia Toolkit for Robust Multiclass Classification Under Class Imbalance and Label Noise},
  author  = {Najafi, Annice and Razzaghi, Talayeh},
  year    = {2026}
}