I came across the following in Pattern Recognition and Machine Learning by Christopher Bishop -

A balanced data set in which we have selected equal numbers of examples from each of the classes would allow us to find a more accurate model. However, we then have to compensate for the effects of our modifications to the training data. Suppose we have used such a modified data set and found models for the posterior probabilities. From Bayes’ theorem, we see that the posterior probabilities are proportional to the prior probabilities, which we can interpret as the fractions of points in each class. We can therefore simply take the posterior probabilities obtained from our artificially balanced data set and first divide by the class fractions in that data set and then multiply by the class fractions in the population to which we wish to apply the model. Finally, we need to normalize to ensure that the new posterior probabilities sum to one.

I don't understand what the author intends to convey in the bold text above - I understand the need for balancing, but not how the "compensation for modification to training data" is being made.

Could someone please explain the compensation process in detail, and why it is needed - preferably with a numerical example to make things clearer? Thanks a lot!

P.S. For readers who want a background on why a balanced dataset might be necessary:

Consider our medical X-ray problem again, and suppose that we have collected a large number of X-ray images from the general population for use as training data in order to build an automated screening system. Because cancer is rare amongst the general population, we might find that, say, only 1 in every 1,000 examples corresponds to the presence of cancer. If we used such a data set to train an adaptive model, we could run into severe difficulties due to the small proportion of the cancer class. For instance, a classifier that assigned every point to the normal class would already achieve 99.9% accuracy and it would be difficult to avoid this trivial solution. Also, even a large data set will contain very few examples of X-ray images corresponding to cancer, and so the learning algorithm will not be exposed to a broad range of examples of such images and hence is not likely to generalize well.

  • 1
    $\begingroup$ The postscript's argument is generally refuted on this site; for a start, see stats.stackexchange.com/q/247871/232706 $\endgroup$ Jul 20, 2020 at 18:33
  • $\begingroup$ @BenReiniger no, that is not the case. Arguments to look at a different statistic are basically modifying the question rather than solving the problem. Sometimes accuracy is what you are interested, sometimes the training set is representative of operational conditions and sometimes you don't have enough examples of the minority class. In that situation your classifier may be biased against the minority class. Suggestions that there is no imbalance problem is overstating things, it just isn't as often a problem or as much as often claimed. $\endgroup$ Aug 2, 2021 at 17:26

4 Answers 4


I have practical experience with training classifiers from imbalanced training sets. There are problems with this. Basically, the variances of the parameters associated with the less frequent classes - these variances grow large. The more uneven the prior distribution is in the training set, the more volatile your classifier outcomes become.

My best practice solution - which works well for probabilistic classifiers - is to train from a completely balanced training set. This means that you have about equally many examples of each class or category. This classifier training on a balanced training set must afterwards be calibrated to the correct distribution in the application domain, in your case a clinical setting. That is - you need to incorporate the skewed real-world prior distribution into the outcome probabilities of your classifier.

The following formula does precisely this by correcting for the lack of skewness in the training set:

$ \begin{split} &P_{corrected}(class=j \mid {\bf x}) = \\ &\frac{\frac{P_{corrected}(class=j)}{P_{balanced}(class=j)}\; P_{balanced}(class=j \mid {\bf x})}{\frac{P_{corrected}(class=j)}{P_{balanced}(class=j)}\; P_{balanced}(class=j \mid {\bf x}) + \frac{1-P_{corrected}(class=j)}{1-P_{balanced}(class=j)}\; \left(1- P_{balanced}(class=j \mid {\bf x}) \right) } \end{split} $

In the above formula, the following terms are used:

$P_{balanced}(class=j)$ the prior probability that outcome $j$ occurs in your balanced training set, e.g. probability of 'No-Tumor', which would be around $0.5$ in a two-class situation, around $0.33$ in a three-class classification domain, etc.

$P_{corrected}(class=j)$ the prior probability that outcome $j$ occurs in your real-world domain, e.g. true probability of 'Tumor' in your clinical setting

$P_{balanced}(class=j \mid {\bf x})$ is the outcome probability (the posterior probability) of your classifier trained with the balanced training set.

$P_{corrected}(class=j \mid {\bf x})$ is the outcome probability (the posterior probability) of your classifier correctly adjusted to the clinical setting.

Correct posterior probability from classifier trained on a balanced training set to domain-applicable posterior probability. We convert to a situation where 'cancer' occurs in only 1% of the images presented to our classifier software:

$ \begin{split} &P_{corrected}(cancer \mid {\bf x}) = &\frac{\frac{0.01}{0.5}\; 0.81} {\frac{0.01}{0.5}\; 0.81 + \frac{1-0.01}{1-0.5}\; \left(1- 0.81 \right) } &=0.04128 \end{split} $

