Saltar al contenido

Python – Pandas, remuestrear el conjunto de datos para tener clases equilibradas

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:

  1. Agrupar el names por label y comprobar qué etiqueta tiene un exceso (en términos de nombres únicos).
  2. Elimine aleatoriamente los nombres de la clase de etiqueta sobrerrepresentada para tener en cuenta el exceso.
  3. 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *