3. domača naloga: napovedovanje prihodov avtobusov LPP

Odprto: ponedeljek, 28. marec 2022, 00.00
Rok za oddajo: nedelja, 17. april 2022, 23.59

Na voljo imate podatke o vožnjah avtobusov LPP v letu 2012 od začetka januarja do konca novembra. Cilj naloge je z linearno regresijo (oziroma polinomsko; skozi ustrezno generiranje značilk) zgraditi čim boljši model, ki bo znal iz časa odhoda z začetne postaje napovedati čas prihoda na končno postajo. Vaš model bomo preizkusili na podatkih o avtobusnih vožnjah v decembru 2012.

Za dodatna navodila, primere, podatke in oddajo napovedi obiščite stran tekmovanja in stran predtekmovanja. Geslo smo vam poslali na elektronski naslov, s katerim ste se prijavili na učilnico. Če ga ne najdete, pišite na marko.toplak@fri.uni-lj.si.

V posameznem dnevu lahko oddate največ štiri napovedi testnih podatkov. Zato vam bo lastna implementacija preverjanja na učnih podatkih koristila.

Napovedovanje ene linije z linearno regresijo (predtekmovanje). S strani predtekmovanja snemite podatke. Ti podatki opisujejo le eno avtobusno linijo. Ustrezno obdelajte značilke, izdelajte napovedi in jih oddajte na lestvico. Skripto, ki ustvari napovedi shranite v predtekmovanje.py. Cilj je z linearno regresijo doseči rezultat pod 160, kar vam zagotavlja dovolj dobro obravnavanje posamezne linije, da lahko nadaljujete s tekmovanjem.

Napovedovanje vseh linij. Ocenjevali vas bomo glede na rezultat s tekmovanja. Štel bo končni rezultat; na sprotni lestvici vidite kvaliteto napovedi na polovici decembrskih dni, končni rezultat, ki ga boste videli šele po koncu tekmovanja, pa bo dobljen na preostali polovici decembra.

Bonusi (le za oddaje do prvotnega roka, do vključno 12. aprila)

  • Prvo mesto: +5 ocen.
  • 2.-3. mesto: +3 ocene.
  • 4.-6. mesto: +2 oceni.
  • 7.-12. mesto: +1 ocena.

Pri bonusih upoštevamo samo pravočasne oddaje, torej zanje ni zamud.

Oddaja: Na strani tekmovanja oddajte končne napovedi, na spletni učilnici pa poročilo in izvorno kodo (kot pri preteklih domačih nalogah). Oddajte vso izvorno kodo, ki jo potrebujem za ponovitev vaše oddaje; za vsako oddajo, ki jo opisujete v poročilu, naj bo oddana ena .py datoteka).

Poročilo naj vsebuje le dva razdelka:

  • Predtekmovanje.
  • Tekmovanje.

Za predtekmovanje opišite zgolj vašo končno rešitev z linearno (polinomsko) regresijo.

Za tekmovanje opišite do dve najbolj zanimivi ali najbolj točni rešitvi. Vsako rešitev poimenujte; dodajte tudi ime python datoteke, kjer ste jo implementirali.

Napotki

Linearna regresija

Ni treba, da linearno regresijo pišete sami. Uporabite lahko linearno regresijo, ki smo jo napisali izvajalci predmeta. Nekaj priročne kode in preprostih primerov smo objavili na strani tekmovanja. Za primere uporabe preglejte primeri na strani tekmovanja. Morda bo še bolje, če kar direktno uporabite linearno regresijo iz knjižnice scikit-learn.

Delo z datumi

V lpputils.py, ki jo dobite na strani tekmovanja, najdete funkcije za branje datumov v priročnejšo strukturo.

Kako pripraviti podatke za linearno regresijo

Značilk v podatkih je zelo malo, poleg tega pa direktno niso primerne za linearno regresijo.

Začnite s predstavitvijo ciljne spremenljivke. Lažje bo, če bodo namesto časa prihoda vaši modeli vračali trajanje vožnje. Če trajanje prištejete začetnemu času, dobite čas prihoda.

Eksperimentirate z različnimi tehnikami tvorbe predobdelave podatkov in tvorbe značilk, kot so generiranje polinomskih značilk, polinomska regresija, značilke 0/1 (ali je danes ponedeljek, ali je praznik). Predtekmovalni rezultat pod 160 lahko dosežete že z ustrezno uporabo časa in datuma. Razmislite o tem, kakšne značilke lahko linearnemu modelu omogočijo, da kaj pametnega napove. Prestavljajte si, da ste linearni model: kateri podatki bi bili za vas uporabni? Velikokrat pomaga, če si podatke narišemo: na x os postavite eno vaših predlaganih značilk, na y os pa trajanje vožnje.

Če uporabljate značilke, kot sta recimo registrska številka avtobusa oziroma identifikacija voznika, vedite, da sosednost vrednosti zanje ne pomeni ničesar. S takimi značilkami si boste lahko pomagali le, če jih boste pretvorili v množice 0/1 značilk, po eno za posamezni avtobus ali voznika.

Napovedovanje vseh linij

Najlaže je za vsako linijo zgraditi svoj model. Priporočam, da vsekakor začnete s tem. S tem pristopom so nekateri študentje preteklih let dosegli zelo dobre rezultate. Seveda lahko zgradite model za vse linije hkrati, a boste morda morali, da bo model učinkovito deloval, značilke smiselno predstaviti. Kako to storite, vam prepuščam v razmislek.

Uporaba drugih podatkov

Morda vam bo pomagala tudi uporaba drugih podatkov. Gotovo šolske počitnice. Poleg tega se mi pa zdi, da se v Ljubljani takoj, ko pade malo dežja, promet odvija po polžje. Lahko bi vam pomagali tudi podatki o posebnih prireditvah... Marsikaj lahko najdete na spletu.

Preverjanje na učnih podatkih

Dovoljene so le 4 oddaje na dan. Zato vam bo koristilo (ni pa obvezno), če vaše modele na učnih podatkih preverjajte z enako metriko, kot jo uporabljamo na strežniku (MAE). Bodite pozorni na to, da je celotna metodologija podobna tisti na tekmovanju. Ker na tekmovanju napovedujete cel neznan mesec, poskrbite, da boste tudi vaše učne podatke razdelili po mesecih.

Matrike v Pythonu

Za delo s numeričnimi podatki skoraj obvezno uporabite knjižnjico numpy, saj bo tako vaša koda delovala veliko hitreje.

Redke matrike

Če so vaše matrike podatkov redke (večina elementov je enakih nič), se vam za hitrejše izvajanje splača uporabiti redke matrike iz knjižnjice scipy.sparse. Seveda šele, ko zahtevne dele opravite zgolj z matričnimi operacijami. Učne podatke predstavite s tabelo tipa csr_matrix. Najhitreje jo ustvarite, če podate samo neničelne elemente. Če želimo matriko velikosti 3x4 napolniti z enicami na vseh kotih (ostalo naj bodo ničle), lahko zapišemo: X = scipy.sparse.csr_matrix(([1,1,1,1], [ [0,0,2,2], [0,3,0,3] ])).

Kadarkoli boste nato delali s podatkovno matriko pazite, da namesto operacij knjižnjice numpy uporabite operacije iz scipy.sparse. Na primer, namesto numpy.hstack uporabite scipy.sparse.hstack. Pri matričnih operacijah pazite, da bo prvi operand vedno redka matrika. Pri množenju matrik lahko vrstni red operandov obrnete, če upoštevate (AB)T = BTAT.