Derivation of correction formula

We use a capital $P$ to denote a probability (prior or posterior) and a small letter $p$ to indicate a probability density. In image processing, the pixel values are usually assumed to approximately follow a continuous distribution. Hence, the Bayes classifier is calculated using probability densities.

Bayes formula (for any probabilistic classifier)

$ P(class=j \mid {\bf x}) = \frac{P(class=j) \; p({\bf x} \; \mid \; class=j)} {P(class=j) \; p({\bf x} \; \mid \; class=j) + P(class \neq j) \; p({\bf x} \; \mid \; class \neq j)} $

where the 'other' classes than $j$ are grouped altogether ($class \neq j$).

From Bayes general formula follows, after rearrangement

$ p({\bf x} \mid class=j) = \frac{P(class=j \; \mid \; {\bf x}) \; p({\bf x})} {P(class=j)} $

where $p({\bf x})$ is the joint probability density of ${\bf x}$ over all classes (sum over all conditional densities, each multiplied with the relevant prior).

We now calculate the corrected posterior probability (with a prime) from Bayes formula

$ \begin{split} &P'(class=j \; \mid \; {\bf x}) = \\ &\; \; \; \; \frac{P'(class=j) \; \frac{P(class=j \; \mid \; {\bf x}) \; p({\bf x})} {P(class=j)} }{ P'(class=j) \; \frac{P(class=j \; \mid \; {\bf x})\; p({\bf x})} {P(class=j) } + P'(class \neq j) \; \frac{ P(class \neq j \; \mid \; {\bf x}) \; p({\bf x})} {P(class \neq j)}} \end{split} $

where $P'(class=j)$ is the prior in the skewed setting (i.e. corrected) and $P'(class=j \; \mid \; {\bf x})$ the corrected posterior. The smaller fractions in the equation above are actually the conditional densities $p({\bf x} \mid class=j)$ and $p({\bf x} \mid class \neq j)$.

The equation simplifies to the following

$ \begin{split} &P'(class=j \mid {\bf x}) = \\ &\; \; \; \; \frac{\frac{P'(class=j)}{P(class=j)} \; P(class=j \; \mid \; {\bf x})} {\frac{P'(class=j)}{P(class=j)} \; P(class=j \; \mid \; {\bf x}) + \frac{P'(class \neq j)}{P(class \neq j)} \; P(class \neq j \; \mid \; {\bf x})} \end{split} $


This correction formula applies to $2, 3, \ldots, n$ classes.


You can apply this formula to probabilities from discriminant analysis, sigmoid feed-forward neural networks, and probabilistic random forest classifiers. Basically each type of classifier that produces posterior probability estimates can be adapted to any uneven prior distribution after successful training.

A final word on training. Many learning algorithms have difficulties with training well from uneven training sets. This certainly holds for back-propagation applied to multi-layer perceptrons.

  • $\begingroup$ Do the prediction labels also need to be adjusted to account for the corrected probability? How would you adjust the predicted labels, say for a binary classifier (0, 1)? Thank you. $\endgroup$
    – piper180
    Mar 22, 2022 at 12:32

With fewer equations: Ideally, to make a decision, we need to know the probability that the input vector $x$ belongs to class $i$, using Bayes rule,

$p_t(C_i|x) = \frac{p_t(x|C_i)p_t(C_i)}{p_t(X)}$

where the $t$ subscript represents the conditions given in the training set. Now if the training set is representative of operational conditions, then the output of the classifier will be a good estimate of the probability of class membership in operational conditions as well,i.e. $P_t(C_i|x) \approx P_o(C_i|x)$.

But what if this is not the case. Say we have re-balanced the data set so that the classes are each represented by the same number of examples, but this was done in a way that did not affect the likelihoods, $P_t(x|C_i)$. In this case all we need to do is to multiply by the ratio of the operational and training set prior probabilities, to give un-normalised operational class probabilities,

$q_o(C_i|x) = p_t(x|C_i)p_t(C_i)\times\frac{p_o(C_i)}{p_t(C_i)} = p_t(x|C_i)p_o(C_i) \approx p_o(x|C_i)p_o(C_i)$

The $o$ subscript indicates the operational conditions. We can then just re-normalise these probabilities so we have the probabilities of class membership calibrated for operational conditions,

$p_o(C_i|x) = \frac{q_o(C_i|x)}{\sum_{j}q_o(C_j|x)}$

If you have information about misclassification costs, these can also be factored in in a similar manner.

So basically divide by the training set prior probability to "cancel" it from Bayes rule and multiply by the operational prior probability to "insert" it into Bayes rule, but that will mess up the normalisation constant on the denominator, so re-normalise so that all the probabilites sum to one.


