Projektas skirtas namų kainų prognozavimui, remiantis įvairiomis savybėmis.
Prejektas sudarytas iš kelių dalių:
I. Įvadas II. Duomenų surinkimas III. Duomenų paruošimas ir apdorojimas IV. Modelio kūrimas, mokymas ir vertinimas V. Prognozių generavimas VI. Vizualinis pateikimas VII. Išvados
Projektas buvo orientuotas į Lietuvos rinką, tad projektui buvo pasirinkta analizuoti nekilnojomojo turto, o kenkrečiau namų kainas Lietuvoje. Buvo orientuojamasi į didžiausius miestus, tad objektu buvo pasirinkti: Vilnius, Kaunas, Klaipėda, Šiauliai, Panevėžys ir Alytus. Peržvelgus nekilnojamo turto sklebimų portalus, šie miestai turėjo daugiausiai duomenų. Duomenų rinkimui buvo pasirinktas didžiausias ir populiariausias skelbimų portaslas aruodas.lt.
- Python
- BeautifulSoup: Biblioteka skirta analizuoti HTML ir XML dokumentus.
- Selenium: Nešiojama karkaso testavimui interneto programoms.
- WebDriver Manager: Įrankis, skirtas valdyti interneto draiverius.
- Pandas: Biblioteka duomenų analizei.
'accept_cookies()' - funkcija skirta paspausti slapukų sutikimo mygtukui. Funkcija iškviečiama pagrindinėje funkcijoje, kad būtų galima uždaryti slapukų sutikimo langą norint atlikti kitas operacijas puslapyje.
'scrape_page_data(link)' - funkcija skirta išgauti duomenims apie vieną nekilnojamojo turto objektą. Iškviečiama pagrindinėje funkcijoje ir iteruojamą per kiekvieną atverčiamą puslapį. Funkcija naudoja parametrą 'link' - puslpaio, iš kurio bus išgaunami duomenis, URL. Funkcija gražiną 'page_data', žodyną, kuriame saugomi duomenys apie vieno NT objekto atributus
'scrape_and_save(start_page, end_page)' - funkcija, skirta nuorodų, apie kiekvieną NT objoktą išgavimui, duomenų išsaugojimui CSV formatu, iteruojant per visus puslapius iš atitinkamų skelbimų filtro kategorijos. Funkcija iškviečiama kaip pagrindinė funkcija, kad būtų pradėtas duomenų išgavimo procesas. Naudojami parametrai: 'start_page' - pradinis puslapio numeris, nuo kurio 'end_page' - paskutinis puslapio numeris, ties kuriuo baigiamas duomenų išgavimas.
Duomenų išgavimą pradedame paprasta komanda, kuria iškviečiama pagrindinė funkcija, pradedama duomenų gavyba ir galiausiai duomenys išsaugomi.
Šis procesas atliekamas atskirai kiekvienam miestui (įtraukus ir rajoną). Kiekvienam miestui yra paruoštas atitinkamas kodas, su konkrečia pradine nuorodą, galutinio failo pavadinimu ir galutinio puslapio skaičiumi
Rezultate buvo gauti tokio pavyzdžio CSV failai:
Prieš atliekant tolimesnius žingsniu, gautus duomenis svarbu tinkamai paruošti. Šis procesas apima duomenų nuskaitymą iš CSV failų, duomenų valymą, transformavimą ir kodavimą bei galutinių duomenų išsaugojimą duomenų bazėje.
- Python
- SQLite3: Integruota duomenų bazė skirta duomenų saugojimui.
- Pandas: Biblioteka duomenų analizei.
- Regular Expressions (re): Python modulis teksto šablonų atpažinimui.
- Scikit-learn: Biblioteka, skirta mašininio mokymosi modelių kūrimui ir duomenų normalizavimui.
- Joblib: Biblioteka, skirta efektyviai išsaugoti ir įkelti Python objektus.
'cleen_cell_to_number' - funkcija, skirta pašalinti nereikalingus ženklus iš duomenų langelių, kadangi iš puslapio gauti duomenis turi mums nereikalingų simbolių. Taip pat ',' skaičiuose keičiami į '.'.
'remove_extreme_values' - funkcija, skirta pašalinti ribinėms reikšmės (minimalioms ir maksimalioms), kurios gali turėti įtakos modelio tiklsumui
'calculate_room_count' - funkcija, skirta užpildyti tuštiems laukeliams, stulpelyje 'Kambarių sk.'. Šis stulpelis turėjo daug tuščių reikšmių, tad jo užpildymas vidutiniu kambarių skaičiaus dydžiu galėtų turėti neigiamos įtakos modelio tikslumui. Buvo pasirinktas kitas būdas: remiantis turimais duomenimis iš pradžių apskaičiuotas vidutinis vieno kambario plotas. Tad tusčios vietos užpildytos suapvalinta verte, gauta padalinus namo plotą iš vidutinio kambario ploto
-
Duomenų nuskaitymas: nuskaitomi duomenys iš CSV failų, sukurtų duomenų gavybos metu ir sukūriami DF objektai, kurie galiausiai yra sujungiamį į vieną.
-
Duomenų valymas ir transformavimas: pašalinami nereikalingi simboliai ir ribinės kainų reikšmės. Taip pat pašalinami dublikatai ir stulpeliai, kurie nebus naudojami tolimesnėje analizėje. Skaitinės reikšmės konvertuojamos į skaičius. Užpildomos trūkstamos vertės.
-
Statybos metų stulpelis turėjo eilutes, kuriose buvo nurodyta daugiau nei viena data ir papildomas tekstas. Pasirinkome pirmą datą, tekstą pašalinome
- Iš adreso stulpelio išgavome tik miestą (arbą rajoną) ir suvienodinome pavadinimus
- Kai kurie kategoriniai atribūtai (Šildymo tipas, Vanduo) turėjo daug unikalių kategorijų, arba pasikartojimų, tad buvo nuspręsta palikti tik pirmu pasirinkimu įrašytą opciją
- Patikriname ar duomenų rinkinyje neliko tuščių reikšmių.
- Duomenų kodavimas ir normalizavimas: Kategoriniai kintamieji yra koduojami naudojant One-Hot Encoder'į, o skaitiniai kintamieji yra normalizuojami naudojant Min-Max Scaler'į. Mūsų duomenų rinkinyje dauguma duomenų buvo kategoriniai. Skaitiniai duomenys buvo tik: Kaina, Plotas, Sklypo Plotas, Kambarių sk. ir Statybos Metai. Kaina nebuvo standartizuota, kadangi tai yra mūsų modelio spėjimo tikslas.
- Duomenų išsaugojimas: Koduoti ir normalizuoti duomenys yra išsaugomi duomenų bazėje, taip pat papildomai išsaugomi ir naudoti normalizavimo parametrai.
Rezultate buvo gautas išvalytas duomenų rinkinys, kurį sudarė:
- 12 savybių stulpelių
- Kaina
- Plotas
- Sklypo plotas
- Kambarių sk.
- Pastato tipas
- Namo tipas
- Šildymas
- Vanduo
- Įrengimas
- Pastato energijos suvartojimo kl.
- Statybos metai
- Miestas
- 4614 eilučių unikalių turto objektų
Iš viso šiame darbe buvo kuriami trys modeliai: Random Forest Regression, Linear Regresion ir dirbtinių neuroninių tinklų Sequential modeliai.
- Python
- Scikit-learn: Biblioteka, skirta mašininio mokymosi modelių kūrimui ir duomenų normalizavimui.
- SQLite3: Integruota duomenų bazė skirta duomenų saugojimui.
- Pandas: Biblioteka duomenų analizei.
- Matplotlib ir Seaborn: Grafikų braižymo bibliotekos.
- Duomenų nuskaitymas: Nuskaitomi duomenys iš duomenų bazės ir sudaromas DataFrame.
- Duomenų dalijimas: Duomenys dalijami į mokymo ir testavimo rinkinius.
-
Hiperparametrų nustatymas: Nustatomi Random Forest Regresoriaus hiperparametrai naudojant Grid Search metodą.
-
Modelio mokymas: Modelis yra mokomas su mokymo rinkiniu, naudojant geriausius nustatytus hiperparametrus.
- Modelio vertinimas: Modelio veikimas yra įvertinamas naudojant kryžminį patikrinimą ir testavimo rinkinį.
Papildomai, bus atvaizduojama savybių svarba aspkaičiuojant prognozuojamą kainą. Kadangi duomenys yra koduoti, turime juos sugrupuoti į motinines kategorijas. Tam tisklui padaromas žodynas grupavimui.
Tada suskaičiuojama rodiklių svarba
Ir pateikiami rezultatai.
Pateiktas grafikas nurodo santyki tarp modelio prognozuotų ir realių kainų. Kiekvienas taškelis reprezentuoja vieną turto vienetą. Raudona įstriža linija demonstruoja idealią teorinę prognozę (mūsų siekiamybę). Taškų atstumas iki linijos norodo paklaidos dydį mūsų spėjimuose.
Iš grafiko galima spręsti, kad modelis veikia geriau, prognazuojant pigesnio turto kainas. Kai kurie taškai, reprezentuojantys labai išsiskiriančius savo kaina, turto vienetus yra labai nutolę nuo idealios linijos. Tai reiškia, kad modelis nesugeba deramai įvertini iškirtinio (pagal tam tikras savo savybes) turto kainos.
Apibendrinant, galima pasakyti, kad modelis "pagauna" bendrą tendenciją, bet jam yra sunku įvertinti kažkuo išskirtinius, ypatingai ženkliai nuo kitų brangesnius turto vienetus.
- Python
- Pandas: Biblioteka duomenų analizei.
- Scikit-learn: Biblioteka, skirta mašininio mokymosi modelių kūrimui ir duomenų normalizavimui.
- SQLite3: Integruota duomenų bazė skirta duomenų saugojimui.
- Matplotlib: Biblioteka grafikų braižymui.
-
Duomenų nuskaitymas: Nuskaitomi duomenys iš duomenų bazės ir sudaromas DataFrame.
-
Duomenų dalijimas: Duomenys dalijami į mokymo ir testavimo rinkinius.
-
Modelio sukurimas: Sukuriamas tiesinės regresijos modelis ir yra yra mokomas naudojant mokymo rinkinį
- Modelio vertinimas: Modelio veikimas yra įvertinamas naudojant testavimo rinkinį.
- Rezultatų vizualizavimas: Modelio spėjimų ir realių kainų koreliacija yra vizualizuojama grafike.
Įveritnus gautą grafiką, ir modelio veikimo rodiklių rezultatus, galima daryti išvadas, kad modelis duoda panašų, bet kiek prastesnį rezultatą, nei Random Forest Regresssion modelis. Bendra tendencija yra pagaunama, modeliui sekasi neblogai prognozuoti žemėsnės kainos ir standartinį turtą, bet sunkiau yra su brangesniu turtu. Matome, kad tokios prognozės yra netikslios.
Šis modelis yra sukurtas naudojant giliojo mokymosi techniką ir apmokomas naudojant tuos pačius mokymo ir testavimo duomenų rinkinius.
- Python
- TensorFlow: Giliojo mokymosi įrankių biblioteka.
- Scikit-learn: Biblioteka modelių vertinimui.
- SQLite3: Integruota duomenų bazė skirta duomenims saugoti.
- Pandas: Biblioteka duomenų analizei.
- Matplotlib ir Seaborn: Bibliotekos vizualizacijai.
- Duomenų nuskaitymas: Duomenys yra nuskaitomi iš duomenų bazės ir sudaromas DataFrame.
- Duomenų dalijimas: Duomenys yra padalinami į mokymo ir testavimo rinkinius. Pirmieji du žingsniai analogiški prieš tai aprašytuose modeliuose
- Modelio kūrimas: Sukuriamas tiesinio regresijos modelis naudojant gilųjį mokymąsi.
- Modelio mokymas: Modelis yra mokomas su mokymo rinkiniu.
-
Modelio vertinimas: Modelio veikimas yra įvertinamas naudojant testavimo rinkinį.
-
Rezultatų vizualizavimas: Modelio spėjimų ir realių kainų koreliacija yra vizualizuojama.
- Taip pat vizualizuojame mokymosi proceso nuostolių kreivė. Šis grafikas parodo, kad mokymo procesas vyksta sklandžiai, ir gaunamas tolygus rezultatas.
Apibendrinant šio modelio veikimą, matome, kad rezultatas yra labai panašus į gautą naudojant Random Forest regresijos modelį. Tiek grafikai, tiek rodikliai yra labai panašūs. Tiesa šis modelis parodė minimaliai geresnį rezultatą, ko pasekoje galime gauti šiek tiek tikslesnį spėjimą. Šis modelis (kaip ir kiti, anksčiau apžvelgti), geriau prognozuoja pigesnės ir vidutinės klasės namų kainas, sunkiai sekasi su brangesnio turto vertinimu.
Tačiau įvertinant nekilnojamojo turto rinkos specifiką, galima teigti, jog prabangių NT vienetų kainai didžiausią įtaką turi veiksniai, kurie nėra skaitiškai įvardinti tarp požymių, randamų mūsų duomenų rinkinyje. Tai gali būti ypatinga vieta mieste ar kokios nors kitos unikalios savybės, realybėje nulemiančios ženkliai aukštesnę kainą. Tokie dalykai, savo ruožtu, nėra vertinami mūsų modelių. Šios objektyvios priežastys nulemia galutinį pateiktų skaičiavimų rezultatų tiklsumą.
Prognozės bus generuojamos išsagojus geriausius tikslumo rodiklius pasiekusio modelio konfigūraciją (Sequential). R2 rodiklis = 0.60, Vidutinė absoliuti paklaida = 60532.59. Tai reiškia, kad modelio suprognozuota kaina gali turėti apie 60 tūkstančių eur. paklaidą.
Duomenys skaičiavimams pateiks vartotojai per interaktyvią sąsają. Tam, kad galėtų būti atlikti tisklūs skaičiavimai, pateiktus duomenys reikės apdoroti taip pat, kaip ir mūsų mokymui naudotą duomenų rinkinį. Tam tisklui ir buvo išsaugota MinMax Scaler konfigūracija.
Interaktyviai sąsajai sukurti naudosime Python web aplikacijų kurimo karkasą Flask. Taip vartotojai galės suvesti duomenys, matyti gautus rezultatus, ir susipažinti su tam tikrais statistiniais rodikliais.
Kaip ir aprašyta aukščiau, rezultatų ir skaičiavimų pateikimui bus naudojamas Flask. Šio įrankio pagalba sukurta paprasta WEB aplikacija, sukuriančia paprastą sąsają informacijai vartotojui pateikti.
- Python
- Flask: Python web aplikacijų karkasas.
- TensorFlow: Giliojo mokymosi įrankių biblioteka.
- Scikit-learn: Biblioteka modelių vertinimui.
- SQLite3: Integruota duomenų bazė skirta duomenims saugoti.
- Pandas: Biblioteka duomenų analizei.
- NumPy:
- Matplotlib ir Seaborn: Bibliotekos vizualizacijai.
- Duomenų užkrovimas: Užkraunami išsaugoti modelis ir normalizacijos skalė.
- Vartotojo sąsaja: Sukuriama vartotojo sąsaja, kurioje vartotojas gali įvesti namo charakteristikas.
- Duomenų apdorojimas: Įvesti duomenys koduojami ir normalizuojami, kad būtų galima juos naudoti modelyje.
- Prognozavimas: Prognozuojama namo kaina pagal įvestus duomenis. Ir prognozes išvedame naujame lange, kartu nurodant ir to paties miesto vidutinę namų kainą, bei vidutinę kainą už kvadratinį metrą, kad vartotjas galėtų palyginti, kaip jo įvestos reikšmes daro įtaką galutinei prognozuotai kainai, lyginant su vidurkiu. Kartu atvaizduojami pasirinkti parametrai
-
Statistika: Vartotojas gali peržiūrėti statistinius duomenis apie nekilnojamąjį turtą iš naudojamo duomenų rinkinio. Statistiniai duomenys išvedami naujame lape, pateikia grafikus apie vidutinę kvadratinio metro kainą, vidutinį namų dydį, vidutinį sklypo dydį, objektų kiekį kiekviename mieste.
Siekiant neapsunkinti kodo, statistiniai rodiklai yra skaičiuojami atskirame faile: Statisne_analize.py
Pagrindiniai failai, užtikrinantys Flask aplikacijos veikimą:
- index.html: Pagrindinis puslapis, kuriame vartotojas įveda duomenis.
- result.html: Puslapis, kuriame pateikiama prognozuojama kaina.
- statistics.html: Puslapis, kuriame vartotojas gali peržiūrėti statistinius duomenis.
- error.html: Puslapis, kuriame rodomas klaidos pranešimas, jei įvyksta klaida vykdant prognozę.
Atliktas darbas padėjo geriau suprasti, kaip reikia dirbti su duomenimis, kaip juos atrinkti ir kai sutvarkyti, kad būtų gaunami siekiami rezultatai. Didžiausią iššūkį sudarė duomenų paruošimo žingsniai, nes lemiamą vaidmenį modelio veikimui ir prognozių tikslumui turėjo būtent tinkamas duomenų standartizavimas ir normalizavimas. Pritaikius vienodus normalizavimo metodus tiek kuriant modelį tiek generuojant prognozes (sutvarkant vartotojo pateiktus rodiklius) buvo užtikrintas tinkamo rezultato gavimas.
Projektas leido išmokti dirbti su įvairiomis bibliotekomis, jas geriaus suprasti. Kitu svarbiu aspektu buvo grafinis rezultatų atvaizdavimas. Manau tokio pobūdžio darbui puikiai tiko užduotis, skirta interaktyvui sukurti. Tai leidžia vartotojui vizualiai pamatyti visą sudėtingą procesą labai paprastoje formoje.
Modelį ir visą projektą galima būtų tobulinti, siekiant geresnio tikslumo, bet tam reikėtų tikslinti įvesties duomenis ir atlikti išsamesnę, skirtingos kainų kategorijos turto analizę. Radus ryšius ir savybes, lemiančius prabangių turto objektų kainą galima būtų juos įtraukti į mokymo procesą.