JAV būsto kainų prognozė

Jav Busto Kainu Prognoze



Namo statyba yra vienas iš iššūkių mūsų gyvenime. Prieš pradedant statybas, galima apskaičiuoti savo namo kainą pagal ankstesnio namo kainą. Veiksniai, turintys didžiausią įtaką būsto kainai, yra bendras kambarių skaičius (lova, vonia ir kt.) ir žemės plotas. Pagal tai galime įvertinti reikalingą biudžetą namo statybai.

Šiame vadove pamatysime, kaip numatyti JAV namų kainą naudojant mašininį mokymąsi per Python. Pirmiausia aptariame naudojamą duomenų rinkinį, o tada iš anksto apdorojame duomenis. Po to vizualizuojame duomenų rinkinyje esančius atributus ir mokymo duomenų rinkiniui taikome skirtingus mašininio mokymosi algoritmus (Sietlas, Vašingtonas 2022 m. rugpjūčio mėn. – 2022 m. gruodžio mėn.). Galiausiai šį vadovą užbaigiame numatydami kai kurių namų, esančių bandymo duomenų rinkinyje, kainas. Prieš pradėdami įgyvendinti šį projektą, turime suprasti mašininio mokymosi terminus, kurie naudojami šiame projekte.







Regresija

Jei naudojate mašininį mokymąsi su skaitmeniniais duomenimis, turite suprasti regresiją. Regresija yra mašininio mokymosi prižiūrimas mokymosi metodas, kuris naudojamas suprasti ryšį tarp nepriklausomų atributų ir priklausomų atributų (klasės etiketė / tikslas). Aparatas numato namo kainą, sužinodamas kiekvieną duomenų rinkinyje esantį įrašą. Vadinasi, tai yra prižiūrimas mokymasis.



Pavyzdžiui, mūsų scenarijuje nepriklausomi atributai yra lovų skaičius, vonių skaičius, sklypo dydis, pašto kodas ir tt Pagal juos galime numatyti savo būsto kainą. Taigi, tai yra nepriklausomi atributai, kurie nuo nieko nepriklauso. Kaina yra tikslinis atributas arba klasės etiketė, kuri priklauso nuo šių atributų.



1. Tiesinė regresija

Linijinės regresijos algoritmas rodo tiesinį ryšį tarp priklausomo požymio (Y) ir nepriklausomo požymio (X) kintamųjų. Matematiškai galime jį įvertinti taip:





IR = aX+b

Čia „a“ ir „b“ yra tiesiniai koeficientai.

„Python“ sistemoje „LinearRegression()“ yra „sklearn.linear_model“ modulyje. Kaip tai patikslinti, pamatysime įgyvendinant projektą. Toliau pateikiamas modelis su parametrais:



2. Sprendimų medis

Iš esmės sprendimų medis yra grafinis vaizdas, leidžiantis gauti visus galimus problemos sprendimus pagal sąlygas, pateiktas naudojant mazgus. Sprendimo mazgas naudojamas sprendimui priimti, o lapų mazgas nurodo konkretaus sprendimo išvestį. Savo namo kainą galime nuspėti naudodami sprendimų medžio regresorių.

„Python“ sistemoje DecisionTreeRegressor galima rasti „sklearn.tree“ modulyje. Kaip tai patikslinti, pamatysime įgyvendinant projektą. Toliau pateikiamas modelis su parametrais:

3. Atsitiktinis miškas

„Random Forest“ atlieka tas pačias funkcijas, kurios yra panašios į sprendimų medį. Tačiau reikia miško (sprendimų medžių rinkinio) ir sujungti (vidutinė vertė) visus sprendimų medžių rezultatus. Pavyzdžiui, atsitiktinio miško dydis yra 3. Taigi viduje sukuriami trys sprendimų medžiai ir pirmojo sprendimų medžio būsto kainos rezultatas yra 20 000. Antrojo sprendimų medžio būsto kainos rezultatas yra 20 000. Namo kainos rezultatas paskutinis sprendimų medis yra 10 000. 16 666 666 yra galutinis rezultatas ((20000+20000+10000)/3).

„Python“ programoje „RandomForestRegressor“ yra „sklearn.ensemble“ modulyje. Toliau pateikiamas modelis su parametrais. Medžių skaičių galime nurodyti parametre „n_estimators“. Pagal numatytuosius nustatymus jis yra 100.

Įgyvendinimas

