Learn R Programming

themis

themis contains extra steps for the recipes package for dealing with unbalanced data. The name themis is that of the ancient Greek god who is typically depicted with a balance.

themis handles imbalance in both classification and regression problems: alongside the many classification samplers, step_smogn() resamples an imbalanced numeric outcome. Its nearest-neighbor-based steps are also not limited to Euclidean distance, the distance argument supports euclidean, cosine, mahalanobis, manhattan, and chebyshev metrics.

Installation

You can install the released version of themis from CRAN with:

install.packages("themis")

Install the development version from GitHub with:

# install.packages("pak")
pak::pak("tidymodels/themis")

Example

Following is an example of using the SMOTE algorithm to deal with unbalanced data

library(recipes)
library(modeldata)
library(themis)

data("credit_data", package = "modeldata")

credit_data0 <- credit_data |>
  filter(!is.na(Job))

count(credit_data0, Job)
#>         Job    n
#> 1     fixed 2805
#> 2 freelance 1024
#> 3    others  171
#> 4   partime  452

ds_rec <- recipe(Job ~ Time + Age + Expenses, data = credit_data0) |>
  step_impute_mean(all_predictors()) |>
  step_smote(Job, over_ratio = 0.25) |>
  prep()

ds_rec |>
  bake(new_data = NULL) |>
  count(Job)
#> # A tibble: 4 × 2
#>   Job           n
#>   <fct>     <int>
#> 1 fixed      2805
#> 2 freelance  1024
#> 3 others      701
#> 4 partime     701

Methods

Below is some unbalanced data. Used for examples later.

example_data <- data.frame(class = letters[rep(1:5, 1:5 * 10)],
                           x = rnorm(150))

library(ggplot2)

example_data |>
  ggplot(aes(class)) +
  geom_bar()

Upsample / Over-sampling

The following methods all share the tuning parameter over_ratio, which is the ratio of the minority-to-majority frequencies.

namefunctionMulti-class
Random minority over-sampling with replacementstep_upsample():heavy_check_mark:
Synthetic Minority Over-sampling Techniquestep_smote():heavy_check_mark:
SMOTE for datasets with continuous and nominal featuresstep_smotenc():heavy_check_mark:
SMOTE for nominal features onlystep_smoten():heavy_check_mark:
Borderline SMOTE-1step_bsmote(all_neighbors = FALSE):heavy_check_mark:
Borderline SMOTE-2step_bsmote(all_neighbors = TRUE):heavy_check_mark:
Support-vector SMOTEstep_svmsmote():heavy_check_mark:
KMeans-SMOTEstep_kmeans_smote():heavy_check_mark:
Adaptive synthetic sampling approach for imbalanced learningstep_adasyn():heavy_check_mark:
Generation of synthetic data by Randomly Over Sampling Examplesstep_rose()

step_smogn() also over-samples, but for imbalanced regression rather than classification: it resamples a numeric outcome instead of a class, so it does not use over_ratio and is not shown in the table above.

By setting over_ratio = 1 you bring the number of samples of all minority classes equal to 100% of the majority class.

recipe(~., example_data) |>
  step_upsample(class, over_ratio = 1) |>
  prep() |>
  bake(new_data = NULL) |>
  ggplot(aes(class)) +
  geom_bar()

and by setting over_ratio = 0.5 we upsample any minority class with fewer samples than 50% of the majority up to have 50% of the majority.

recipe(~., example_data) |>
  step_upsample(class, over_ratio = 0.5) |>
  prep() |>
  bake(new_data = NULL) |>
  ggplot(aes(class)) +
  geom_bar()

Downsample / Under-sampling

Most of the following methods all share the tuning parameter under_ratio, which is the ratio of the majority-to-minority frequencies.

namefunctionMulti-classunder_ratio
Random majority under-sampling with replacementstep_downsample():heavy_check_mark::heavy_check_mark:
NearMiss-1, NearMiss-2, and NearMiss-3step_nearmiss(version = ):heavy_check_mark::heavy_check_mark:
Instance hardness thresholdstep_instance_hardness():heavy_check_mark::heavy_check_mark:
Cluster centroidsstep_cluster_centroids():heavy_check_mark::heavy_check_mark:
Condensed nearest neighborsstep_cnn():heavy_check_mark:
Edited nearest neighborsstep_enn():heavy_check_mark:
Neighborhood cleaning rulestep_ncl():heavy_check_mark:
One-sided selectionstep_oss():heavy_check_mark:
Extraction of majority-minority Tomek linksstep_tomek()

By setting under_ratio = 1 you bring the number of samples of all majority classes equal to 100% of the minority class.

recipe(~., example_data) |>
  step_downsample(class, under_ratio = 1) |>
  prep() |>
  bake(new_data = NULL) |>
  ggplot(aes(class)) +
  geom_bar()

and by setting under_ratio = 2 we downsample any majority class with more than 200% samples of the minority class down to have 200% samples of the minority.

recipe(~., example_data) |>
  step_downsample(class, under_ratio = 2) |>
  prep() |>
  bake(new_data = NULL) |>
  ggplot(aes(class)) +
  geom_bar()

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

Copy Link

Version

Install

install.packages('themis')

Monthly Downloads

10,233

Version

1.1.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Emil Hvitfeldt

Last Published

August 2nd, 2026

Functions in themis (1.1.0)

adasyn

Adaptive Synthetic Algorithm
bsmote

Borderline-SMOTE Algorithm
instance_hardness

Remove hard to classify points
nearmiss

Remove Points Near Other Classes
cluster_centroids

ClusterCentroids Algorithm
ncl

Neighborhood Cleaning Rule
circle_example

Synthetic Dataset With a Circle
cnn

Condensed Nearest Neighbors
kmeans_smote

KMeans-SMOTE Algorithm
enn

Edited Nearest Neighbors
reexports

Objects exported from other packages
smotenc

SMOTENC Algorithm
rose

ROSE Algorithm
oss

One-Sided Selection
step_bsmote

Apply Borderline-SMOTE Algorithm
smote

SMOTE Algorithm
smogn

SMOGN Algorithm
smoten

SMOTEN Algorithm
step_adasyn

Apply Adaptive Synthetic Algorithm
required_pkgs.step_adasyn

S3 methods for tracking which additional packages are needed for steps.
step_oss

One-Sided Selection
step_downsample

Down-Sample a Data Set Based on a Factor Variable
step_cnn

Condensed Nearest Neighbors
step_cluster_centroids

Under-Sampling by Cluster Centroids
step_instance_hardness

Remove hard to classify points
step_ncl

Neighborhood Cleaning Rule
step_nearmiss

Remove Points Near Other Classes
step_enn

Edited Nearest Neighbors
step_rose

Apply ROSE Algorithm
step_kmeans_smote

Apply KMeans-SMOTE Algorithm
step_smotenc

Apply SMOTENC Algorithm
tomek

Remove Tomek's Links
svmsmote

SVM-SMOTE Algorithm
step_smogn

Apply SMOGN Algorithm
step_tomek

Remove Tomek's Links
step_svmsmote

Apply SVM-SMOTE Algorithm
step_smoten

Apply SMOTEN Algorithm
step_upsample

Up-Sample a Data Set Based on a Factor Variable
themis-package

themis: Extra Recipes Steps for Dealing with Unbalanced Data
step_smote

Apply SMOTE Algorithm
tunable.step_adasyn

tunable methods for themis