Šajā rokasgrāmatā mēs redzēsim, kā prognozēt ASV māju cenas, izmantojot mašīnmācīšanos, izmantojot Python. Vispirms mēs apspriežam izmantojamo datu kopu un pēc tam veicam datu priekšapstrādi. Pēc tam mēs vizualizējam datu kopā esošos atribūtus un apmācības datu kopā izmantojam dažādus mašīnmācīšanās algoritmus (Sietla, Vašingtona, 2022. gada augusts–2022. gada decembris). Visbeidzot, mēs beidzam šo rokasgrāmatu, prognozējot cenas dažām mājām, kas ir iekļautas testa datu kopā. Pirms šī projekta īstenošanas mums ir jāsaprot mašīnmācīšanās terminoloģija, kas tiek izmantota šajā projektā.
Regresija
Ja mašīnmācībā strādājat ar skaitliskiem datiem, jums ir jāsaprot regresija. Regresija ir mašīnmācības uzraudzīta mācīšanās metode, ko izmanto, lai izprastu attiecības starp neatkarīgiem atribūtiem un atkarīgiem atribūtiem (klases etiķete/mērķis). Iekārta prognozē mājas cenu, apgūstot katru ierakstu, kas atrodas datu kopā. Tādējādi tā ir uzraudzīta mācīšanās.
Piemēram, mūsu scenārijā neatkarīgie atribūti ir gultu skaits, vannu skaits, zemes platība, pasta indekss utt. Pamatojoties uz tiem, mēs varam prognozēt mūsu mājas cenu. Tātad šie ir neatkarīgie atribūti, kas nav ne no kā atkarīgi. Cena ir mērķa atribūts vai klases etiķete, kas ir atkarīga no šiem atribūtiem.
1. Lineārā regresija
Lineārās regresijas algoritms parāda lineāru sakarību starp atkarīgo atribūtu (Y) un neatkarīgo atribūtu (X) mainīgajiem. Matemātiski mēs to varam novērtēt šādi:
UN = aX+b
Šeit “a” un “b” ir lineārie koeficienti.
Python programmā LinearRegression() ir pieejama modulī “sklearn.linear_model”. Redzēsim, kā to precizēt, realizējot projektu. Šis ir modelis ar parametriem:
2. Lēmumu koks
Būtībā lēmumu koks ir grafisks attēlojums, lai iegūtu visus iespējamos problēmas risinājumus, pamatojoties uz nosacījumiem, kas tiek nodrošināti, izmantojot mezglus. Lēmuma mezgls tiek izmantots, lai pieņemtu lēmumu, un Leaf mezgls attiecas uz konkrēta lēmuma izvadi. Mēs varam prognozēt mūsu mājas cenu ar Lēmumu koka regressoru.
Programmā Python DecisionTreeRegressor ir pieejams modulī “sklearn.tree”. Redzēsim, kā to precizēt, realizējot projektu. Šis ir modelis ar parametriem:
3. Random Forest
Random Forest veic to pašu funkcionalitāti, kas ir līdzīga lēmumu kokam. Bet ir nepieciešams mežs (lēmumu koku kolekcija) un apvienot (vidējā vērtība) visus lēmumu koku rezultātus. Piemēram, izlases meža lielums ir 3. Tātad iekšēji tiek izveidoti trīs lēmumu koki, un pirmā lēmumu koka mājas cenas rezultāts ir 20 000. Otrā lēmumu koka mājas cenas rezultāts ir 20 000. Un mājas cenu rezultāts pēdējais lēmumu koks ir 10 000. 16 666 666 ir gala rezultāts ((20000+20000+10000)/3).
Python programmā RandomForestRegressor ir pieejams modulī “sklearn.ensemble”. Tālāk ir parādīts modelis ar parametriem. Mēs varam norādīt koku skaitu parametrā “n_estimators”. Pēc noklusējuma tas ir 100.
Īstenošana
Ātri skatiet darbības, kas saistītas ar ASV mājokļu cenas prognozēšanu. Mēs uzskatām houses_train (CSV faila) datu kopu ar 2016. gada ierakstiem (izmanto, lai apmācītu mašīnmācības modeli). Pēc tam mēs prognozējam mājas cenas (505) ierakstus, kas atrodas mājas_pārbaudes failā.
1. Vilcienu un testa datu kopu ielāde
Pandas ir pieejamais Python modulis, ko izmanto datu analīzei. Mēs izmantojam šo moduli, lai ielādētu datu kopas Python vidē. Šeit mēs izmantojam Google Co kā Code Environment. Tas ir pieejams bez maksas. Ir nepieciešams tikai Google konts.
Pirmkārt, mums ir jāielādē faili no mūsu vietējā datora uz Colab Env. Lejupielādējiet datu kopas no šeit .
# Augšupielādējiet failus houses_train.csv un house_test.csv savā Google Colab# viens pēc otra.
no google. UN CITI imports failus
failus. augšupielādēt ( )
Read_csv() ir funkcija, kas tiek izmantota, lai ielādētu CSV datus mainīgajā. Tas izmanto faila nosaukumu kā parametru.
imports pandas# Ielādējiet houses_train.csv mainīgajā train_data
vilciena_dati = pandas. lasīt_csv ( 'houses_train.csv' )
# Ielādējiet house_test.csv mainīgajā test_data
testa_dati = pandas. lasīt_csv ( 'house_test.csv' )
# Saglabājiet test_data mainīgajā test_data1
testa_dati1 = testa_dati
Apskatīsim kolonnas un ierakstu skaitu, kas nav nulles katrā kolonnā. Lai iegūtu šo informāciju, tiek izmantots Pandas.DataFrame.info().
drukāt ( vilciena_dati. info ( ) )drukāt ( testa_dati1. info ( ) )
Izvade:
2. Datu priekšapstrāde
Abās datu kopās kolonnā “lot_size” ir vērtības ar sqft un acre (atšķirību atradīsit, skatot rindas kolonnā “lot_size_unit’s”). Bet formātam jābūt kvadrātpēdās. Tātad mums ir jāpārvērš vērtības kolonnā “lot_size” no akriem uz kvadrātpēdām. Līdzīgi tas jādara ar “test_data1”.
Šeit tiek izmantots DataFrame.loc[], lai atrastu “lot_size_units” ar “acre” un reizinātu vērtību, kas atrodas laukā “lot_size” ar 43560.
# Konvertējiet lot_size akru vērtības kvadrātpēdās mapē train_datavilciena_dati. vieta [ ( vilciena_dati [ 'lot_size_units' ] == 'acre' ) , 'lot_size' ] = vilciena_dati [ 'lot_size' ] * 43560
# Pārvērtiet lot_size acre vērtības kvadrātpēdās test_data1
testa_dati1. vieta [ ( testa_dati1 [ 'lot_size_units' ] == 'acre' ) , 'lot_size' ] = testa_dati1 [ 'lot_size' ] * 43560
drukāt ( vilciena_dati. galvu ( ) )
drukāt ( testa_dati1. galvu ( ) )
Izvade:
Tagad jūs redzēsit, ka visas vērtības kolonnā “lot_size” ir kvadrātpēdas vērtības.
Šajā slejā ir redzamas dažas trūkstošās vērtības. Aizstāsim kolonnās esošās NaN vērtības ar vienas un tās pašas kolonnas vidējo vērtību abās datu kopās.
DataFrame['kolonnas_nosaukums'].fillna() tiek izmantots, lai aizpildītu trūkstošās vērtības ar vidējo, izmantojot funkciju mean(). DataFrame['kolonnas_nosaukums'].mean() tiek nodots kā parametrs funkcijai finna(). Parādīsim vidējo un tagad redzēsim skaitu:
# Aizpildiet trūkstošās vērtības kolonnā lot_size ar esošo vērtību vidējo vērtībuvilciena_dati [ 'lot_size' ] = vilciena_dati [ 'lot_size' ] . justies ( vilciena_dati [ 'lot_size' ] . nozīmē ( ) )
# Display Mean
drukāt ( 'Vilciena datu vidējā vērtība:' , vilciena_dati [ 'lot_size' ] . nozīmē ( ) )
drukāt ( tikai ( vilciena_dati [ 'lot_size' ] ) )
# Aizpildiet trūkstošās vērtības kolonnā lot_size ar esošo vērtību vidējo vērtību
testa_dati1 [ 'lot_size' ] = testa_dati1 [ 'lot_size' ] . justies ( testa_dati1 [ 'lot_size' ] . nozīmē ( ) )
# Display Mean
drukāt ( 'Pārbaudes datu vidējā vērtība:' , testa_dati1 [ 'lot_size' ] . nozīmē ( ) )
drukāt ( tikai ( testa_dati1 [ 'lot_size' ] ) )
Izvade:
Trūkstošās vērtības, kas atrodas kolonnā “lot_size” Vilciena datu kopa, tiek aizstātas ar vidējo vērtību 18789.95194, un trūkstošās vērtības, kas atrodas kolonnā “lot_size” Test Dataset, tiek aizstātas ar vidējo vērtību 8961,0.
3. Datu tīrīšana
Apmācot modeli, ir daži nevajadzīgi atribūti, kas nav nepieciešami, lai prognozētu rezultātu. Mūsu gadījumā ir trīs atribūti, kas ir “lot_size_units”, “zip_code” un “size_units”, kas ir jānoņem no abām datu kopām. Pandas.DataFrame.drop() tiek izmantots, lai noņemtu šīs trīs kolonnas no abām datu kopām.
vilciena_dati = vilciena_dati. piliens ( [ 'lot_size_units' , 'pasta indekss' , 'izmēra_vienības' ] , ass = 1 )testa_dati1 = testa_dati1. piliens ( [ 'lot_size_units' , 'pasta indekss' , 'izmēra_vienības' ] , ass = 1 )
drukāt ( vilciena_dati. info ( ) )
drukāt ( testa_dati1. info ( ) )
Izvade:
Tagad datu kopas ir labā stāvoklī. Nevajadzīgās kolonnas tiek noņemtas, un trūkstošās vērtības nepastāv.
4. Datu vizualizācija
Izveidosim histogrammu vilciena datu kolonnām. Funkciju pandas.DataFrame.hist() izmanto, lai ģenerētu histogrammas visiem atribūtiem.
vilciena_dati. hist ( vīģes izmērs = ( 4 , 9 ) )Izvade:
Vilcienu datu kolonnām tiek ģenerēta histogramma gultām, vannām, izmēram, lot_size un cenu kolonnām.
Izveidosim korelāciju visiem laukiem attiecībā pret otru. Modulis Plotly.express tiek izmantots, lai attēlotu korelētās vērtības.
imports sižetiski. izteiktkorr = vilciena_dati. korr ( )
# Uzzīmējiet korelētos datus
view_att = sižetiski. izteikt . imshow ( korr , text_auto = Taisnība )
# Displejs
view_att. parādīt ( )
Izvade:
- Gultas ir 0,2935 korelē ar cenu, -0,059 korelē ar lot_size, 0,77 korelē ar izmēru un 0,65 korelē ar vannām.
- Vannas ir 0,3173 korelē ar cenu, -0,054 korelē ar lot_size, 0,667 korelē ar vannām un 0,771 korelē ar gultām.
- Izmērs ir 0,444 korelēts ar cenu, -0,044 korelē ar lot_size, 0,667 korelē ar izmēru un 0,652 korelē ar gultām.
5. Modeļa sagatavošana
Mums ir jāiestata cena kā mērķa cena, noņemot to no train_data. Pārliecinieties, ka atribūtiem, kas atrodas vilciena un pārbaudes datos, šajā posmā ir jābūt vienādiem.
mērķis = vilciena_dati [ 'cena' ]vilciena_dati = vilciena_dati. piliens ( [ 'cena' ] , ass = 1 )
drukāt ( vilciena_dati. info ( ) )
drukāt ( testa_dati1. info ( ) )
Izvade:
Tagad ir četri neatkarīgi atribūti (gultas, vannas, izmērs un lot_size), un cena ir atkarīgais atribūts, kas ir atkarīgs no šiem četriem atribūtiem.
6. Modeļa apmācība
Pirmkārt, mēs izmantojam RandomForestRegressor algoritmu. Importējiet to no pakotnes “sklearn.ensemble”. Tā ir ansambļa tehnika.
- Izveidojiet modeli no RandomForestRegressor(). Mēs šim modelim nenododam nevienu parametru. Tātad lēmumu koku skaits pēc noklusējuma ir 100.
- Izmantojiet fit() metodi, lai pielāgotu modeli. Tam nepieciešami divi parametri. Pirmais parametrs ir atkarīgie atribūti, bet otrais parametrs ir klases etiķete/mērķis.
- Izmantojiet metodi score(), lai redzētu modeļa precizitāti. Tam ir nepieciešami arī tie paši parametri, kas ir līdzīgi fit() metodei.
# Definējiet modeli
modelis1 = RandomForestRegressor ( )
# Pielāgojiet modelim
modelis1. der ( vilciena_dati , mērķis )
# Modeļa precizitāte
drukāt ( modelis1. rezultāts ( vilciena_dati , mērķis ) * 100 )
Izvade:
86.084008894190337. Pārbaudiet modeli un saglabājiet rezultātus
Šis ir pēdējais solis, kurā mums jāparedz rezultāts un tie jāsaglabā.
- Prognozēšanas () metode tiek izmantota, lai prognozētu testa datus. Tas tiek izmantots kopā ar modeli un aizņem ligzdoto vērtību sarakstu/DataFrame.
- Izmantojiet metodi to_csv(), lai saglabātu rezultātus CSV failā.
- Lejupielādējiet failu no Python vides (Google Colab).
testa_dati [ 'Cena' ] = modelis1. prognozēt ( testa_dati1 )
# Saglabājiet testa_datus failā test_results.csv
testa_dati. uz_csv ( 'test_results.csv' )
# Lejupielādējiet šo failu no Colab
failus. lejupielādēt ( 'test_results.csv' )
Izvade:
Parādīsim 20 ierakstus no 505 ierakstiem. Varat redzēt, ka slejā Cena ir katrai mājai paredzētās vērtības.
Citi modeļi
Paredzēsim mājas, izmantojot DecisionTreeRegressor. To var importēt no moduļa “sklearn.tree”.
no iemācījušies koks imports DecisionTreeRegressor# Definējiet modeli
modelis2 = DecisionTreeRegressor ( )
# Pielāgojiet modelim
modelis2. der ( vilciena_dati , mērķis )
# Modeļa precizitāte
drukāt ( modelis2. rezultāts ( vilciena_dati , mērķis ) * 100 )
# Prognozējiet testa_datus1 ar modeli1.
testa_dati [ 'Cena' ] = modelis2. prognozēt ( testa_dati1 )
# Saglabājiet testa_datus failā test_results.csv
testa_dati. uz_csv ( 'test_results.csv' )
# Lejupielādējiet šo failu no Colab
failus. lejupielādēt ( 'test_results.csv' )
Izvade:
99.94183165335028Prognozēto rezultātu var redzēt šeit:
Paredzēsim mājas, izmantojot lineāro regresiju. Importējiet modeli no moduļa “sklearn.linear_model”.
no iemācījušies lineārais_modelis imports Lineārā regresija# Definējiet modeli
modelis3 = Lineārā regresija ( )
# Pielāgojiet modelim
modelis3. der ( vilciena_dati , mērķis )
# Prognozējiet testa_datus1 ar modeli1.
testa_dati [ 'Cena' ] = modelis3. prognozēt ( testa_dati1 )
# Saglabājiet testa_datus failā test_results.csv
testa_dati. uz_csv ( 'test_results.csv' )
# Lejupielādējiet šo failu no Colab
failus. lejupielādēt ( 'test_results.csv' )
Prognozēto rezultātu var redzēt šeit:
Secinājums
Tagad jūs varat prognozēt savas mājas cenu, pamatojoties uz tādiem atribūtiem kā istabu skaits, jūsu zemes platība utt. Šajā rokasgrāmatā mēs aplūkojām reālos mājas datus no Sietlas, Vašingtonas štatā. Izmantojot regresijas metodes, piemēram, Lineārā regresija, Lēmumu koks un Random Forest, mēs prognozējām 505 māju cenu. Visas darbības (datu priekšapstrāde, datu tīrīšana un datu vizualizācija), kas jāveic pirms modeļa apmācības, ir soli pa solim izskaidrotas ar koda fragmentiem un izvadiem.