Greitai peržiūrėkite veiksmus, susijusius su JAV būsto kainos prognozavimu. Atsižvelgiame į houses_train (CSV failo) duomenų rinkinį su 2016 m. įrašais (naudojamas mašininio mokymosi modeliui mokyti). Tada prognozuojame namo kainos (505) įrašus, esančius house_test faile.

1. Traukinio ir bandymo duomenų rinkinių įkėlimas

Pandas yra prieinamas Python modulis, naudojamas duomenų analizei. Šį modulį naudojame duomenų rinkiniams įkelti į Python aplinką. Čia mes naudojame Google Co kaip Kodo aplinka. Tai galima nemokamai. Reikia tik Google paskyros.

Pirmiausia turime įkelti failus iš vietinio kompiuterio į Colab Env. Atsisiųskite duomenų rinkinius iš čia .

# Įkelkite houses_train.csv ir house_test.csv failus į savo „Google Colab“.

# vienas po kito.

google. ET AL importuoti failus

failus. įkelti ( )

Read_csv() yra funkcija, kuri naudojama CSV duomenims įkelti į kintamąjį. Jis paima failo pavadinimą kaip parametrą.

importuoti pandos

# Įkelkite houses_train.csv į train_data kintamąjį

traukinio_duomenys = pandos. skaityti_csv ( „houses_train.csv“ )

# Įkelkite house_test.csv į test_data kintamąjį

testo_duomenys = pandos. skaityti_csv ( „house_test.csv“ )

# Išsaugokite test_data į test_data1 kintamąjį

test_data1 = testo_duomenys

Pažiūrėkime stulpelius ir nenulinių įrašų skaičių kiekviename stulpelyje. Šiai informacijai gauti naudojamas Pandas.DataFrame.info().

spausdinti ( traukinio_duomenys. informacija ( ) )

spausdinti ( test_data1. informacija ( ) )

Išvestis:

2. Išankstinis duomenų apdorojimas

Abiejuose duomenų rinkiniuose stulpelyje „lot_size“ yra reikšmės su sqft ir acre (dispersiją rasite matydami eilutes stulpelyje „lot_size_unit’s“). Bet formatas turėtų būti kvadratinių pėdų. Taigi, turime konvertuoti stulpelio „lot_size“ reikšmes iš akrų į kv. Panašiai tai reikia padaryti su „test_data1“.

DataFrame.loc[] čia naudojamas norint rasti „lot_size_units“ su „acre“ ir „lot_size“ reikšmę padauginti iš 43560.

# Konvertuokite lot_size acre reikšmes į kvadratines pėdas, esančias train_data

traukinio_duomenys. vieta [ ( traukinio_duomenys [ 'lot_size_units' ] == 'akras' ) , 'lot_size' ] = traukinio_duomenys [ 'lot_size' ] * 43560

# Konvertuokite lot_size acre reikšmes į kvadratines pėdas test_data1

test_data1. vieta [ ( test_data1 [ 'lot_size_units' ] == 'akras' ) , 'lot_size' ] = test_data1 [ 'lot_size' ] * 43560

spausdinti ( traukinio_duomenys. galva ( ) )

spausdinti ( test_data1. galva ( ) )

Išvestis:

Dabar pamatysite, kad visos „lot_size“ stulpelio reikšmės yra kvadratinių pėdų vertės.

Šiame stulpelyje matote trūkstamas vertes. Pakeiskime NaN reikšmes, esančias stulpeliuose, to paties stulpelio vidurkiu abiejuose duomenų rinkiniuose.

DataFrame['stulpelio_pavadinimas'].fillna() naudojamas trūkstamoms reikšmėms užpildyti vidurkiu naudojant mean() funkciją. DataFrame['stulpelio_pavadinimas'].mean() perduodamas kaip parametras funkcijai finna(). Dabar parodykime vidurkį ir pamatykime skaičių:

# Užpildykite trūkstamas reikšmes stulpelyje lot_size su Esamų reikšmių vidurkiu

traukinio_duomenys [ 'lot_size' ] = traukinio_duomenys [ 'lot_size' ] . jausti ( traukinio_duomenys [ 'lot_size' ] . reiškia ( ) )

# Ekrano vidurkis

spausdinti ( „Traukinio duomenų vidutinė vertė:“ , traukinio_duomenys [ 'lot_size' ] . reiškia ( ) )

spausdinti ( tik ( traukinio_duomenys [ 'lot_size' ] ) )