The accepted answer from Match Maker EE seems right, but because I've had a hard time following the step from $P(class = j | \mathbf{x})$ to $P'(class=j|\mathbf{x})$, I've decided to write my own derivation. Further used notation is more Bishop like.

Firstly let's state that our new (balanced) dataset was created by random sampling (from the original one) that was purely independent of $\mathbf{x}$, but is not independent of $C_k$ ($C_k$ -> being in class $k$). Note that, in general, we are selecting samples with different probabilities in each class, thus $p(S|C_1)$ might differ from $p(S|C_2)$. Where we have marked the event of selecting (randomly) a sample from the original dataset as $S$.

From the definition of sampling we know that \begin{equation} \tag{1}\label{eq:independence} p(\mathbf{x},S) = p(\mathbf{x})p(S)\,. \end{equation}

See that conditional independence \begin{equation} p(\mathbf{x}|C_k, S) = p(\mathbf{x}|C_k) \end{equation} also holds, because when sampling at the subspace of class $C_k$ we select each sample with the same probability; thus, the information that we are operating on the subspace of selected samples of class $k$ does not give additional information. From the conditional independence we have \begin{equation} p(\mathbf{x},S|C_k) = p(\mathbf{x}|C_k)p(S|C_k) \end{equation} so \begin{equation} \tag{2}\label{eq:transition_to_sampled} p(\mathbf{x}|C_k) = \frac{p(\mathbf{x},S|C_k)}{p(S|C_k)} \end{equation}

We intend to get $p(C_j|\mathbf{x})$ from our $p(C_j|\mathbf{x}, S)$ that we get from the model trained on our newly created (balanced) dataset. With multiple usage of the Bayes rule and equations \ref{eq:independence} and \ref{eq:transition_to_sampled} we get: \begin{equation} p(C_j|\mathbf{x}) = \frac{p(\mathbf{x}|C_j)p(C_j)}{p(\mathbf{x})} = \frac{\frac{p(\mathbf{x},S|C_j)}{p(S|C_j)}p(C_j)}{\sum_k{p(\mathbf{x}|C_k)p(C_k)}} = \frac{\frac{p(\mathbf{x},S|C_j)}{p(S|C_j)}p(C_j)}{\sum_k{\frac{p(\mathbf{x},S|C_k)}{p(S|C_k)}p(C_k)}} = \frac{\frac{\frac{p(C_j|\mathbf{x},S)p(\mathbf{x},S)}{p(C_j)}}{p(S|C_j)}p(C_j)}{\sum_k{\frac{\frac{p(C_k|\mathbf{x},S)p(\mathbf{x},S)}{p(C_k)}}{p(S|C_k)}p(C_k)}} = \frac{\frac{p(C_j|\mathbf{x},S)p(\mathbf{x},S)}{p(S|C_j)}}{\sum_k{\frac{p(C_k|\mathbf{x},S)p(\mathbf{x},S)}{p(S|C_k)}}} = \frac{\frac{p(C_j|\mathbf{x},S)p(\mathbf{x})p(S)}{\frac{p(C_j|S)p(S)}{p(C_j)}}}{\sum_k{\frac{p(C_k|\mathbf{x},S)p(\mathbf{x})p(S)}{\frac{p(C_k|S)p(S)}{p(C_k)}}}} = \frac{p(C_j|\mathbf{x},S)\frac{p(C_j)}{p(C_j|S)}}{\sum_k{p(C_k|\mathbf{x},S)\frac{p(C_k)}{p(C_k|S)}}} \, . \end{equation}

Where the $p(C_k|S)$ is the new prior for the class $k$ after balancing our dataset (0.5 for binary) or in general after defined random subsampling.


I know this is a late reply and you probably do not need this answer, however I believe that I can add valuable information for future Pattern Recognition and Machine Learning by Christopher Bishop readers.

Answers from Match Maker EE and Dikran Marsupial provide good explanation on the logic behind the formula of the rebalancing of the classifiers, so I won't go into details on the logic of the formula.

I will instead provide explanation on what the author was intending to convey since that was your question.

The author was explaining three ways predicting input x into its correct classifier. One of the ways was to get the different conditional posterior class probabilities.

The advantage of solving for the posterior class probability is now we are able to apply balancing on our data set using (from Match Maker EE's answer):


Since P(class = j |x), P(class = j) and P'(class = j) are all known.

P(class = j |x) was solved originally.

P(class = j) is the fraction of the original data set that lies in class j.

P'(class = j) is the balancing that we want to apply on the data set.

In short, the author wanted to convey the advantage of getting the different conditional posterior class probabilities.

Hope this is helpful.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.