Chaining generators through pipelines¶
This tutorial shows how to chain different generators using the provided Pipeline class.
Beware, this pipeline class is not compatible with the sklearn Pipeline class
In [1]:
Copied!
import badgers
badgers.__version__
import badgers
badgers.__version__
Out[1]:
'0.0.14'
In [2]:
Copied!
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.datasets import make_blobs
from badgers.core.pipeline import Pipeline
from badgers.generators.tabular_data.imbalance import RandomSamplingClassesGenerator
from badgers.generators.tabular_data.noise import GaussianNoiseGenerator
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.datasets import make_blobs
from badgers.core.pipeline import Pipeline
from badgers.generators.tabular_data.imbalance import RandomSamplingClassesGenerator
from badgers.generators.tabular_data.noise import GaussianNoiseGenerator
Setup random generator¶
In [3]:
Copied!
from numpy.random import default_rng
seed = 0
rng = default_rng(seed)
from numpy.random import default_rng
seed = 0
rng = default_rng(seed)
Load data¶
Here we simply generate fake data using make_blobs from scikit-learn (see documentation)
In [4]:
Copied!
X, y = make_blobs(centers=4, random_state=0, cluster_std=0.6)
X, y = make_blobs(centers=4, random_state=0, cluster_std=0.6)
Chaining the generators¶
In [5]:
Copied!
generators = {
'imbalance': RandomSamplingClassesGenerator(random_generator=rng),
'noise': GaussianNoiseGenerator(random_generator=rng)
}
pipeline = Pipeline(generators=generators)
params = {
'imbalance': {'proportion_classes':{0:0.6, 1:0.25, 2:0.1, 3:0.05}},
'noise': {'noise_std': 0.5}
}
Xt, yt = pipeline.generate(X=X.copy(), y=y, params=params)
generators = {
'imbalance': RandomSamplingClassesGenerator(random_generator=rng),
'noise': GaussianNoiseGenerator(random_generator=rng)
}
pipeline = Pipeline(generators=generators)
params = {
'imbalance': {'proportion_classes':{0:0.6, 1:0.25, 2:0.1, 3:0.05}},
'noise': {'noise_std': 0.5}
}
Xt, yt = pipeline.generate(X=X.copy(), y=y, params=params)
Visualization¶
Here is some code to visualize both the original and the transformed data
In [6]:
Copied!
Xt[:5]
Xt[:5]
Out[6]:
array([[ 1.20572833, 3.45341106],
[ 1.24022563, 5.06459723],
[-0.23972431, 3.45272907],
[ 2.56611455, 4.02556266],
[-0.18904398, 3.97085931]])
In [7]:
Copied!
fig, axes = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(8,4))
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, palette=sns.color_palette("tab10")[:4], ax=axes[0])
sns.scatterplot(x=Xt[:, 0], y=Xt[:, 1], hue=yt, palette=sns.color_palette("tab10")[:4], ax=axes[1])
axes[0].set_title('Original')
axes[1].set_title('Transformed')
plt.tight_layout();
fig, axes = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(8,4))
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, palette=sns.color_palette("tab10")[:4], ax=axes[0])
sns.scatterplot(x=Xt[:, 0], y=Xt[:, 1], hue=yt, palette=sns.color_palette("tab10")[:4], ax=axes[1])
axes[0].set_title('Original')
axes[1].set_title('Transformed')
plt.tight_layout();
Visualizing the number of instances for all classs¶
In [8]:
Copied!
fig, axes = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(8,4))
classes, nb = np.unique(y, return_counts=True)
axes[0].bar(classes, nb, color=[f'C{i}' for i in range(len(classes))])
axes[0].set_xlabel('classes')
axes[0].set_ylabel('number of instances')
classes_t, nb_t = np.unique(yt, return_counts=True)
axes[1].bar(classes_t, nb_t, color=[f'C{i}' for i in range(len(classes_t))])
axes[1].set_xlabel('classes')
axes[1].set_ylabel('number of instances')
axes[0].set_title('Original')
axes[1].set_title('Transformed')
plt.tight_layout();
fig, axes = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(8,4))
classes, nb = np.unique(y, return_counts=True)
axes[0].bar(classes, nb, color=[f'C{i}' for i in range(len(classes))])
axes[0].set_xlabel('classes')
axes[0].set_ylabel('number of instances')
classes_t, nb_t = np.unique(yt, return_counts=True)
axes[1].bar(classes_t, nb_t, color=[f'C{i}' for i in range(len(classes_t))])
axes[1].set_xlabel('classes')
axes[1].set_ylabel('number of instances')
axes[0].set_title('Original')
axes[1].set_title('Transformed')
plt.tight_layout();