# Užpildykite trūkstamas reikšmes stulpelyje lot_size su Esamų reikšmių vidurkiu

test_data1 [ 'lot_size' ] = test_data1 [ 'lot_size' ] . jausti ( test_data1 [ 'lot_size' ] . reiškia ( ) )

# Ekrano vidurkis

spausdinti ( „Tikrinimo duomenų vidutinė vertė:“ , test_data1 [ 'lot_size' ] . reiškia ( ) )

spausdinti ( tik ( test_data1 [ 'lot_size' ] ) )

Išvestis:

Trūkstamos reikšmės, esančios stulpelyje „lot_size“ Traukinio duomenų rinkinys, pakeičiamos vidutine reikšme 18789,95194, o trūkstamos vertės, esančios stulpelyje „Lot_size“ Bandymo duomenų rinkinys, pakeičiamos vidutine 8961,0 reikšme.

3. Duomenų valymas

Treniruojant modelį, yra keletas nereikalingų atributų, kurių nereikia norint nuspėti rezultatą. Mūsų atveju yra trys atributai, kurie yra „lot_size_units“, „zip_code“ ir „size_units“, kuriuos reikia pašalinti iš abiejų duomenų rinkinių. Pandas.DataFrame.drop() naudojamas šiems trims stulpeliams pašalinti iš abiejų duomenų rinkinių.

traukinio_duomenys = traukinio_duomenys. lašas ( [ 'lot_size_units' , 'pašto kodas' , 'dydžio_vienetai' ] , ašį = 1 )

test_data1 = test_data1. lašas ( [ 'lot_size_units' , 'pašto kodas' , 'dydžio_vienetai' ] , ašį = 1 )

spausdinti ( traukinio_duomenys. informacija ( ) )

spausdinti ( test_data1. informacija ( ) )

Išvestis:

Dabar duomenų rinkiniai yra geros būklės. Nereikalingi stulpeliai pašalinami, o trūkstamos reikšmės neegzistuoja.

4. Duomenų vizualizacija

Sukurkime traukinio duomenų stulpelių histogramą. Funkcija pandas.DataFrame.hist() naudojama visų atributų histogramoms generuoti.

traukinio_duomenys. hist ( figos dydis = ( 4 , 9 ) )

Išvestis:

Traukinių duomenų histograma generuojama lovų, vonių, dydžio, lot_size ir kainų stulpeliams.

Sukurkime visų laukų koreliaciją vienas kito atžvilgiu. Modulis Plotly.express naudojamas koreliuojamoms reikšmėms nubraižyti.

importuoti siužetinis. išreikšti

korr = traukinio_duomenys. korr ( )

# Nubraižykite koreliuojamus duomenis

view_fig = siužetinis. išreikšti . imshow ( korr , tekstas_automatinis = Tiesa )

# Ekranas

view_fig. Rodyti ( )

Išvestis:

  1. Lovos koreliuoja 0,2935 su kaina, -0,059 koreliuoja su lot_size, 0,77 koreliuoja su dydžiu ir 0,65 koreliuoja su voniomis.
  2. Vonios koreliuoja 0,3173 su kaina, -0,054 koreliuoja su lot_size, 0,667 koreliuoja su voniomis ir 0,771 koreliuoja su lovomis.
  3. Dydis koreliuoja su kaina, -0,044 su lot_size, 0,667 su dydžiu ir 0,652 su lovomis.

5. Modelio paruošimas

Turime nustatyti kainą kaip tikslinę, pašalindami ją iš train_data. Įsitikinkite, kad šiame etape traukinio ir bandymo duomenyse esantys atributai turi būti tokie patys.

taikinys = traukinio_duomenys [ 'kaina' ]

traukinio_duomenys = traukinio_duomenys. lašas ( [ 'kaina' ] , ašį = 1 )

spausdinti ( traukinio_duomenys. informacija ( ) )

spausdinti ( test_data1. informacija ( ) )

Išvestis:

Dabar yra keturi nepriklausomi atributai (lovos, vonios, dydis ir lot_size), o kaina yra priklausomas atributas, kuris priklauso nuo šių keturių atributų.

6. Modelio mokymas

