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:
- 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.