XGBoost Regressor : Ev Fiyatı Tahminleme
Merhabalar, yoğun geçen bir haftanın son gününde iyi akşamlar dileyerek yazıma başlamak istiyorum .
Dijital çağın petrolü olarak bilinen veri ve veriyi doğru işleyerek, anlamlı bilgiler çıkartarak insanların faydasına kullanılmak üzere ortaya çıkan bir bilim dalı olan veri bilimi hayatımızın çoğu alanında yeni normaller yaratmaya devam etmekte. Öyle ki bundan 10 yıl öncesinde herhangi bir şekilde bir lig kupası müsabakasının henüz oynanmadan kimin kazanacağını bilebileceğimiz çok zor bir durum idi yada başka bir örnek olarak yıllar önce bir bankaya kredi başvurusu için başvuru yaptığımızda çeşitli prosedürleri yerine getirmemiz gerekli idi. Ancak günümüzde spor endüstrisinde veri bilimi ve yapay zeka algoritmaları ile müsabakanın sonucu tahmin edilebilmekte ve yine çeşitli algoritmalar kullanılarak kredi başvurusu yapan bir banka müşterisinin almış olduğu krediyi geri ödeyip ödeyemeceği doğru şekilde tahmin edilerek olası para kayıplarının önüne geçilebilinmekte.
Bunun yanı sıra makine öğrenmesi kullanılarak sahip olduğumuz mali varlıkların da değerleri bilinebilmekte. Bir evimiz olduğunu düşünelim ve bunu satmak istediğimizi düşünelim, böyle bir durumda evimiz ile benzer özelliklere sahip önceki örnekleri hızlı bir şekilde karşılaştırarak evimizin finansal değerini bir model ile bulabiliriz.
Bu çalışmamızda yukarıdaki paragrafta da özet olarak anlatıldığı üzere ev fiyatlarını sahip olduğu özelliklere göre(Yerleşim alanının metrekare ölçüsü, oda sayısı, ısınma tipi , evin garajının metrekare ölçüsü ve caddeye olan uzaklığı vb.) fiyatını belirleyen bir makine öğrenmesi modeli kuracağız. Bu çalışma için yüksek tahmin gücü sağlayan XGBoost Regressor algoritmasından faydalanıyor olacağız. Daha fazla uzatmadan çalışmamızın adımlarına geçelim.
İlk aşama olarak modelde kullanacak olduğumuz kütüphaneleri import edelim.
Sonrasında çalışmamızda kullanacak olduğumuz veri setlerini import edelim. Veri setleri import edildikten sonra concat işlemi ile birleştirelecek ve sonrasında bir kopyasını alacağız.
Veri setimizi import edip, birleştirdikten sonra veri setine ait betimsel istatistiklere bakalım.
Görüleceği üzere çok fazla değişkene(Feature) sahibiz. 2919 adet de gözlemimiz olduğunu görüyoruz. Bu aşama sonrasında her bir gözlem için otomatik olarak gelmiş olan ID kolonunu herhangi bir etkisi olmadığı için drop ediyoruz ve sonrasında hedef değişkenimiz olan(Target Feature) SalePrice değişkenimizin dağılım grafiğini çiziyoruz.
Ev fiyatlarının dağılımına baktıktan sonra, veri manipülasyonu aşamasına geçiyoruz. İlk olarak eksik değerler için işlemler yapıyoruz.
Görselde görüldüğü üzere “Alley” , “PoolQC”, “Fence”, “FireplaceQu” ve “MiscFeature” değişkenleri en fazla eksik gözlemlerin yer aldığı değişkenlerdir. Eksik gözlemleri bu şekilde görsel hale getirdikten sonra hangi değişkenin yüzde kaçı boş? sorusuna cevap verebilmek adına bir barplot ile görselleştirme yaparak değişkenlerin eksik gözlem oranlarını buluyoruz. Burada referans olarak %15 değerini alıyoruz.
Referans değerinden fazla boş gözlem miktarına sahip olan değişkenlerin yukarıdaki matriste de görüleceği üzere “Alley” , “PoolQC”, “Fence”, “FireplaceQu” ve “MiscFeature” değişkenleri olduğunu görebiliriz.
Sonrasında, boş gözlem sayısı oranı toplam gözlem sayısının %20'sinden fazla olanları veri setinden drop ediyoruz. Ve kategorik değişkenler haricindeki değişkenler için gözlem sayısı 200'ün altında olanların boş gözlemlerini medyanları ile dolduruyoruz.
Görselde görüldüğü üzere “LotFrontage” ve “SalePrice” değişkenleri için hala fazlası ile eksik gözlem olduğu görülmekte. Sale Price değişkeni target feature olduğu için bir işlem yapmamıza gerek yok ancak diğer sayısal değişkenimiz için doldurma işlemimizi tekrarlamamız gerekli . Bunun için de ilgili değişkenimiz yani “LotFrontage” değişkenimiz ile en fazla korelasyona sahip olan değişkenleri tablo ile görselleştiriyoruz ve gruplama işlemi ile doldurma işlemi yapıyoruz.
Burada LotFrontage değişkeni ile en fazla korelasyona sahip olan LotArea 1stFlrSF ve MSSubClass değişkenlerine ait boş değerleri LotFontage değişkeni değerine göre gruplayıp grubun medyanı ile dolduruyoruz.
Tekrardan doldurma işleminden sonra görüldüğü üzere LotFrontage değişkenine ait boş değer sorunu çözüldü.
Boş değer sorununu çözdükten sonra, sayısal değere sahip değişkenler arasındaki ilişkiyi görsel hale getirmek için heatmap kullanıyoruz. Burada, hedef değişkenimiz ile en fazla korelasyona sahip sayısal değişkenleri görselin en alt satırında görebiliriz.
Görselleştirmiş olduğumuz bu heatmap, nümerik değerler diğer değişkenlerin SalePrice ile ilişkisinin gücünü ve yönünü göstermekte. Bu değerleri büyükten küçüğe doğru sıralayarak sınır değerlere göre karşılaştırıyoruz. Bizim burada belirlediğimiz sözde sınır değerler + 0.5 ile -0.5 değerleridir.
Belirlemiş olduğumuz +0.5 değerine eşit ve bu değerden yüksek değişken sayısını görelim.
Bu görselleştirmeden sonra eşik değerini aşan 30 değişkenin hedef değişkenimiz ile arasındaki ilişkiyi gösteren pairplot görselleştirmesini yapalım.
Eksik değerlere ait sorunu çözdüğümüze göre bir sonraki aşamada aykırı gözlem saptaması yapabiliriz. Bu aşamada veri setimizdeki
- ‘BsmtFinSF1’
- ‘TotalBsmtSF’
- ‘GrLivArea’
- ‘1stFlrSF’
- ‘LotFrontage’
- ‘LotArea’
- ‘GarageArea’
Değişkenleri için aykırı gözlemleri saptıyoruz ve bunları NaN değişken olarak değiştiriyoruz. Yani yukarıda yapmış olduğumuz işlemlerden olan drop değişkenini biraz teferruatlı şekilde yapmış oluyoruz.
Aykırı gözlemleri belirledikten sonra yukarıda yapmış olduğumuz gibi yeniden pairplot kullanarak yeniden görselleştirme yapıyoruz.
Sayısal değişkenlerimize ait işlemlerden sonra, sıra kategorik değişkenler ve bu değişkenler üzerindeki işlemlere geldi. İlk olarak kategorik değişkenlerimizde boş değer olup olmadığını kontrol edelim.
Kategorik değişkenlerdeki boş gözlemleri, bu değişkenlerde en fazla tekrar eden değerlerle yani serinin modu ile dolduruyoruz.
Bu işlemden sonra kategorik değişkenlerin hedef değişkenimiz ile ilişkisini daha önce yapmış olduğumuz gibi korelasyon ilişkisine bağlı olarak görselleştireceğiz. Bu işlem için Cramer’in V testinden faydalanıyor olacağız. Cramer V test’ 1946 yılında Harald Cramer tarafından yayınlanan ve temeli Pearson’ın ki-kare istatistiğine dayanan bir ölçüdür. Cramer’s V, iki kategorik değişkenin ne kadar güçlü bir şekilde ilişkilendirildiğini gösteren 0 ile 1 arasında bir sayıdır.
2 kategorik değişkenin ilişkili olup olmadığını bilmek istersek, ilk seçeneğimiz ki-kare bağımsızlık testidir. Sıfıra yakın bir p değeri, bazı popülasyonlarda değişkenlerimizin tamamen ilişkisiz olma ihtimalinin çok düşük olduğu anlamına gelir. Ancak bu, değişkenlerin güçlü bir şekilde ilişkili olduğu anlamına gelmez; büyük bir örneklem boyutunda zayıf bir ilişki de p = 0.000 ile sonuçlanabilir.
Cramers V hesabını yapmak üzere fonksiyonumuzu tanımladık, sonrasında ise kategorik değişkenlerimizi seçerek hedef değişkenimiz ile aralarındaki korelasyon düzeyini göstermek için syntaxlarımızı yazalım.
Kategorik değişkenlerimizi seçtikten sonra ve sonrasında da bu değişkenler için tanımlamış olduğumuz cramers_v fonksiyonunu çalıştırdığımızda korelasyon ilişkilerini gösteren aşağıdaki görseli elde etmiş oluyoruz.
Görüldüğü üzere eşik değerimizi aşan ve hedef değişkenimize etkisi %15'den fazla olan 17 değişken vardır. Kategorik değişkenlerimiz ile hedef değişkenimiz arasındaki ilişkiyi de gözlemledikten sonra seçmiş olduğumuz sayısal ve kategorik değişkenleri de concat işlemi ile bir araya getirip modelimize hazır hale getiriyoruz.
Verilerimizi makine öğrenmesi modeline işlemeden önce veri ön işleme işlemlerini yapmamız gerekir. İlk olarak dummy_feature olarak da bilebileceğimiz etkisiz değişkenler ataması yapıyoruz ya da diğer bir isimle kukla değişken ataması. Kukla değişken oluşturmak, etkisine bakmak istediğimiz grubu 1, diğer grupları 0 a eşitleyerek etkisine bakmak istediğimiz grubun etkisini ölçmektir.
Hangi değişkende hangi grup 1, hangileri 0 olarak kodlandığını rapor ettiğimiz tabloda belirtmemiz gerekir. Böylece okuyucu da hangi kukla değişkenin hangi grubun etkisini ölçmek için kullanıldığını anlayabilir.
Sonraki aşamada hedef değişkenimiz olan SalePrice değişkeninin boş olarak yer aldığı gözlemlerin SalePrice sütununu sütun bazında drop ederek yeni bir train isminde değişkene atama yapıyoruz . Aynı şekilde SalePrice’ın boş olmadığı gözlemleri de train olarak atama yapıyoruz . Artık makine öğrenmesi modelimizde sorun yaşamamak için herhangi bir etkisi kalmayan eksik değerler var ise bunları veri setimizden drop edelim.
Modelimiz için veri ön işleme işlemlerini de bitirdik. Artık modelimizi kurabiliriz. İlk olarak veri setimizi test ve train olarak split edelim.
Modelimizi kuralım ve eğitelim:
Modelimizi eğittik. Sonraki aşamada modelin hata oranlarını inceleyelim.
Yukarıdaki görselde görülen RMSE değeri, modelimizin 23,543 dolar hata ile doğru tahmin ettiğini göstermektedir. Veri setimizdeki evlerin ortalama fiyatı 180,932 dolar olduğunu göz önünde bulundurduğumuzda %13 hata oranı ile doğru tahmin edebilen bir model kurmuş olduk.
Modelimizi kurduktan sonra daha iyi sonuçlar verebilmesi için optimizasyon işlemi yapalım bunun için modelimize bazı parametreler verelim.
Görülen en iyi parametreleri de modele girdi olarak verdikten sonra yeniden modeli eğitiyoruz ve elde etmiş olduğumuz sonuç:
Görüleceği üzere hatamız 22,521 dolara düştü. Hata oranımız ise, %12'ye geriledi. Artik ev fiyatlarını %88 doğrulukta tahmin edebiliyoruz. Son olarak sonuç değerine etki eden değişkenlerin etki düzeylerini görebilmek adına “Feature Importance” bar plotu çizelim.
Bir yazımızın daha sonuna geldik. Umarım keyifli bir zaman olmuştur. Son olarak bu makalenin yazımında danışmanım olarak bana yol gösteren değerli hocam Alparslan Mesri’ye katkılarından dolayı teşekkürlerimi sunuyorum.