Как указано в документации для numpy.bincount, каждый бин дает число вхождений значения его индекса в x (https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.bincount.html).. Поэтому, поскольку в выражении, используемом sklearn, bincounts находится в знаменателе, классы с высоким частоты получают низкие веса, а классы с низкими частотами получают большие веса. Давайте посмотрим на это в действии:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame({'classes': [0, 0, 1, 1, 2, 0, 1, 1, 0, 2, 3]})
n_samples = df.shape[0]
classes = df['classes'].unique()
bins = np.bincount(df['classes'])
n_classes = bins.shape[0]
weights = n_samples/(n_classes*bins)
sns.barplot(classes, weights)
plt.xlabel('class label')
plt.ylabel('weight')
plt.show()