Open-Source Python, R, and Julia Toolkit for Robust Multiclass Classification Under Class Imbalance and Label Noise.
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.
Per-class regularization caps prevent the majority class from dominating the dual.
Per-class slack budgets absorb mislabeled minority samples without sacrificing margin.
Identical formulation in Python (CVXPY), R (reticulate wrapper), and Julia (JuMP).
Pick your language. Full troubleshooting is in each package’s INSTALL.md.
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
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))
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")
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)
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()
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))
| Strategy | Dual size | Notes |
|---|---|---|
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 |
@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}
}