Pirmiausia taikome RandomForestRegressor algoritmą. Importuokite jį iš „sklearn.ensemble“ paketo. Tai ansamblio technika.

  1. Sukurkite modelį iš RandomForestRegressor(). Šiam modeliui neperduodame jokių parametrų. Taigi, sprendimų medžių skaičius pagal numatytuosius nustatymus yra 100.
  2. Naudokite fit() metodą, kad pritaikytumėte modelį. Tam reikia dviejų parametrų. Pirmasis parametras yra priklausomi atributai, o antrasis parametras yra klasės etiketė / tikslas.
  3. Norėdami pamatyti modelio tikslumą, naudokite score() metodą. Taip pat naudojami tie patys parametrai, panašūs į fit() metodą.
išmoko ansamblis importuoti RandomForestRegressor

# Apibrėžkite modelį

modelis 1 = RandomForestRegressor ( )

# Tinka modeliui

modelis 1. tinka ( traukinio_duomenys , taikinys )

# Modelio tikslumas

spausdinti ( modelis 1. balas ( traukinio_duomenys , taikinys ) * 100 )

Išvestis:

86.08400889419033

7. Išbandykite modelį ir išsaugokite rezultatus

Tai paskutinis žingsnis, kai turime numatyti rezultatą ir juos saugoti.

  1. Prognozuoti () metodas naudojamas bandymo duomenims numatyti. Jis naudojamas su modeliu ir paima įdėtą verčių sąrašą / DataFrame.
  2. Norėdami išsaugoti rezultatus CSV faile, naudokite metodą to_csv().
  3. Atsisiųskite failą iš Python aplinkos („Google Colab“).
# Numatykite test_data1 naudodami modelį1.

testo_duomenys [ 'Kaina' ] = modelis 1. numatyti ( test_data1 )

# Išsaugokite test_data į test_results.csv

testo_duomenys. į_csv ( 'test_results.csv' )

# Atsisiųskite šį failą iš „Colab“.

failus. parsisiųsti ( 'test_results.csv' )

Išvestis:

Parodykime 20 įrašų iš 505 įrašų. Matote, kad kainos stulpelyje yra numatomos kiekvieno namo vertės.

Kiti modeliai

Nuspėkime namus naudodami DecisionTreeRegressor. Jį galite importuoti iš „sklearn.tree“ modulio.

išmoko medis importuoti Sprendimų medisRegressor

# Apibrėžkite modelį

modelis 2 = Sprendimų medisRegressor ( )

# Tinka modeliui

modelis 2. tinka ( traukinio_duomenys , taikinys )

# Modelio tikslumas

spausdinti ( modelis 2. balas ( traukinio_duomenys , taikinys ) * 100 )

# Numatykite test_data1 naudodami modelį1.

testo_duomenys [ 'Kaina' ] = modelis 2. numatyti ( test_data1 )

# Išsaugokite test_data į test_results.csv

testo_duomenys. į_csv ( 'test_results.csv' )

# Atsisiųskite šį failą iš „Colab“.

failus. parsisiųsti ( 'test_results.csv' )

Išvestis:

99.94183165335028

Numatomą rezultatą galite pamatyti čia:

Nuspėkime namus naudodami tiesinę regresiją. Importuokite modelį iš „sklearn.linear_model“ modulio.

išmoko linijinis_modelis importuoti Tiesinė regresija

# Apibrėžkite modelį

modelis 3 = Tiesinė regresija ( )

# Tinka modeliui

modelis 3. tinka ( traukinio_duomenys , taikinys )

# Numatykite test_data1 naudodami modelį1.

testo_duomenys [ 'Kaina' ] = modelis 3. numatyti ( test_data1 )

# Išsaugokite test_data į test_results.csv

testo_duomenys. į_csv ( 'test_results.csv' )

# Atsisiųskite šį failą iš „Colab“.

failus. parsisiųsti ( 'test_results.csv' )

Numatomą rezultatą galite pamatyti čia:

Išvada

Dabar galite numatyti savo būsto kainą pagal tokius požymius kaip kambarių skaičius, jūsų žemės plotas ir kt. Šiame vadove mes atsižvelgėme į tikrus namo duomenis iš Sietlo, Vašingtono. Naudodami regresijos metodus, tokius kaip tiesinė regresija, sprendimų medis ir atsitiktinis miškas, numatėme 505 namų kainą. Visi žingsniai (išankstinis duomenų apdorojimas, duomenų valymas ir duomenų vizualizacija), kuriuos reikia atlikti prieš mokant modelį, yra žingsnis po žingsnio paaiškinami kodo fragmentais ir išvestimis.