• Post author:

Więc jak się buduje te całe modele? Powiedzmy, że mamy 3 minuty na wyjaśnienie.

Urodziło mi się dziecko. Jakiego będzie wzrostu, jak dorośnie? Mierzę 1000 losowych osób i liczę średnią. Będzie ona prototypem mojego modelu, wersją beta. Powiedzmy, że wynosi 170 cm, w takim razie wzrost każdego człowieka będę przewidywał jako 170:

przewidywany_wzrost = 170

Średnio rzecz biorąc, to chyba nie jest głupie? A na pewno lepsze, niż przewidywanie, że jakieś nieznanie mi dziecko będzie miało 100 albo 250 cm. Wydaje się jednak, że da się to zrobić lepiej — bo to przecież moje dziecko, więc wiem o nim więcej. Ale do tego potrzebny jest pewien feedback: muszę umieć ocenić, na ile mój dotychczasowy model jest dobry.

Jak to zrobić? Stosując w praktyce! Siadam i liczę, w jakim stopniu model myli się na danych, które zebrałem. Pierwsze osoba miała 180 cm, a ja głupio szacowałem, że 170 — czyli 10 cm pomyłki. Powtarzam to dla każdej osoby i uśredniam różnice, otrzymując średni błąd oszacowania, powiedzmy 7,5 cm.

Druga iteracja

Ale chwila, przecież urodziła mi się córka. Chyba rozsądniej uśredniać tylko wzrosty kobiet? Powiedzmy, że taka średnia wynosi 163 cm. Ponieważ chciałbym, by mój model był ogólny, zapamiętuję też średni wzrost mężczyzn (176 cm). Model można zapisać w formie „ifelse” lub krócej:

przewidywany_wzrost = 163 + 13*czy_M

gdzie „czy_M” jest równe 1 dla mężczyzny, 0 dla kobiety.

I znów czas na feedback: tym razem mylę się średnio o 5 cm. Świetnie, nowa wersja modelu jest lepsza.

Trzecia iteracja

Czy da się lepiej? Załóżmy, że jestem wysoki — wtedy mogę się spodziewać, że moja córka będzie wyższa od przeciętnej kobiety. W takim razie warto dodać bonusowe punkty do wzrostu z każdym centymetrem więcej u ojca. Tu sprawa jest jednak trudniejsza. Po pierwsze, ile tych punktów dać? Po drugie, dorzucenie kolejnej informacji wpływa na pozostałe współczynniki modelu. W takim razie napiszmy tak:

przewidywany_wzrost = a + b*czy_M + c*wzrost_ojca

Jak wybrać parametry a, b, c? Stosując podobny feedback, jak wcześniej! Wylosujmy jakiekolwiek wartości dla tych parametrów, np. a = 1, b = 2, c = 3. Możemy teraz użyć tego modelu na zebranych danych, licząc przewidywane wzrosty. Będą idiotyczne, ale nie zrażamy się: liczymy średni błąd i zmieniamy parametry na inne (uczymy się!). W końcu trafimy na takie, że choćby nie wiem co, nie da się znaleźć lepszych, np.:

przewidywany_wzrost = 88 + 13*czy_M + 0,4*wzrost_ojca

Powiedzmy, że teraz średnia pomyłka to 4,5 cm, a w takim razie zbudowaliśmy jeszcze lepszy model. A jeśli chcemy uwzględnić wzrost matki? Nic trudnego:

przewidywany_wzrost = a + b*czy_M + c*wzrost_ojca + d*wzrost_matki

I wiemy, co robić dalej.

Przedstawione podejście to model regresji liniowej (prawie), a na uzyskane równanie możemy w pewnym sensie spojrzeć jak na średnią ważoną. Więcej: jest to też najprostsza sieć neuronowa.

Komentarz

Oczywiście zastosowałem tu wiele uproszczeń. Lepiej, żeby ten feedback pochodził od innego zbioru (testowego). Choć akurat feedback tyczący się wyboru parametrów a, b, c powinien pochodzić ze zbioru treningowego, a na testowym jedynie ostateczna ocena modelu — i to znacznie skomplikowałoby tę historię.

Oczywiście istnieją wzory analityczne na regresję, nie trzeba wybierać tych parametrów po omacku. Choć dla tych, co wiedzą więcej: przedstawione podejście to nie jest regresja liniowa (dlatego napisałem, że to „prawie” regresja), bo minimalizuję MAE, a nie MSE. W takim razie to regresja kwantylowa.

A wybrałem MAE, bo oczywiście łatwiej zrozumieć średni błąd, a nie średni kwadrat błędu.

To próbowanie różnych parametrów, żeby dostać minimalny błąd, oczywiście bardzo ciężko byłoby zastosować w praktyce. Ale wystarczy umieć trochę programować i napisać zagnieżdżone pętle.

Dodam, że wszystkie podane parametry wraz z błędami są „prawdziwe”, oszacowane na podstawie danych zebranych przez Galtona.


Jeśli moje teksty są dla Ciebie wartościowe, na podany niżej adres email mogę przesłać Ci wiadomość, gdy pojawią się nowe. Zapraszam też na mój kanał na youtube.