Solución:
Un enfoque muy sencillo. Tomado de la documentación de sklearn y Kaggle.
from sklearn.utils import resample
df_majority = df[df.label==0]
df_minority = df[df.label==1]
# Upsample minority class
df_minority_upsampled = resample(df_minority,
replace=True, # sample with replacement
n_samples=20, # to match majority class
random_state=42) # reproducible results
# Combine majority class with upsampled minority class
df_upsampled = pd.concat([df_majority, df_minority_upsampled])
# Display new class counts
df_upsampled.label.value_counts()
Siempre que cada name
está etiquetado exactamente por uno label
(por ejemplo, todos A
están 1
) puede utilizar lo siguiente:
- Agrupar el
name
s porlabel
y comprobar qué etiqueta tiene un exceso (en términos de nombres únicos). - Elimine aleatoriamente los nombres de la clase de etiqueta sobrerrepresentada para tener en cuenta el exceso.
- Seleccione la parte del marco de datos que no contiene los nombres eliminados.
Aquí está el código:
labels = df.groupby('label').name.unique()
# Sort the over-represented class to the head.
labels = labels[labels.apply(len).sort_values(ascending=False).index]
excess = len(labels.iloc[0]) - len(labels.iloc[1])
remove = np.random.choice(labels.iloc[0], excess, replace=False)
df2 = df[~df.name.isin(remove)]
Usando imblearn (pip install imblearn
), esto es tan simple como:
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(sampling_strategy='not minority', random_state=1)
df_balanced, balanced_labels = rus.fit_resample(df, df['label'])
Hay muchos métodos distintos a RandomUnderSampler
, por lo que le sugiero que lea la documentación.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)