Balansowanie danych

Balansowanie danych polega na dostosowaniu liczby próbek dla poszczególnych klas w zbiorze danych do celu modelowania. Często zdarza się, że w zbiorze danych jedna klasa jest znacznie liczniejsza niż inne, co może prowadzić do nierównowagi danych. W takim przypadku, modele uczone na takich danych mogą nie działać tak dobrze, ponieważ ich wydajność jest mierzona w oparciu o najliczniejszą klasę.

Aby rozwiązać ten problem, możemy zbalansować dane, dodając lub usuwając próbki z poszczególnych klas tak, aby ich liczba była bardziej zrównoważona. W bibliotece Pandas istnieje kilka sposobów zbalansowania danych:

  1. Użycie metody resample(): ta metoda pozwala na próbkowanie danych z klas o różnej liczebności, tak aby ich liczba była bardziej zrównoważona. Przykład:
import pandas as pd

# utworzenie przykładowego zbioru danych z nierównowagą klas
df = pd.DataFrame({'label': ['A', 'A', 'B'] * 10 + ['C'] * 1000})

# zbalansowanie danych za pomocą resample
df_balanced = df.groupby('label').apply(lambda x: x.sample(500, replace=True)).reset_index(drop=True)

print(df_balanced['label'].value_counts())

A    500
C    500
B    500
Name: label, dtype: int64

Użycie metody pd.concat(): ta metoda pozwala na połączenie kilku DataFrame’ów, dzięki czemu możemy łatwo dodać więcej próbek do mniej licznych klas. Przykład:

import pandas as pd

# utworzenie przykładowego zbioru danych z nierównowagą klas
df = pd.DataFrame({'label': ['A'] * 1000 + ['B'] * 50})

# zbalansowanie danych za pomocą pd.concat
df_a = df[df['label'] == 'A'].sample(500)
df_b = df[df['label'] == 'B']
df_balanced = pd.concat([df_a, df_b], ignore_index=True)

print(df_balanced['label'].value_counts())

A    500
B     50
Name: label, dtype: int64

3. Użycie metody `pd.concat()` z `pd.DataFrame.sample()`: ta metoda pozwala na losowe wybieranie próbek z więcej licznych klas, aby zbalansować dane. Przykład:


import pandas as pd

# utworzenie przykładowego zbioru danych z nierównowagą klas
df = pd.DataFrame({'label': ['A'] * 1000 + ['B'] * 50}

# zbalansowanie danych za pomocą pd.concat i pd.DataFrame.sample
df_a = df[df['label'] == 'A'].sample(50)
df_b = df[df['label'] == 'B']
df_balanced = pd.concat([df_a, df_b], ignore_index=True)

print(df_balanced['label'].value_counts())

Balansowanie danych jest ważnym krokiem w procesie przygotowywania danych do modelowania i może znacząco wpłynąć na wydajność modelu. Należy jednak pamiętać, że zbyt duże zmniejszenie liczby próbek może prowadzić do utraty ważnych informacji i pogorszenia wydajności modelu.