Wpis z mikrobloga

Jakieś dwa lata temu chwaliłem się stworzeniem strony archiwizującej opóźnienia pociągów PKP i generującej proste prognozy opóźnienia na kolejny dzień.

Dziś chwalę się drugi raz, bo zaktualizowałem serwis do wersji 2.0 (na razie w wersji beta). Wersja ta zawiera dużo nowych funkcjonalności, całkowicie nowy UI oraz stworzony od podstaw model machine learning prognozujący opóźnienia pociągów na podstawie szeregu czynników, w tym opóźnień z poprzednich dni, różnych cech pociągu oraz danych pogodowych. Co więcej, model podaje również listę najważniejszych czynników na podstawie których wygenerował daną prognozę (starałem się, aby model był "interpretowalny").

W skrócie, na stronie "Czy pociąg się spóźni?" sprawdzicie:
- historyczne opóźnienia zdecydowanej większości (jeśli nie wszystkich) pociągów krajowych (do 30 dni wstecz)
- aktualne opóźnienia - poglądowo (opóźnione ok. 10-50 min w stosunku do Infopasażera)
- prognozowane opóźnienia - na kolejny kurs pociągu

Serdecznie zapraszam do wypróbowania na https://www.czypociagsiespozni.pl i podzielenie się feedbackiem!

#pkp #pociagi #pociag #chwalesie #sztucznainteligencja #machinelearning #programowanie
  • 59
@FaterAnona: Miałem do wyboru w sumie dwie opcje: zbilansowanie zbioru albo przekazanie informacji o niezbliansowaniu do algorytmu uczącego. Wybrałem tą drugą opcję. Zbilansowanie zbioru mogłem zrobić albo przez oversampling albo undersampling. Undersampling wiązał by się z dużą stratą informacji. Oversampling z kolei, obawiałem się, że może prowadzić do overfittingu oraz będzie wymagał większych zasobów obliczeniowych (a miałem już i tak stosunkowo duży zbiór danych).
@FaterAnona: Jeśli chodzi o same metryki to korzystałem z gotowej implementacji w scikit-learn (np. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html). Natomiast to wykorzystywałem głównie do porównywania modeli. Jeśli chodzi o sam proces uczenia, to w RandomForestClassifier można dostarczyć m.in. parametr class_weight, który bezpośrednio przekazuje taką informację. W XGBoost jest to trochę trudniejsze bo taki parametr nie jest zaimplementowany, ale informację o wagach klas można przekazać bezpośrednio do każdej z instancji wchodzącej do zbioru treningowego (tutaj przykładowe
@optymistycznypesymista: ok, będę szukał dalej. Bo rozumiem, że chodzi o wyszukiwarkę na stronie głównej i freez się robi jak klikniesz np. kartę „według stacji przyjazdu”? Jeśli tak to czy freez jest na samym kliknięciu, czy dopiero jak zaczynasz coś pisać? Jeśli się nie przełączasz pomiędzy tymi opcjami i zostaje defaultowe „według trasy” to czy wszystko działa ok i można wyszukać pociąg?
@grad: Tak, dokładnie. Na stronie głównej jak są te 3 opcje to wersja gdzie podajesz przystanek początkowy i końcowy jest ok.
W przypadku pozostałych dwóch wygląda to mniej więcej tak:
klikam na opcję,
opcja się podświetla,
może nawet zdążę odrobinę przescrollować stronę w dół,
freeze.
Po dłuższym czasie coś tam się odfreezuje i nieraz znowu złapie freeze, a nieraz nie. Bez wpisywania / wybierania tam opcji.
Obstawiam, że coś się może
@Solitary_Man: @optymistycznypesymista: Dzięki wielkie za info! Mam w takim razie materiał do pracy i postaram się rozwiązać ten problem. Pewnie to wina selecta, ale raczej co dokładnie ciężko powiedzieć. Dane do selecta są dodawane do wszystkich selectów już na starcie strony, więc zmiana zakładki nie powinna tutaj dużo zmienić. Sprawdzę i naprawię!
@grad: Co w przypadku kiedy PLK wprowadzi korektę i np pociąg 5130 jeździ na trasie Bydgoszcz - Toruń - Kutno - Warszawa a po zmianie będzie jeździł trasę Gdynia - Tczew - Iława - Warszawa? Numer zostanie ten sam trasa zmieniona i zebrane dane będą nic nie warte :(
@DudziN123: W takiej sytuacji będzie trzeba poczekać kilka dni, aż pociąg „zbierze” potrzebne dane do prognozy. A w kolejnej wersji modelu nawet tyle nie będzie trzeba, bo opóźnienie będzie prognozowane też na podstawie opóźnień na danych odcinkach sieci kolejowej
@grad uuu panie, bo juz byla afera jak ktos zrobil lepsza aplikacje niz Portal Pasazera PLKi i podobno naruszyl prawa autorskie. ztcp nazywala sie Moj Pociag
@danniell: znam akurat tą historię, ale to trochę inny temat. Tamta aplikacja "konkurowała" z wyszukiwarką rozkładu jazdy, a moja propozycja to uzupełnienie systemu Infopasażer, ale w żaden sposób nie konkurencja. Tam gdzie wiem, że dane z Infopasażera mogą być bardziej właściwe, to informuję o tym użytkownika i podaję możliwie dokładny link do odpowiedniej stronie na Infopasażerze.
@cohontes: Finalnie zapisany biblioteką joblib. Cały pipeline mam utworzony w AWS Sagemaker i rozważałem utrzymanie punktu końcowego po stronie AWS, ale zdecydowały koszty i moje wymagania co do szybkości predykcji. Waga modelu to około 2-3 MB o ile dobrze pamiętam, a czas predykcji wraz z przygotowaniem niezbędnych danych wejściowych nie przekracza w 95% przypadków 200 ms.