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()idf.head(); kolumnaobjectz kilkoma wartościami to zwykle kategoria, aint64z 3–10 wartościami może nią być. - Kategorie w pandas oznaczaj
astype('category'), porządkowe przezpd.CategoricalDtype(categories=[...], ordered=True). - W scikit-learn różne typy obsługuje
ColumnTransformer:OneHotEncoderdla nominalnych,OrdinalEncoderdla porządkowych,StandardScalerdla 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