Note
Go to the end to download the full example code.
Spatial perturbations and logistic regression
This example illustrates the use of the skwdro.linear_models.LogisticRegression class on datasets that are shifted at test time.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_moons
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from skwdro.linear_models import LogisticRegression
from utils.classifier_comparison import plot_classifier_comparison
Setup
n = 500 # Total number of samples
n_train = (3 * n) // 4 # Number of training samples
n_test = n - n_train # Number of test samples
sdevs = [(2.5, 5), (1, 5)]
# Fix centers for blobs dataset
pos = 4
centers = [np.array([-pos,-pos]), np.array([pos,pos])]
# Create datasets with variance that is shifted at test time
datasets = []
for (sdev_1, sdev_2) in sdevs:
train_dataset = make_blobs(n_samples=n_train, centers=centers, cluster_std=(sdev_1, sdev_2)) # type: ignore
test_dataset = make_blobs(n_samples=n_test, centers=centers, cluster_std=(sdev_2, sdev_1)) # type: ignore
datasets.append((train_dataset, test_dataset))
WDRO classifiers
# Rho chosen analytically
rhos = [0, 2*4**2]
# Kappa: weight of label shift
kappa = 1000
# Cost:
# t: torch backend
# NLC: norm cost that takes labels into account
# 2 2 : squared 2-norm
# kappa: weight of label shift
cost = f"t-NLC-2-2-{kappa}"
# WDRO classifier
classifiers = []
for rho in rhos:
classifiers.append(LogisticRegression(rho=rho, cost=cost))
Make plot

Dataset 0, Classifier Logistic Regression: Test Acc. 95%, F1 95%
Dataset 0, Classifier WDRO Logistic Regression: Test Acc. 85%, F1 83%
Dataset 1, Classifier Logistic Regression: Test Acc. 81%, F1 84%
Dataset 1, Classifier WDRO Logistic Regression: Test Acc. 90%, F1 91%
Total running time of the script: (0 minutes 33.304 seconds)