Imagine you create a binary classification model and you have 100 images of a Dog and 10000 images of a Cat. In this case, it has a very different relative importance for each class. The correctness is more important for some samples than others. For instance, it might be 1-100x more important to correctly classify some samples than other samples.
In imbalanced classification problems, if one class is more important (or expensive) than another then you should be weighing the data. The idea is to give more weight to rarely-seen classes.
sample_weights
functionality adds more importance to some samples than others during training. so that the loss function used by the model is weighted per sample not per class. It changes the way the loss is calculated.
Using the sample weight
A “sample weights” array is an array of numbers that specify how much weight each sample in a batch should have in computing the total loss.
sample_weight = np.ones(shape=(len(y_train),))
sample_weight[y_train == 3] = 1.5
Here we use sample weights to give more importance to class #3. It is possible to pass sample weights to a model when using fit:
model.fit(x_train, y_train,
sample_weight=sample_weight,
batch_size=64,
epochs=5)
The fit method of the classifier accepts a sample_weight array which assigns weights to individual samples.
The difference between class_weight and sample_weight
class_weight
regards the weights of all classes for the entire dataset and it is fixed whereas the sample_weight
regards the weights of all classes for each individual batch of data created by the generator. sample_weight
is defined on a per-sample basis and is independent of the class.
class_weight
is useful when training on highly skewed data sets, for example, a classifier to detect fraudulent transactions. sample_weight
is useful when you don’t have equal confidence in the samples in your batch. A common example is performing regression on measurements with variable uncertainty.
Using the sample_weight
we can weight newer data more than old, forcing the model to adapt to new behavior more quickly, without ignoring valuable old data.
The conclusion is that both class_weight
and sample_weight
only affect training loss, no effect on any metrics or validation loss.
Related Post
- How to set class weight for imbalance dataset in Keras?
- Split Imbalanced dataset using sklearn Stratified train_test_split().
- Micro and Macro Averages for imbalance multiclass classification
- Calculate Precision, Recall and F1 score for Keras model