1.2 Podział zbioru danych na uczący i testowy
W problemie klasyfikacji, naszym zadaniem jest stworzenie algorytmu (programu), który na podstawie znanych sobie, opisanych wzorców, będzie w stanie efektywnie rozpoznawać wzorce nieopisane i dotąd sobie nieznane.
Potrzebujemy więc znaleźć sposób, aby zapewnić sobie to nieznane i nieopisane niezbędne przeprowadzenia procesu klasyfikacji. Na tę chwilę dysponujemy jedynie spójnym, jednolitym zbiorem danych. Poznajmy więc najpopularniejsze sposoby na jego podział na część wykorzystywaną w uczeniu klasyfikatora (zbiór uczący) i późniejszej klasyfikacji na już wyuczonym klasyfikatorze (zbiór testowy). Wszystkie przydatne nam metody podziału są zaimplementowane w module model_selection
pakietu sklearn
. Zaimportujmy więc w naszym skrypcie ten moduł.
Podział prosty
Najprostszym możliwym podejściem jest prosty, losowy podział zbioru na dwie części z zachowaniem jakiejś proporcji pomiędzy nimi. Służy do tego metoda train_test_split
.
Wywołanie jej rozpoczynamy od przekazania parametrów tablic, które chcemy podzielić (X
i y
). Atrybutem test_size
możemy przekazać proporcję pomiędzy podziałami. Dodatkowo, aby zapewnić powtarzalność podziału przy kolejnym uruchomieniu skryptu, warto przekazywać ziarno losowości, w atrybucie random_state
.
Podział zwraca nam krotkę zawierającą już docelowe podzbiory. Odłóżmy je do odpowiednich zmiennych i wyświetlmy na ekranie ich wielkości.
Jak widać w parze X_train
, y_train
znalazły się 2/3, a w X_test
, y_test
— 1/3 wczytanego zbioru danych.
Walidacja krzyżowa k-fold
Podział prosty pozwala nam na co prawda na uzyskanie zbioru uczącego i testowego, ale nie możemy mieć przy nim pewności, że losowość nie dokonała się w nim w szczęśliwy dla klasyfikatora sposób, który wykaże jego wyższą jakość. Dla bezpieczeństwa i większej rzeczowości naszych badań musimy dokonać wielokrotnego podziału. Teoretycznie moglibyśmy wielokrotnie dokonać tego rodzaju podziału, aby zdobyć wiele par testowych i uczących, ale w takim podejściu istnieje duże prawdopodobieństwo występowania tych samych próbek w różnych zbiorach uczących. Metodą, która niweluje tego rodzaju problem jest k-fold cross-validation.
W podejściu krzyżowym dzielimy losowo zbiór danych na k
możliwie równych sobie podzbiorów. Uzyskujemy dzięki temu k
par, w których każdy z podzbiorów raz występuje jako zbiór uczący, a pozostała, połączona część zbioru jest wykorzystywana jako zbiór testowy.
Deklarujemy parametr
k
będący liczbą docelowych podziałów. Zwyczajowo stosuje sięk
równie 10 lub 30, w zależności od większości zbioru. Inicjalizujemy nim obiekt podziałucv
. Następnie w pętli iterujemy ten obiekt i wyświetlamy wielkość podzielonych zbiorów oraz zawartość zmiennejtrain
.
Zauważ, że w zmiennych test
i train
nie zawierają się skompletowane podzbiory a jedynie indeksy wzorców, które powinny się w nich znaleźć.
Last updated