Zyski:
- Możliwość tworzenia znaczących cech pochodnych w oparciu o wiedzę dziedzinową i kodowania kategorii kategorycznych za pomocą odpowiednich metod (one-hot, label, target)
- Możliwość skalowania zmiennych numerycznych w zależności od typu modelu (standaryzacja, normalizacja) i unikania niepotrzebnego lub niepełnego skalowania
- Możliwość uniknięcia wycieków funkcji poprzez uczenie się wszystkich transformacji po podziale treningu/testu i tylko na podstawie treningu
W uczeniu maszynowym istnieje stare powiedzenie: „Stosowane uczenie maszynowe to zasadniczo inżynieria funkcji”. Ponieważ sukces modelu często zależy od tego, jakie dane wejściowe wprowadzisz do modelu, a nie od wybranego algorytmu. Inżynieria cech to sztuka wytwarzania znaczących sygnałów z surowych danych, z których model może się uczyć. Sztuczna inteligencja jest na tym etapie bogatym źródłem pomysłów: gdy pytasz, „jakie funkcje można wyprodukować z tych danych”, podaje dziesiątki sugestii. Jednak niektóre z tych sugestii mogą być cenne, niektóre mogą być bezużyteczne, a jeszcze inne mogą być niebezpieczne (wyciek). Twoim zadaniem jest to uporządkować.
Dlaczego inżynieria funkcji
Surowe dane rzadko kiedy trafiają do modelu w najlepszej formie. O ile sama kolumna „data urodzenia” nie ma żadnego znaczenia, o tyle wygenerowana z niej wartość „wiek” jest mocnym sygnałem. Możesz wyodrębnić atrybuty takie jak „dzień tygodnia”, „dzień/noc”, „czy jest święto” ze „znacznika czasu zamówienia”. Można połączyć dwie kolumny, aby uzyskać współczynnik („stosunek zadłużenia do dochodów”). W tym przypadku inżynieria cech przekłada wiedzę dziedzinową na sygnał matematyczny; I właśnie dlatego jest to etap wymagający największej ludzkiej inteligencji.
Zamiana zmiennych kategorycznych na liczby: kodowanie
Modele zazwyczaj działają z liczbami, a nie z tekstem. Konwersja zmiennych kategorycznych (takich jak miasto, kolor, typ produktu) na liczby nazywa się kodowaniem. Trzy popularne metody:
Kodowanie one-hot: otwiera osobną kolumnę o wartości 0/1 dla każdej kategorii. Dla „miasta” powstają kolumny Stambułu, Ankary, Izmiru; Jeśli klient pochodzi ze Stambułu, tylko ta kolumna będzie wynosić 1. Idealne rozwiązanie, gdy liczba kategorii jest mała; Jeśli kategorii jest zbyt wiele, powstają setki kolumn (nazywa się to „eksplozją rozmiaru”).
Kodowanie etykiet: nadaje numer każdej kategorii (Stambuł=0, Ankara=1). To proste, ale może przypadkowo nauczyć model sekwencji (np. Ankara > Stambuł); dlatego używa się go ostrożnie w kategoriach nieuporządkowanych.
Kodowanie docelowe: Zastępuje każdą kategorię średnią zmiennej docelowej w tej kategorii. Jest to bardzo potężne, ale najniebezpieczniejsze źródło wycieku: jeśli weźmie się pod uwagę cel danych testowych, model widzi przyszłość. Należy go obliczać wyłącznie na podstawie danych uczących i ostrożnie (w ramach walidacji krzyżowej).
Skalowanie: duże liczby nie przytłaczają modelu
Niektóre modele (odległościowe, liniowe, sieci neuronowe) są wrażliwe na skalę zmiennych. Jeśli „dochód” (0–500 000) i „wiek” (0–100) mieszczą się w tym samym schemacie, dochód może dominować po prostu dlatego, że jest większy. Skalowanie rozwiązuje ten problem. Dwie popularne metody: standaryzacja (przelicza każdą wartość na „ile odchyleń standardowych od średniej”) i normalizacja (normalizacja min-max — kompresuje wartości do zakresu 0-1). Modele oparte na drzewach (drzewa decyzyjne, las losowy) są niewrażliwe na skalę, nie wymagają skalowania.
Uwaga: Parametry skalowania i kodowania (średnia, odchylenie standardowe, mapowanie kategorii i średnich) należy obliczać wyłącznie na podstawie danych uczących, a następnie to samo należy zastosować do danych testowych. Uwzględnienie danych testowych oznacza wyciek i sprawia, że model wygląda lepiej niż w rzeczywistości.
Serce wycieków w inżynierii cech
Generowanie funkcji to miejsce, z którego najczęściej dochodzi do wycieku danych. Dwa typowe błędy: Przeciek czasu — tworzenie funkcji zawierającej przyszłe informacje (w tym dni po dniu prognozy przy obliczaniu „średniej z ostatnich 30 dni”). Wyciek statystyk — obliczenie cechy (średniej skalowania, docelowej wartości kodowania) ze wszystkich danych przed podziałem treningowym/testowym. Reguła: ucz się każdej transformacji po wykonaniu najpierw podziału pociągu/testu i tylko na podstawie danych treningowych. Najbezpieczniejszym sposobem na regularne robienie tego jest użycie potoku — struktury, która zbiera wszystkie transformacje w jednym łańcuchu i stosuje je po podziale.
Metoda
po co
Ryzyko wycieku
uwaga
Kodowanie na gorąco
Zmienna z kilkoma kategoriami
niski
Eksploduje rozmiar w wielu kategoriach
Kodowanie etykiet
Posortowana kategoria
niski
Brak porządku uczy niewłaściwej kolejności
kodowanie docelowe
Wiele kategorii, silny sygnał
bardzo wysoki
Tylko z wykształcenia, w CV
standaryzacja
Modele liniowe/odległościowe
średni
Parametr zależy tylko od wykształcenia
Funkcja okna czasowego
szeregi czasowe
wysoki
Dodaj przyszłość
trzy mini etui
Przypadek 1 – Cenna własność. Zespół kredytowy wygenerował funkcję „stosunku zadłużenia do dochodu” na podstawie surowych kolumn „miesięczny dochód” i „miesięczna spłata zadłużenia”. Ta pojedyncza funkcja pochodna zwiększyła dokładność modelu z 71% do 79%; ponieważ to stopa, a nie dochód bezwzględny, tak naprawdę determinowała ryzyko. Lekcja: wskaźniki generowane przez wiedzę dziedzinową są mocnymi sygnałami.
Przypadek 2 — Wyciek kodowania celu. Jeden zespół przekształcił „kod pocztowy” w liczbę z docelowym kodowaniem (średni współczynnik rezygnacji w tym obszarze), ale zrobił to na podstawie wszystkich danych przed podziałem. Model dał 94% na zestawie testowym, spadając do 68% w produkcji. 6 tygodni wysiłku poszło na marne. Lekcja: kodowanie celów odbywa się ostrożnie, tylko w ramach szkolenia.
Przypadek 3 — Zapominanie o skalowaniu. Jeden z analityków włączył przychody (0–400 000) i wiek klienta (18–75) do modelu opartego na odległości bez skalowania. Model uwzględnił niemal wyłącznie dochody, niwelując efekt wieku. Po dodaniu skalowania segmentacja stała się znacząca. Lekcja: skalowanie nie jest zaniedbywane w modelach odległościowych/liniowych.
Cztery szablony do kopiowania
1) Generowanie pomysłów na funkcje (eliminacja zależy od Ciebie):
Twoja rola: asystent inżyniera funkcji. Moje kolumny df: data_urodzenia, czas_zamówienia (znacznik czasu), dochód_tl, dług_tl, miasto, kategoria_produktu. Cel: „czy pożyczka zostanie spłacona” (0/1). Zaproponuj 15 cech, które można wygenerować na podstawie tych kolumn; określić ryzyko wycieku (niskie/średnie/wysokie) dla każdego z nich. Wyraźnie zaznacz te, które zawierają przyszłe informacje.
2) Bezpieczne kodowanie (post-split):
Napisz kod, który za jednym razem koduje „miasto” i „kategoria_produktu”. WAŻNE: dopasuj kodowanie tylko do danych treningowych, a następnie przekształć dane testowe (za pomocą sklearn OneHotEncoder). Wyjaśnij, jak radzisz sobie z kategorią niewidoczną (handle_unknown) w edukacji.
3) Bezszczelna konwersja za pomocą Pipeline:
Skonfiguruj sklearn Pipeline: zastosuj StandardScaler do kolumn numerycznych, OneHotEncoder do kolumn kategorialnych, dodaj klasyfikator na końcu. Gwarancja, że wszystkie transformacje zostaną wyuczone PO podziale pociągu/testu i tylko podczas szkolenia. Wyjaśnij kod i dlaczego jest on szczelny.
4) Funkcja okna czasowego (kontrola wycieków):
Wygeneruj atrybut „liczba zamówień w ciągu ostatnich 30 dni” dla każdego klienta, ale NIGDY nie dołączaj danych po dniu prognozy. Wyjaśnij wiersz po wierszu, że kod nie patrzy w przyszłość. Podam kolumnę z datą referencyjną.
Słaba zachęta/silna zachęta
Słaba zachęta:
Dodaj dobre właściwości do tych danych.
„Dobrze” jest nieokreślone, cel jest niejasny, nie ma kontroli wycieków. Sztuczna inteligencja generuje losowe, być może nieszczelne, funkcje.
Potężny monit:
Twoja rola: inżynier funkcji. Cel: „rezygnacja w ciągu 30 dni” (0/1), szacowana data odniesienia: save_date. W df znajduje się historia transakcji. Zadanie: Wygeneruj 8 cech, odpowiedz na pytanie „Czy mam te informacje w momencie przewidywania” dla KAŻDEGO. Dodanie daty po dacie referencyjnej w funkcjach okna czasowego. Napisz kod w sposób zgodny z potokiem, który ma zostać wykonany po sekcji pociągu/testu.
Tutaj od początku definiowany jest cel, czas odniesienia i kontrola wycieków.
Typowe błędy
- Uczenie się transformacji ze wszystkich danych przed podziałem. Jeśli parametr skalowania/kodowania widzi dane testowe, następuje wyciek.
- Nieostrożne użycie kodowania docelowego. Jest to najpotężniejsza, ale najbardziej nieszczelna metoda; tylko ze szkolenia, podczas walidacji krzyżowej.
- Dodawanie przyszłości za pomocą funkcji okna czasowego. Jeśli obliczenia „ostatnie 30 dni” zostaną wprowadzone po dniu prognozy, model widzi przyszłość.
- Niepotrzebne skalowanie w modelu drzewiastym i niepełne skalowanie w modelu liniowym. Decyzje dotyczące skalowania podejmowane są w zależności od typu modelu.
- Dodawanie każdej sugestii funkcji AI bez żadnych pytań. Sugestie mogą obejmować bezużyteczne i nieszczelne funkcje.
Wskazówka: zapisz jedno pytanie dla każdej wygenerowanej przez siebie cechy: „Czy mogę obliczyć tę wartość na podstawie informacji, które posiadam w momencie dokonywania prognozy?” Jeśli odpowiedź nie jest jednoznaczna „tak”, nie korzystaj z tej funkcji. Ta pojedyncza dyscyplina eliminuje większość wycieków związanych z funkcjami.
Podsumowując
Inżynieria cech to sztuka generowania znaczących sygnałów z surowych danych i często w większym stopniu decyduje o powodzeniu modelu niż algorytmu. Kodowanie kategorii (one-hot, label, target), skalowanie liczb (standaryzacja, normalizacja) i tworzenie cech pochodnych w oparciu o wiedzę dziedzinową to podstawowe narzędzia. Ale ta faza jest także sednem wycieku: wszystkich transformacji należy się nauczyć po podziale treningu/testu i wyłącznie na podstawie danych treningowych. AI generuje mnóstwo pomysłów; To ludzki osąd odróżnia to, co cenne od tego, co niebezpieczne.
Zadanie aplikacji
Wybierz zmienną docelową i zaprojektuj co najmniej pięć cech pochodnych z posiadanych kolumn. Dla każdego z nich należy odpowiedzieć pisemnie na pytanie „czy jestem dostępny w momencie prognozy” i wyeliminować przynajmniej jedno jako „wysokie ryzyko wycieku”. Następnie zakoduj bezpieczne funkcje w potoku, które mają zostać zaimplementowane po partycji.
lista kontrolna
- [ ] Czy zastosowałem wszystkie transformacje po podziale pociągu/testu?
- [ ] Czy parametry skalowania/kodowania nauczyłem się tylko na szkoleniu?
- [ ] Czy odpowiedziałem na pytanie „czy mam to w momencie przewidywania” dla każdej funkcji?
- [ ] Czy zachowałem szczególną ostrożność w przypadku metod wysokiego ryzyka, takich jak kodowanie docelowe?
- [ ] Czy zdecydowałem się skalować odpowiednio do typu modelu (drzewo/liniowy)?