Cieľom práce je predikovať cenu nehnuteľnosti na základe jej vlastností (lokalita, veľkosť, dostupnosť služieb, kvalita a pod.) pomocou rozhodovacích stromov a súborových metód.
V rámci práce je analyzovaný regresný problém a porovnané sú viaceré prístupy – jednoduchý rozhodovací strom, jeho prerezávanie, bagging, random forest, boosting a BART.
Ako doplnková analýza je rovnaký dátový súbor použitý aj na klasifikačnú úlohu (rozdelenie nehnuteľností na „drahé“ a „lacné“), čo umožňuje demonštrovať správanie stromových metód aj v klasifikačnom nastavení a porovnať ich výkonnosť pomocou metriky presnosti, ROC kriviek a AUC.
2Dataset - simulované údaje o cenách nehnuteľností
2.1Generovanie datasetu
Vygenerujeme dataset, ktorý zámerne obsahuje:
nelinearity (napr. efekt vzdialenosti do centra),
interakcie (napr. izby × kvalita),
šum (nepozorované faktory).
pevný počet pozorovaní (n=1500), ktorý zabezpečuje dostatočný objem dát na trénovanie a pozorovanie rôznych modelov
Code
n <-1500dat <-tibble(# "lokalita"dist_center_km =runif(n, 0.2, 25), # vzdialenosť do centratransit_score =pmin(pmax(rnorm(n, 60, 15), 0), 100), # dostupnosť MHDnoise_db =pmin(pmax(rnorm(n, 55, 8), 35), 85), # hlukcrime_index =rgamma(n, shape =2.2, rate =0.18), # kriminalita (vyššie horšie)parks_1km =rpois(n, lambda =2.0), # parky v okolíschools_score =pmin(pmax(rnorm(n, 65, 12), 0), 100), # kvalita škôl# "nehnuteľnosť"area_m2 =pmin(pmax(rnorm(n, 85, 25), 25), 220),rooms =pmin(pmax(round(rnorm(n, 3.2, 1.1)), 1), 8),age_years =pmin(pmax(rnorm(n, 35, 18), 0), 120),quality =factor(sample(c("low","mid","high"), n, replace =TRUE, prob =c(0.25, 0.55, 0.20)),levels =c("low","mid","high")),has_garage =rbinom(n, 1, 0.55),energy_class =factor(sample(c("A","B","C","D","E"), n, replace =TRUE, prob =c(0.10,0.25,0.35,0.20,0.10)),levels =c("A","B","C","D","E"))) |>mutate(# pomocné transformácielog_crime =log1p(crime_index),# nelineárny "penalizačný" efekt vzdialenosti do centradist_pen =18*log1p(dist_center_km) +0.25* dist_center_km,# kvalita ako číselný efektqual_eff =case_when(quality =="low"~-25, quality =="mid"~0, quality =="high"~35),# energetická triedaenergy_eff =case_when(energy_class =="A"~18, energy_class =="B"~10, energy_class =="C"~0, energy_class =="D"~-10,TRUE~-22) )# "pravá" (skrytá) generujúca funkcia ceny (v tis. €)# (zámerne nelineárna + interakcie)price_true <-with(dat,90+1.15* area_m2 +8.0* rooms + qual_eff + energy_eff +0.45* transit_score +0.55* schools_score +6.0*sqrt(parks_1km +1) -1.2* (noise_db -50) -22.0* log_crime - dist_pen +0.22* area_m2 * (quality =="high") +# interakcia: veľké byty profitujú viac pri vysokej kvalite10.0* has_garage -0.35*pmax(age_years -30, 0) +4.5*sin(dist_center_km /3) # jemná periodicita (napr. zóny mesta))# pozorovaná cena = true + šumdat <- dat |>mutate(price_k = price_true +rnorm(n, sd =25), # tis. €price_k =pmax(price_k, 30) # nech nie sú záporné ) |>select(-dist_pen, -qual_eff, -energy_eff)# --- KLASIFIKAČNÝ CIEĽ ---# "drahé" = horný kvartil (25% najdrahších)thr_q75 <-quantile(dat$price_k, 0.75)dat <- dat |>mutate(is_expensive =factor(if_else(price_k >= thr_q75, "yes", "no"),levels =c("no","yes")))glimpse(dat)
Použitý dataset bol vytvorený synteticky s cieľom simulovať realistické podmienky trhu s nehnuteľnosťami a umožniť systematické porovnanie rôznych modelov strojového učenia. Dáta boli generované tak, aby zachytávali typické vzťahy medzi vlastnosťami nehnuteľností a ich cenou, pričom zároveň umožňovali kontrolu nad štruktúrou problému a elimináciu vplyvu neznámych externých faktorov.
Dataset obsahuje premenné opisujúce fyzické vlastnosti nehnuteľnosti (napr. rozloha, počet izieb, vek stavby), lokalitné faktory (vzdialenosť od centra, dostupnosť služieb, miera kriminality, hlučnosť prostredia) aj kvalitatívne charakteristiky (energetická trieda, celková kvalita bývania). Tieto premenné boli zvolené tak, aby zodpovedali typickým determinantom cien nehnuteľností pozorovaným v reálnych dátach.
Hodnota cieľovej premennej – cena nehnuteľnosti – bola generovaná ako nelineárna funkcia viacerých vstupných premenných. Model zahŕňa interakčné efekty (napr. medzi veľkosťou nehnuteľnosti a jej kvalitou), ako aj náhodnú zložku reprezentujúcu nepozorované faktory trhu. Takýto spôsob generovania dát umožňuje vznik realistickej variability a zároveň vytvára prostredie vhodné na testovanie schopnosti modelov zachytiť komplexné vzťahy.
Zámerom použitia syntetických dát nebolo simulovať konkrétny realitný trh, ale vytvoriť kontrolované experimentálne prostredie, v ktorom možno transparentne porovnávať správanie rôznych modelov – od jednoduchých rozhodovacích stromov až po pokročilé súborové metódy. Vďaka tomu je možné lepšie interpretovať rozdiely medzi modelmi a ich schopnosť generalizácie bez vplyvu šumu alebo skreslení typických pre reálne datasety.
3EDA (prehľad dát)
Code
dat |>summarise(n =n(),price_mean =mean(price_k),price_sd =sd(price_k),price_min =min(price_k),price_max =max(price_k) ) |>kbl("Základný prehľad cieľovej premennej (cena v tis. €)")
Základný prehľad cieľovej premennej (cena v tis. €)
n
price_mean
price_sd
price_min
price_max
1500
188.5768
54.4041
30
387.4916
Základná deskriptívna analýza ukazuje, že priemerná cena nehnuteľnosti v dátach je približne 189 tis. €, pričom ceny sa pohybujú v pomerne širokom intervale od 30 do 387 tis. €. Relatívne vysoká smerodajná odchýlka naznačuje výraznú variabilitu cien, čo poukazuje na heterogénnosť dát a opodstatňuje použitie flexibilných modelov schopných zachytiť nelineárne vzťahy.
Code
p1 <-ggplot(dat, aes(price_k)) +geom_histogram(bins =40) +labs(title ="Rozdelenie ceny (price_k)", x ="Cena (tis. €)", y ="Počet")p2 <-ggplot(dat, aes(dist_center_km, price_k)) +geom_point(alpha =0.25) +geom_smooth(se =FALSE) +labs(title ="Cena vs vzdialenosť do centra", x ="Vzdialenosť (km)", y ="Cena (tis. €)")p1
Code
p2
Histogram ceny nehnuteľností ukazuje približne symetrické, mierne pravostranné rozdelenie s vrcholom okolo hodnoty 180–200 tis. €. Väčšina pozorovaní sa nachádza v intervale približne 120–260 tis. €, pričom extrémne nízke a vysoké ceny sa vyskytujú len zriedkavo. Rozdelenie neobsahuje výrazné odľahlé hodnoty, čo naznačuje, že dáta sú vhodné pre ďalšie modelovanie bez potreby výrazných transformácií cieľovej premennej.
Z grafu závislosti ceny od vzdialenosti od centra je zrejmý mierne klesajúci trend – s rastúcou vzdialenosťou od centra má cena nehnuteľnosti tendenciu klesať. Zároveň je však rozptyl hodnôt pomerne veľký, čo naznačuje, že samotná vzdialenosť od centra nevysvetľuje cenu dostatočne a jej vplyv je ovplyvnený ďalšími faktormi (napr. veľkosť, kvalita, dostupnosť služieb). Tento nelineárny a šumom ovplyvnený vzťah podporuje použitie flexibilnejších modelov, ako sú rozhodovacie stromy a súborové metódy.
Dáta boli rozdelené na trénovaciu a testovaciu množinu v pomere 80 : 20, čo zodpovedá 1200 pozorovaniam v trénovacej a 300 pozorovaniam v testovacej množine. Takéto rozdelenie poskytuje dostatočný počet dát na učenie modelov a zároveň umožňuje objektívne vyhodnotenie ich generalizačnej schopnosti na nezávislých pozorovaniach. Zároveň sme vytvoril aj testovaciu a trénovaciu vzorku, ktorá neobsahuje prediktor is_expensive, ktorý by nám v regresea spôsoboval data leakedge.
5Rozhodovací strom (regresný)
5.1Veľký strom a problém overfittingu
Najprv necháme strom “narásť” (malá penalizácia, malý minbucket), aby sme videli riziko preučenia.
Na základe dosiahnutých výsledkov možno pozorovať, že veľký regresný strom dosahuje pomerne dobrý výkon na trénovacej množine (RMSE ≈ 26.2, R² ≈ 0.77), čo naznačuje vysokú schopnosť modelu prispôsobiť sa dostupným dátam. Tento výsledok však nie je možné považovať za spoľahlivý ukazovateľ kvality modelu, keďže ide o výkon na trénovacích dátach a model zatiaľ nebol porovnaný s alternatívnymi prístupmi.
Na testovacej množine dochádza k výraznému poklesu výkonnosti (RMSE ≈ 39.9, R² ≈ 0.48), čo poukazuje na obmedzenú schopnosť generalizácie. Rozdiel medzi výkonom na trénovacích a testovacích dátach naznačuje, že model je do istej miery preučený, keďže vytvára veľmi komplexnú štruktúru založenú na veľkom počte rozdelení a čiastočne zachytáva aj náhodný šum v dátach.
Z tohto dôvodu je opodstatnené ďalej skúmať vplyv regulácie modelu, konkrétne prerezávania stromu, s cieľom znížiť jeho komplexnosť a zlepšiť generalizačné vlastnosti na nové, nevidené dáta.
Po aplikovaní prerezávania pomocou pravidla 1-SE dochádza k miernej zmene výkonnosti modelu na testovacej množine. Prerezaný strom dosahuje nižšie hodnoty RMSE a MAE v porovnaní s pôvodným (neorezaným) stromom, čo naznačuje mierne zlepšenie presnosti predikcie v absolútnych metrikách chyby.
Na druhej strane hodnota koeficientu determinácie R² zostáva veľmi podobná a dokonca mierne klesá, čo poukazuje na to, že prerezávanie nemalo jednoznačný pozitívny vplyv na schopnosť modelu vysvetľovať variabilitu cieľovej premennej. Celkový rozdiel medzi oboma modelmi je však malý, čo naznačuje, že pôvodný strom nebol výrazne preučený.
Tento výsledok ukazuje, že cost-complexity prerezávanie môže viesť k jednoduchšiemu modelu s porovnateľnou výkonnosťou, avšak jeho prínos z hľadiska presnosti a vysvetľovacej schopnosti závisí od konkrétnej štruktúry dát a miery komplexnosti pôvodného stromu.
6Súborové metódy (ensemble)
Samotný strom má často vyššiu varianciu; agregácia viacerých stromov typicky zlepší presnosť.
6.1Bagging (bootstrap aggregation) + OOB odhad
Bagging je špeciálny prípad random forest, kde pri každom split-e uvažujeme všetky premenné (mtry = p).
Použijeme balík ranger, ktorý umožňuje rýchlu implementáciu baggingu a zároveň poskytuje odhad chyby pomocou OOB vzorkovania.
Ranger result
Call:
ranger(price_k ~ ., data = train_reg, num.trees = 800, mtry = p, min.node.size = 8, importance = "permutation", oob.error = TRUE, seed = 20251227)
Type: Regression
Number of trees: 800
Sample size: 1200
Number of independent variables: 13
Mtry: 13
Target node size: 8
Variable importance mode: permutation
Splitrule: variance
OOB prediction error (MSE): 965.763
R squared (OOB): 0.6752518
Model založený na metóde bagging dosahuje strednú hodnotu OOB chyby (RMSE ≈ 31.1) a koeficient determinácie R² ≈ 0.68, čo poukazuje na primeranú, hoci nie výnimočnú schopnosť generalizácie. Výsledky naznačujú, že agregácia viacerých stromov vedie k stabilnejšiemu výkonu v porovnaní s jednoduchým rozhodovacím stromom, avšak bez dramatického zlepšenia presnosti.
Hodnota OOB chyby poskytuje spoľahlý interný odhad generalizačného výkonu a naznačuje, že model nie je výrazne preučený. V porovnaní s jednotlivým stromom bagging znižuje variabilitu predikcií, no stále zaostáva za výkonnejšími súborovými metódami, ako sú Random Forest alebo boosting.
6.1.1 OOB RMSE vs test RMSE
Code
pred_bag_test <-predict(fit_bag, data = test_reg)$predictionstibble(OOB_RMSE =sqrt(fit_bag$prediction.error),Test_RMSE =rmse_vec(test_reg$price_k, pred_bag_test),Test_R2 =rsq_vec(test_reg$price_k, pred_bag_test)) |>kbl("Bagging: OOB vs test výkon")
Bagging: OOB vs test výkon
OOB_RMSE
Test_RMSE
Test_R2
31.0767
32.8175
0.6292
OOB chyba je veľmi podobná chybe na testovacej množine, čo naznačuje, že model má dobrú schopnosť generalizácie a nie je výrazne preučený. Bagging tak poskytuje stabilnejší a presnejší odhad než samostatný strom.
Z grafu vyplýva, že najvýznamnejšími faktormi ovplyvňujúcimi predikciu ceny nehnuteľnosti sú jej rozloha (area_m2) a kvalita bývania (quality). Tieto premenné majú dominantný vplyv na rozhodovanie modelu, čo zodpovedá ekonomickej intuící aj empirickým poznatkom z reálnych trhov s nehnuteľnosťami.
Menší, no stále nenulový vplyv majú lokalitné faktory, ako je vzdialenosť od centra (dist_center_km) a miera kriminality (crime_index, resp. log_crime), ktoré zachytávajú atraktivitu prostredia. Ostatné premenné, ako hluk, energetická trieda, dostupnosť služieb či počet izieb, zohrávajú skôr doplnkovú úlohu. Výsledky tak potvrdzujú, že cena nehnuteľnosti je determinovaná kombináciou viacerých faktorov, pričom najväčší význam majú charakteristiky priamo súvisiace s veľkosťou a kvalitou bývania.
6.2Random Forest
Random forest znižuje koreláciu stromov tým, že pri každom split-e zvažuje len náhodný podvýber premenných (typicky mtry ~ p/3 pre regresiu).
Ranger result
Call:
ranger(price_k ~ ., data = train_reg, num.trees = 1200, mtry = max(1, floor(p/3)), min.node.size = 6, importance = "permutation", oob.error = TRUE, seed = 20251227)
Type: Regression
Number of trees: 1200
Sample size: 1200
Number of independent variables: 13
Mtry: 4
Target node size: 6
Variable importance mode: permutation
Splitrule: variance
OOB prediction error (MSE): 960.475
R squared (OOB): 0.67703
Model Random Forest dosahuje dobrý výkon, čo potvrdzuje hodnota OOB chyby (RMSE ≈ 31.0) a koeficient determinácie R² ≈ 0.68. Tieto výsledky naznačujú, že model dokáže vysvetliť približne dve tretiny variability cieľovej premennej a má stabilnú generalizačnú schopnosť.
V porovnaní s jednoduchým rozhodovacím stromom predstavuje Random Forest výrazné zlepšenie, keďže znižuje varianciu modelu prostredníctvom agregácie viacerých stromov a náhodného výberu premenných pri každom delení. Na druhej strane jeho výkon mierne zaostáva za metódami založenými na sekvenčnom učení, ako je gradient boosting alebo BART, ktoré dokážu efektívnejšie zachytiť komplexné nelineárne vzťahy v dátach.
Výsledky potvrdzujú, že Random Forest predstavuje robustný a spoľahlivý kompromis medzi presnosťou a stabilitou, najmä v situáciách, kde je prioritou dobrá generalizácia a nižšia citlivosť na nastavenie hyperparametrov.
6.2.1 OOB RMSE vs test RMSE
Code
pred_rf_test <-predict(fit_rf, data = test_reg)$predictionstibble(OOB_RMSE =sqrt(fit_rf$prediction.error),Test_RMSE =rmse_vec(test_reg$price_k, pred_rf_test),Test_R2 =rsq_vec(test_reg$price_k, pred_rf_test)) |>kbl("Random Forest: OOB vs test výkon")
Random Forest: OOB vs test výkon
OOB_RMSE
Test_RMSE
Test_R2
30.9915
32.5304
0.6504
Porovnanie OOB chyby a chyby na testovacej množine ukazuje len mierny rozdiel (OOB RMSE ≈ 31.0 vs. test RMSE ≈ 32.5), čo naznačuje, že model Random Forest nie je výrazne preučený a zachováva si stabilný výkon aj na nezávislých dátach. Hodnota koeficientu determinácie na testovacej množine (R² ≈ 0.65) potvrdzuje dobrú generalizačnú schopnosť modelu.
Vďaka použitiu náhodného výberu premenných pri každom delení stromov (parameter mtry) dochádza k zníženiu korelácie medzi jednotlivými stromami, čo vedie k nižšej variancii modelu a lepšej generalizácii v porovnaní s jednoduchým rozhodovacím stromom. Random Forest tak predstavuje robustný a spoľahlivý prístup k regresnej úlohe s vyváženým pomerom medzi presnosťou a stabilitou.
Z grafu vyplýva, že najväčší vplyv na predikciu ceny nehnuteľnosti majú rozloha nehnuteľnosti (area_m2) a kvalita bývania (quality), ktoré výrazne dominujú ostatným premenným. Medzi ďalšie dôležité faktory patria vzdialenosť od centra (dist_center_km) a mieru kriminality v okolí (crime_index, log_crime).
Ostatné premenné, ako hluk, energetická trieda, dostupnosť dopravy či počet izieb, majú v modeli menší, avšak nenulový vplyv. Výsledky potvrdzujú, že Random Forest dokáže identifikovať kľúčové charakteristiky ovplyvňujúce cenu nehnuteľnosti a zachytiť ich relatívny význam v súlade s očakávaniami z reálneho trhu s nehnuteľnosťami.
6.3Boosting (gradient boosting)
Boosting rastie sekvenčne (každý ďalší strom opravuje chyby predchádzajúcich) a má ladiace parametre ako počet stromov, hĺbka interakcií a shrinkage.
gbm(formula = price_k ~ ., distribution = "gaussian", data = train_gbm,
n.trees = 7000, interaction.depth = 4, n.minobsinnode = 10,
shrinkage = 0.01, bag.fraction = 0.7, train.fraction = 1,
verbose = FALSE)
A gradient boosted model with gaussian loss function.
7000 iterations were performed.
There were 17 predictors of which 16 had non-zero influence.
Model Gradient Boosting využívajúci 7000 stromov a nízku hodnotu parametra shrinkage dosahuje stabilný výkon a efektívne zachytáva nelineárne vzťahy v dátach, pričom skutočnosť, že väčšina premenných má nenulový vplyv, potvrdzuje schopnosť modelu využívať široké spektrum informácií pri predikcii ceny nehnuteľnosti.
Vyberieme optimálny počet stromov cez OOB (v gbm: gbm.perf).
Na grafe je zobrazený priebeh OOB chyby v závislosti od počtu stromov v modeli Gradient Boosting. S rastúcim počtom stromov dochádza k postupnému znižovaniu chyby, pričom po určitom bode sa zlepšenie spomaľuje. Zvislá čiara označuje optimálny počet stromov vybraný pomocou OOB kritéria, pri ktorom je dosiahnutý najlepší kompromis medzi presnosťou a zložitosťou modelu.
6.3.1 RMSE vs MAE
Code
best_trees
[1] 728
attr(,"smoother")
Call:
loess(formula = object$oobag.improve ~ x, enp.target = min(max(4,
length(x)/10), 50))
Number of Observations: 7000
Equivalent Number of Parameters: 39.99
Residual Standard Error: 0.3992
Na základe OOB krivky bol ako optimálny zvolený model s približne 728 stromami, pri ktorom sa dosahuje najnižšia validačná chyba. Výsledný model dosahuje hodnotu RMSE ≈ 30.3 a R² ≈ 0.69, čo predstavuje ďalšie zlepšenie oproti baggingu aj klasickému random forestu.
Z výsledkov vyplýva, že najvýznamnejším faktorom ovplyvňujúcim cenu nehnuteľnosti je rozloha nehnuteľnosti (area_m2), ktorá má výrazne najvyšší relatívny vplyv. Veľmi dôležitú úlohu zohráva aj kvalita bývania, najmä kategória high, čo potvrdzuje silný vzťah medzi kvalitatívnymi charakteristikami a cenou nehnuteľnosti.
Medzi ďalšie významné faktory patria vzdialenosť od centra (dist_center_km) a miera kriminality v okolí (crime_index), ktoré majú výrazný, no sekundárny vplyv. Negatívny efekt hluku (noise_db) a mierne pozitívny vplyv dostupnosti verejnej dopravy a škôl naznačujú, že model zachytáva aj jemnejšie lokalitné charakteristiky.
Ostatné premenné, ako počet izieb, vek nehnuteľnosti či energetická trieda, majú v modeli menší, doplnkový význam. Celkovo výsledky potvrdzujú, že boosting efektívne identifikuje kľúčové determinanty ceny nehnuteľností a zachytáva realistické nelineárne vzťahy medzi ich vlastnosťami a cenou.
6.3.3Parciálne závislosti
Code
# Parciálne efekty pre vybrané premennévars_show <-c("dist_center_km", "area_m2", "schools_score", "noise_db")for (v in vars_show) { pd <-partial(fit_gbm, pred.var = v, n.trees = best_trees, train = train_gbm)print(autoplot(pd) +labs(title =paste("Boosting – parciálny efekt:", v), x = v, y ="Odhadovaný efekt") )}
Parciálne závislosti ilustrujú, ako jednotlivé premenné ovplyvňujú predikovanú cenu nehnuteľnosti pri fixovaní ostatných vstupov.
Z grafu pre vzdialenosť od centra (dist_center_km) je zrejmé, že s rastúcou vzdialenosťou cena systematicky klesá. Tento pokles je výraznejší najmä v prvých kilometroch, čo zodpovedá očakávanému efektu atraktivity centrálnej polohy.
V prípade rozlohy nehnuteľnosti (area_m2) je pozorovaný jednoznačne rastúci trend – väčšia plocha vedie k vyššej odhadovanej cene, pričom nárast je približne lineárny v strednom rozsahu hodnôt.
Graf pre skóre škôl (schools_score) ukazuje mierny, ale konzistentný pozitívny vplyv, čo naznačuje, že dostupnosť kvalitných vzdelávacích inštitúcií zvyšuje atraktivitu lokality.
Naopak, hluk (noise_db) má negatívny vplyv – s rastúcou hlučnosťou dochádza k postupnému poklesu predikovanej ceny, pričom efekt je výraznejší pri vyšších hodnotách hluku.
Celkovo tieto parciálne závislosti potvrdzujú, že model zachytáva realistické a intuitívne vzťahy medzi vlastnosťami nehnuteľností a ich cenou, čo podporuje jeho interpretovateľnosť a praktickú použiteľnosť.
6.4BART (Bayesian Additive Regression Trees)
BART je bayesovská súborová metóda založená na MCMC: poskytuje nielen bodový odhad, ale aj neistotu (intervaly).
# Posterior mean predictionspred_bart_test_mean <- fit_bart$yhat.test.mean
Model BART bol úspešne natrénovaný s využitím 200 stromov a vykazuje stabilnú konvergenciu počas MCMC vzorkovania. Odhadovaná hodnota reziduálnej variability naznačuje dobrú schopnosť modelu zachytiť štruktúru dát, pričom použité regularizačné mechanizmy bránia preučeniu. Výsledok potvrdzuje, že BART predstavuje robustnú alternatívu k ostatným stromovým metódam pri modelovaní nelineárnych vzťahov.
6.4.1 RMSE vs MAE
Code
reg_metrics(y_test, pred_bart_test_mean) |>kbl("BART: test metriky (posterior mean)")
BART: test metriky (posterior mean)
RMSE
MAE
R2
28.7704
23.2692
0.7159
Model BART dosahuje najlepší výkon spomedzi všetkých uvažovaných prístupov, čo potvrdzuje najnižšia hodnota RMSE (≈ 28.8) a najvyššia hodnota koeficientu determinácie (R² ≈ 0.71). Výsledky naznačujú, že BART dokáže veľmi dobre zachytiť nelineárne vzťahy v dátach a poskytuje najpresnejšie predikcie ceny nehnuteľností zo všetkých porovnávaných modelov.
Graf znázorňuje bodové predikcie modelu BART spolu s 90 % predikčnými intervalmi. Väčšina skutočných hodnôt sa nachádza v rámci týchto intervalov, čo naznačuje, že model dokáže primerane zachytiť neistotu predikcie. Šírka intervalov sa zvyšuje pri vyšších hodnotách ceny, čo odráža rastúcu neistotu pri extrémnejších pozorovaniach.
Zároveň je však zrejmé, že skutočná miera pokrytia je nižšia než nominálnych 90 %, čo naznačuje, že predikčné intervaly sú v tomto nastavení mierne podhodnotené. Táto skutočnosť môže súvisieť s nastavením priorov alebo s vlastnosťami samotných dát. Napriek tomu model BART poskytuje cennú informáciu o relatívnej neistote predikcií a predstavuje robustný nástroj na modelovanie nelineárnych vzťahov.
res |>pivot_longer(cols =c(RMSE, MAE, R2), names_to ="metric", values_to ="value") |>ggplot(aes(x =reorder(model, value), y = value)) +geom_col(alpha =0.9) +coord_flip() +facet_wrap(~metric, scales ="free") +labs(title ="Porovnanie metód na test set-e", x =NULL, y =NULL)
Porovnanie jednotlivých prístupov ukazuje, že model BART dosahuje najlepší celkový výkon, keď dosahuje najnižšiu hodnotu RMSE a zároveň najvyššie R^2. Nasleduje gradient boosting a random forest, ktoré poskytujú veľmi podobné, mierne slabšie výsledky. Najslabší výkon vykazuje prerezaný rozhodovací strom, čo potvrdzuje, že jednoduché stromy majú obmedzenú schopnosť zachytiť komplexné vzťahy v dátach.
Z výsledkov vyplýva, že súborové metódy výrazne prekonávajú jednotlivé stromy, pričom medzi nimi dosahuje najlepšie výsledky BART, ktorý kombinuje vysokú presnosť s dobrou generalizáciou. Táto analýza potvrdzuje vhodnosť použitia pokročilých ensemble prístupov pri modelovaní cien nehnuteľností.
8Klasifikácia: drahé vs lacné
V tejto časti spravíme klasifikačnú úlohu: predikovať, či je nehnuteľnosť drahá (horný kvartil ceny) alebo nie.
Ukážeme klasifikačný strom a random forest, vyhodnotíme ich cez confusion matrix, accuracy/F1 a ROC/AUC.
Dáta boli rozdelené na trénovaciu a testovaciu množinu pomocou stratifikovaného výberu, aby bol v oboch častiach zachovaný rovnaký pomer tried „drahá“ a „lacná“ nehnuteľnosť. V trénovacej množine tvorí trieda „drahá“ približne 25 % pozorovaní, rovnako ako v testovacej množine. Takýto postup zabezpečuje, že model je trénovaný aj vyhodnocovaný na dátach s porovnateľnou distribúciou tried, čím sa znižuje riziko skreslenia výsledkov pri klasifikačnej úlohe.
Zobrazený klasifikačný strom ilustruje rozhodovací proces pri rozlišovaní medzi drahými a lacnými nehnuteľnosťami. Najdôležitejším rozdeľujúcim kritériom je kvalita nehnuteľnosti, ktorá tvorí koreň stromu, čo naznačuje jej dominantný vplyv na výslednú cenu. V ďalších úrovniach zohrávajú významnú úlohu predovšetkým rozloha, vzdialenosť od centra a úroveň kriminality, ktoré ďalej spresňujú rozhodnutie modelu.
Strom zároveň ukazuje, že nehnuteľnosti s vyššou kvalitou a väčšou rozlohou majú výrazne vyššiu pravdepodobnosť zaradenia medzi drahé, zatiaľ čo menšie objekty nachádzajúce sa ďalej od centra alebo v oblastiach s vyššou kriminalitou sú častejšie klasifikované ako lacné. Výsledná štruktúra stromu tak poskytuje intuitívny a interpretovateľný pohľad na rozhodovací proces modelu.
Code
# Predikcie: trieda aj pravdepodobnosť triedy "yes"tree_class <-predict(fit_tree_cls, newdata = test_cls, type ="class")tree_prob <-predict(fit_tree_cls, newdata = test_cls, type ="prob")[, "yes"]# Confusion matrixconf_mat(tibble(truth = test_cls$is_expensive, estimate = tree_class),truth = truth, estimate = estimate)
Truth
Prediction no yes
no 203 43
yes 22 32
Konfúzna matica ukazuje, že model správne klasifikoval 203 lacných a 32 drahých nehnuteľností. Zároveň došlo k 43 falošne pozitívnym a 22 falošne negatívnym predikciám. Model je teda presnejší pri identifikácii lacnejších nehnuteľností, zatiaľ čo pri drahých objektoch je mierne konzervatívny. Napriek tomu vykazuje rozumnú rovnováhu medzi citlivosťou a presnosťou, čo je typické pre modely optimalizované na celkovú presnosť.
Klasifikačný strom dosahuje presnosť 78,3 %, čo znamená, že väčšinu prípadov klasifikuje správne. Hodnota F1 skóre ≈ 0,50 však naznačuje nevyvážený výkon medzi presnosťou a citlivosťou, najmä pri triede „drahé“. Model je teda schopný pomerne spoľahlivo rozlišovať medzi triedami, no v identifikácii drahších nehnuteľností má stále priestor na zlepšenie.
ROC krivka klasifikačného stromu sa nachádza výrazne nad diagonálou náhodného klasifikátora a dosahuje hodnotu AUC ≈ 0.81, čo poukazuje na dobrú schopnosť modelu rozlišovať medzi triedami „drahá“ a „lacná“ nehnuteľnosť. Aj keď výkon nedosahuje úroveň komplexnejších metód, ako je Random Forest alebo Boosting, strom dokáže zachytiť základné vzory v dátach a poskytuje interpretovateľný základ pre klasifikáciu.
Ranger result
Call:
ranger(is_expensive ~ . - price_k, data = train_cls, probability = TRUE, num.trees = 1000, mtry = max(1, floor(sqrt(p_cls))), min.node.size = 10, importance = "permutation", seed = 20251227)
Type: Probability estimation
Number of trees: 1000
Sample size: 1200
Number of independent variables: 13
Mtry: 3
Target node size: 10
Variable importance mode: permutation
Splitrule: gini
OOB prediction error (Brier s.): 0.1069596
Model Random Forest bol natrénovaný s 1000 stromami a využíva náhodný výber premenných pri každom delení, čo znižuje koreláciu medzi stromami a zlepšuje generalizačnú schopnosť. Dosiahnutá hodnota Brierovej chyby ≈ 0.107 indikuje pomerne dobrú kalibráciu pravdepodobnostných predikcií a lepší výkon v porovnaní s jednoduchým klasifikačným stromom.
Konfúzna matica ukazuje, že model správne klasifikoval 213 lacných a 39 drahých nehnuteľností. Zároveň došlo k 36 falošne pozitívnym a 12 falošne negatívnym prípadom. V porovnaní s jednoduchým klasifikačným stromom dosahuje Random Forest lepšiu vyváženosť medzi presnosťou a citlivosťou, najmä pri identifikácii drahých nehnuteľností.
Model Random Forest dosahuje presnosť 84 % a F1 skóre 0.62, čo predstavuje citeľné zlepšenie oproti jednoduchému klasifikačnému stromu. Vyššia hodnota F1 skóre naznačuje lepšiu rovnováhu medzi presnosťou a citlivosťou pri identifikácii drahých nehnuteľností. Výsledky potvrdzujú, že využitie súborových metód vedie k stabilnejšiemu a robustnejšiemu klasifikačnému výkonu.
autoplot(roc_rf) +labs(title ="ROC – Random Forest (klasifikácia)")
ROC krivka sa nachádza výrazne nad diagonálou náhodného klasifikátora a dosahuje hodnotu AUC ≈ 0.92, čo poukazuje na veľmi dobrú schopnosť modelu rozlišovať medzi triedami „drahá“ a „lacná“ nehnuteľnosť. Vysoká hodnota AUC potvrdzuje, že Random Forest dokáže spoľahlivo priraďovať vyššie pravdepodobnosti správnej triede naprieč rôznymi rozhodovacími prahmi, a patrí tak medzi najvýkonnejšie použité klasifikačné metódy.
Graf zobrazuje relatívnu dôležitosť jednotlivých premenných pri klasifikácii nehnuteľností pomocou metódy Random Forest. Najväčší vplyv na rozhodovanie modelu má kvalita nehnuteľnosti, nasledovaná rozlohou a mierou kriminality v okolí. Tieto premenné majú dominantný vplyv na to, či je nehnuteľnosť klasifikovaná ako drahá alebo lacná.
Naopak, faktory ako počet izieb, vek nehnuteľnosti alebo dostupnosť parkov majú v porovnaní s ostatnými premennými len marginálny vplyv. Výsledky tak potvrdzujú, že model sa pri rozhodovaní opiera najmä o charakteristiky priamo súvisiace s kvalitou a atraktivitou lokality.
cls_res |>pivot_longer(cols =c(AUC, Accuracy, F1), names_to ="metric", values_to ="value") |>ggplot(aes(x =reorder(model, value), y = value)) +geom_col(alpha =0.9) +coord_flip() +facet_wrap(~metric, scales ="free") +labs(title ="Klasifikácia: porovnanie strom vs RF", x =NULL, y =NULL)
Z porovnania metrík je zrejmé, že Random Forest výrazne prekonáva jednoduchý klasifikačný strom vo všetkých hodnotených ukazovateľoch. Dosahuje vyššiu presnosť (Accuracy ≈ 0.84 vs. 0.78), vyššie F1 skóre aj výrazne lepšiu hodnotu AUC (0.92 oproti 0.81), čo znamená lepšiu schopnosť rozlišovať medzi triedami „drahá“ a „lacná“ nehnuteľnosť.
9Diskusia výsledkov
V práci sme analyzovali správanie stromových modelov v dvoch rôznych úlohách – regresii (predikcia ceny nehnuteľnosti) a klasifikácii (drahá vs. lacná nehnuteľnosť). Táto kombinácia umožnila porovnať vlastnosti jednotlivých metód v rôznych typoch úloh.
V regresnej úlohe sa ukázalo, že jednoduchý rozhodovací strom síce poskytuje dobrú interpretovateľnosť, avšak trpí vyššou varianciou a výrazným rizikom preučenia. Prerezávanie stromu v tomto prípade neviedlo k zlepšeniu testovacej chyby, čo naznačuje, že pôvodný strom už bol z hľadiska generalizácie relatívne stabilný; výraznejšie zlepšenie však priniesli až súborové metódy.
Bagging výrazne stabilizoval výsledky tým, že redukoval variabilitu medzi jednotlivými stromami a poskytol spoľahlivejší odhad pomocou OOB chyby.
Random Forest dosiahol ešte lepšie výsledky vďaka zníženej korelácii medzi stromami, čo sa prejavilo nižšou chybou aj lepšou generalizáciou na testovacích dátach.
V regresnej úlohe dosahoval najlepšie výsledky boosting, ktorý dokázal zachytiť komplexné nelineárne vzťahy medzi premennými. Jeho nevýhodou však ostáva citlivosť na nastavenie hyperparametrov a potenciálne preučenie pri príliš dlhom učení.
V klasifikačnej úlohe (rozlíšenie „drahá“ vs. „lacná“ nehnuteľnosť) sa potvrdilo, že:
klasifikačný strom poskytuje interpretovateľné rozhodnutia, ale má nižšiu presnosť,
Random Forest dosahuje vyššiu presnosť, lepšiu AUC a stabilnejšie výsledky,
ROC krivky a confusion matrixe umožňujú detailnejšie porovnanie správania modelov.
BART model v regresnej úlohe navyše poskytol pravdepodobnostnú interpretáciu výstupov a intervaly spoľahlivosti, čo je významná výhoda pri rozhodovaní v praxi.
10Záver
V tomto projekte bola analyzovaná úloha predikcie cien nehnuteľností pomocou rozhodovacích stromov a ich rozšírení. Na simulovaných dátach sme demonštrovali použitie stromových metód v regresii aj klasifikácii.
Porovnali sme jednoduchý rozhodovací strom, bagging, random forest, boosting a BART, pričom každá metóda mala svoje výhody z hľadiska presnosti, interpretovateľnosti a stability.
Výsledky ukázali, že zatiaľ čo jednoduché stromy sú dobre interpretovateľné, súborové metódy dosahujú výrazne lepšiu generalizáciu. Random Forest a boosting poskytli najlepší kompromis medzi presnosťou a robustnosťou, zatiaľ čo BART umožnil kvantifikovať neistotu predikcií.
Projekt tak demonštruje praktické využitie stromových metód v regresných aj klasifikačných úlohách a ilustruje ich silné aj slabé stránky v kontexte analýzy reálnych dát.