Tech MeetING#5 - Jak przy pomocy Machine Learningu spośród płatności kartowych wyłuskać te cykliczne?
28.06.2023 | Teresa Kulawik
Zapraszamy do zapoznania się z kolejnym odcinkiem z cyklu Tech MeetING, podczas których ekspercka wiedza IT spotyka się z bankowością. Podczas spotkania wystąpiła Teresa Malerczyk - Eksperta Data Science - która opowiedziała o tym jak przy pomocy Machine Learningu spośród płatności kartowych wyłuskać te cykliczne.
Sprawdź kalendarz wydarzeń Tech MeetING
Zapisz się na nasze kolejne meetupy!
Wstęp
Detekcję cyklicznych płatności kartowych (subskrypcji) stworzyliśmy w celu pomocy naszym klientom w zarządzaniu wydatkami. Aby móc tego dokonać, musimy zaklasyfikować transakcję kartową do jednej z dwóch kategorii: cykliczna (1) lub niecykliczna (0). Mamy więc do czynienia z zadaniem z dziedziny data science nazywanym klasyfikacją.
Przygotowanie danych
Dane, na których pracujemy, są specyficzne, ponieważ zawierają podstawowe informacje o transakcji, czyli jej datę, nazwę sklepu, kwotę oraz kilka dodatkowych cech. To za mało żeby wytrenować model uczenia maszynowego. Musimy stworzyć zmienne na podstawie których taki trening będzie możliwy. Tymi zmiennymi będą agregaty na podstawie historii transakcji (3, 6, 9 miesięcy). Zwykle subskrypcje opłacane są tą samą kwotą, w odstępie miesiąca, co może oznaczać ten sam dzień miesiąca, ale również 30 dni pomiędzy transakcjami. Przykładami takich agregatów są:
- liczba transakcji dla danego dostawcy
- liczba transakcji o tej samej kwocie
- liczba transakcji wykonanych w tym samym dniu miesiąca,
- liczba transakcji wykonanych w okolicach krotności miesiąca wstecz
- Statystyki (minimum, maksimum, średnia odchylenie standardowe) liczby dni odstępu pomiędzy transakcjami o tych samych kwotach
Model
Po przygotowaniu danych możemy przejść do treningu modelu. Zastosowany został algorytm CatBoost. Jego nazwa pochodzi od Categorical Boosting, ponieważ jego szczególną cechą jest wbudowana obsługa zmiennych kategorycznych.
Zmienne kategoryczne
Są to zmienne, które nie są ani zmiennymi ciągłymi (np. cena), ani binarnymi (przyjmującymi wartość 0 lub 1). Przykładem zmiennej kategorycznej może być na przykład typ transakcji. Żeby móc taką zmienną zasilić trening modelu, musimy ją przekształcić na binarną lub ciągłą. Istnieje wiele metod, które pozwalają dokonać takiej konwersji, np.:
- One Hot Encoding – konwersja na zmienną binarną polega na utworzeniu dla każdej wartości zmiennej kategorycznej osobnej kolumny. Kolumny te przyjmują wartości: 1 – w przypadku wystąpienia cechy opisywanej przez daną kolumnę; 0 – w przeciwnym wypadku.
- Label Encoding – przypisuje każdej wartości zmiennej kategorycznej wartość numeryczną.
- Target Encoding – zamienia wartość zmiennej kategorycznej wartością obrazującą wpływ na zmienną prognozowaną, na przykład średnią, kiedy zmienna kategoryczna ma daną wartość.
Żeby lepiej zrozumieć, jak działają powyższe metody, weźmy prosty przykład, w którym mamy:
- zmienną kategoryczną „Kod transakcji”, mającą dwie wartości „A” i „B” oraz
- zmienną prognozowaną „Subskrypcja”, mającą wartość 1, gdy transakcja jest subskrypcją oraz 0, gdy nie jest.
Każda z wyżej wymienionych metod ma swoje zalety i wady. One Hot Encoding jest trafnym odwzorowaniem zmiennej kategorycznej, jednak dla zmiennych kategorycznych przyjmujących wiele różnych wartości (na przykład, gdy taką zmienną są kody pocztowe) tabela po transformacji staje się bardzo duża, ponieważ dla każdej wartości konieczne jest utworzenie nowej kolumny. W przypadku Target oraz Label Encodingu problem ten nie występuje, ale sposób ich reprezentacji może budzić wątpliwości. W przypadku Label Encodingu przypisujemy porządek tam, gdzie on nie występuje. Natomiast Target Encoding może prowadzić do sytuacji, w której zbyt wiele informacji o zmiennej prognozowanej przedostaje się do zbioru uczącego.
CatBoost – kodowanie kategorii
Twórcy algorytmu CatBoost zaproponowali interesujące podejście do kodowania zmiennych kategorycznych – Ordered Target Encoding, podobne do klasycznego Target Encodingu, ale różnica polega na tym, że dane traktowane są sekwencyjnie – wartość Encodingu dla każdej wartości jest wyliczana na podstawie wcześniejszych wystąpień danej wartości zmiennej kategorycznej. Poszczególne wartości wyliczane są z następującego wzoru:
Odnosząc się do wcześniejszego przykładu, wartości ze wzoru interpretujemy w następujący sposób:
- countInClass to liczba wcześniejszych wystąpień konkretnej wartości zmiennej kategorycznej (na przykład „A”) w parze z „1” w polu „Subskrypcja”
- totalCount to to liczba wcześniejszych wystąpień konkretnej wartości zmiennej kategorycznej
- prior jest z góry zdefiniowaną wartością, w naszym przypadku będzie równa 0.05
Na przykładzie wcześniej opisanych danych kodowanie zmiennych kategorycznych będzie wyglądało następująco:
CatBoost – trening modelu
CatBoost jest algorytmem drzew decyzyjnych. Drzewo decyzyjne jest zbiorem warunków logicznych z tą różnicą, że warunki te są konstruowane w trakcie treningu modelu, a nie dobierane przez człowieka. Procedura składa się z powtarzania następujących kroków:
- Obliczenie Encodingów zmiennych kategorycznych.
- Zbudowanie pojedynczego drzewa, tj.:
- Wybór progów do testowania
- Obliczenia reszt – Wartości zmiennej prognozowanej minus predykcje (na początku wartość wszystkich predykcji jest równa 0)
- Budowa drzew dla wybranych progów – umieszczając kolejne reszty w liściach drzewa, za każdym razem aktualizując obecny wynik w danym liściu
- Obliczenie miary podobieństwa pomiędzy wynikami danego drzewa, a wartościami zmiennej prognozowanej. Tą miarą jest podobieństwo cosinusowe: gdzie Ai, Bi to kolejno reszty oraz wyniki.
- Wybranie drzewa z najwyższą wartością miary podobieństwa.
3. Obliczenie predykcji – wyniki pomnożone przez współczynnik uczenia.
4. Permutacja (przetasowanie) danych.
Budowe drzew na przykładzie można zobaczyć w poniższym nagraniu.