ML Atlas

02 · Dane · 4 min czytania · aktualizacja

Jakie są typy danych w uczeniu maszynowym i dlaczego to ważne?

W skrócie

Typ danych mówi, jakie operacje na zmiennej mają sens: liczbowe, porządkowe, nominalne, tekst, obrazy i czas wymagają innego przygotowania dla modelu.

Co to jest

Typ danych to rodzaj informacji, jaką niesie zmienna, i — co ważniejsze — zbiór operacji, które mają na niej sens. Klasyczny podział (Stevens, 1946) wyróżnia skale: nominalną (kategorie bez porządku), porządkową (kategorie z kolejnością), interwałową (równe odstępy, umowne zero) i ilorazową (prawdziwe zero, sens mają proporcje).

W praktyce uczenia maszynowego dzielimy dane prościej. Liczbowe — ciągłe (wiek, cena) albo dyskretne, czyli liczniki (liczba dzieci). Kategoryczne — nominalne (port zaokrętowania), porządkowe (klasa biletu) i binarne (tak/nie). Do tego dane nieustrukturyzowane: tekst, obrazy, dźwięk, a osobno dane czasowe, w których kolejność obserwacji sama jest informacją.

Intuicja: kod pocztowy 00-950 i 31-000 to liczby, ale średnia kodów pocztowych nie ma żadnego sensu. To, że coś zapisano cyframi, nie znaczy jeszcze, że jest wielkością.

Mechanizm — dlaczego tak działa

Model widzi wyłącznie liczby i traktuje je jak liczby: zakłada, że 3 jest większe od 2, a odstęp między 1 a 2 jest taki sam jak między 2 a 3. Regresja liniowa mnoży cechę przez wagę, więc „podwojenie” wartości podwaja wkład. Sieć neuronowa i k najbliższych sąsiadów liczą odległości. Jeśli zakodujemy porty jako S = 0, C = 1, Q = 2, model uzna, że Cherbourg leży „pomiędzy” Southampton a Queenstown — porządek, którego w danych nie ma.

Dlatego typ decyduje o przygotowaniu. Zmienne nominalne zamienia się na kolumny 0/1 (kodowanie one-hot) albo na statystyki docelowe. Porządkowe można zostawić jako liczby całkowite, jeśli przyjmujemy, że stopnie są w przybliżeniu równo odległe — to jest założenie, nie fakt. Liczbowe ciągłe zwykle się skaluje, a mocno skośne (ceny, dochody) logarytmuje, bo ich różnice mają charakter względny: skok z 10 do 20 zł znaczy więcej niż z 500 do 510 zł.

Osobne kłopoty sprawiają zmienne „udające” typ. Identyfikatory (numer biletu, ID klienta) są liczbami, ale nie niosą wielkości; model potrafi się na nich nauczyć przypadkowych wzorów. Zmienne cykliczne — godzina, dzień tygodnia, miesiąc — mają koniec przy początku: 23:00 i 0:00 dzieli godzina, a nie 23. Rozwiązaniem jest para cech sin(2π·h/24) i cos(2π·h/24), które umieszczają godziny na okręgu.

Dane nieustrukturyzowane też trzeba sprowadzić do liczb. Tekst zamienia się na wektory zliczeń słów, TF-IDF albo zanurzenia (embeddings). Obraz już jest tablicą liczb — jasności pikseli — ale jego struktura przestrzenna ma znaczenie, którego płaska tabela nie widzi. Szereg czasowy wymaga cech opóźnionych i podziału na zbiór treningowy i testowy zgodnego z upływem czasu.

Ostatnia warstwa to typ techniczny: int64, float64, object, category w pandas. Nie pokrywa się on z typem merytorycznym. Klasa biletu zapisana jako int64 jest dla biblioteki liczbą, choć merytorycznie to kategoria porządkowa.

Na przykładzie

Zbiór Titanic (wersja z biblioteki seaborn) ma 891 pasażerów i 15 kolumn — prawie każdy typ w jednym miejscu. age jest liczbowa ciągła (88 różnych wartości), fare też (248 wartości, mocno skośna). sibsp i parch to liczniki z 7 wartościami. pclass (1, 2, 3) to kategoria porządkowa zapisana jako liczba całkowita, embarked (S, C, Q) — nominalna, sex i survived — binarne. deck (pokłady A–G) wygląda na porządek alfabetyczny, ale ma 688 braków, czyli 77% wierszy.

Ten sam zbiór pokazuje pułapkę nadmiarowości. class to pclass zapisana słowami, embark_town powtarza embarked, a alive (yes/no) jest dokładnie zmienną celu survived. Kto bezrefleksyjnie zakoduje wszystkie kolumny tekstowe, wpuści odpowiedź do cech i dostanie model o 100% trafności, który niczego nie umie. Zbiór zawiera też 107 wierszy będących dokładnymi duplikatami innych — po usunięciu imion i numerów biletów pasażerowie przestali być rozróżnialni.

Dane: Titanic

W praktyce

  • Zacznij od df.dtypes, df.nunique() i df.head(); kolumna object z kilkoma wartościami to zwykle kategoria, a int64 z 3–10 wartościami może nią być.
  • Kategorie w pandas oznaczaj astype('category'), porządkowe przez pd.CategoricalDtype(categories=[...], ordered=True).
  • W scikit-learn różne typy obsługuje ColumnTransformer: OneHotEncoder dla nominalnych, OrdinalEncoder dla porządkowych, StandardScaler dla liczbowych.
  • Daty rozbijaj na składowe (dt.dayofweek, dt.month), a cykliczne koduj parą sin/cos.
  • Usuń identyfikatory i kolumny będące przekształceniem celu — to najtańszy sposób uniknięcia wycieku danych.
  • Typowy błąd: kodowanie kategorii nominalnych liczbami 0, 1, 2 w modelu liniowym lub kNN.

Najczęstsze pytania

Czy klasę biletu traktować jako liczbę czy kategorię?
To zależy od modelu i danych. Jako liczba daje jedną wagę i zakłada równe odstępy między klasami; jako trzy kolumny one-hot pozwala każdej klasie mieć własny efekt kosztem dodatkowych parametrów. Drzewom decyzyjnym kodowanie porządkowe zwykle wystarcza, bo i tak dzielą oś progami.
Czym różni się skala interwałowa od ilorazowej?
W skali ilorazowej zero oznacza brak wielkości, więc sens mają proporcje: 40 kg to dwa razy więcej niż 20 kg. Temperatura w stopniach Celsjusza jest interwałowa — 20°C nie jest „dwa razy cieplej” niż 10°C, bo zero jest umowne.
Czy sieci neuronowe nie radzą sobie same z każdym typem danych?
Radzą sobie z liczbami. Każdy inny typ ktoś musi zamienić na liczby — przez kodowanie, warstwę zanurzeń albo tokenizację — i od tego wyboru zależy, jakie zależności model w ogóle może zobaczyć.

Źródła

  • Stevens S. S. (1946). „On the Theory of Scales of Measurement”. Science, 103(2684), 677–680.
  • Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., 2022, rozdz. 2 (przygotowanie danych, atrybuty tekstowe i kategoryczne).
  • James G., Witten D., Hastie T., Tibshirani R. „An Introduction to Statistical Learning”, 2nd ed., 2021, rozdz. 2 i 3.3.1 (predyktory jakościowe).
  • Dokumentacja scikit-learn: Preprocessing data, https://scikit-learn.org/stable/modules/preprocessing.html
  • Dokumentacja pandas: Categorical data, https://pandas.pydata.org/docs/user_guide/categorical.html

Zobacz też