Karar Ağaçlarında Öznitelik Önem Sıralaması
Karar ağaçları doğası gereği açıklanabilen algoritmalardır. Transparanlığın ötesinde özniteliklere ait önem sıralaması (feature importance) yapay öğrenme ve makine öğreniminde geliştirilmiş modellerin anlaşılması için kullanılan yaygın bir yöntemdir. Hatırlayacağınız üzere lineer regresyon denklemindeki katsayılar doğrudan olmamakla birlikte hangi öznitelik daha önemli olduğu hakkında ipuçları içermekteydi. Ancak lineer regresyon ile lineer problemleri modelleyebileceğimizden günlük hayatta baş etmek durumunda kaldığımız türden doğrusal olmayan problemler karşısında algoritmanın çokça söyleceği bir şey olmuyordu. Öte yandan kendisi bir non-lineer model olan karar ağaçlarından hesaplanacak özniteliklerin önem sırası verilen kararı anlamanın ötesinde doğrusal olmayan modelleri anlamamızı da sağlamaktadır.
Karar ağacının yaratılması
Aşağıda paylaşılan veri seti için bir karar ağacı inşa edeceğiz. Veri madenciliği derslerinde çokça gördüğünüz hava, sıcaklık, nem ve rüzgar özniteliklerine göre golf oynama kararlarını içeren ufak bir veri seti.
Hava Durumu | Sıcaklık | Nem | Rüzgar | Karar |
1 | 1 | 1 | 1 | Hayır |
1 | 1 | 1 | 2 | Hayır |
2 | 1 | 1 | 1 | Evet |
3 | 2 | 1 | 1 | Evet |
3 | 3 | 2 | 1 | Evet |
3 | 3 | 2 | 2 | Hayır |
2 | 3 | 2 | 2 | Evet |
1 | 2 | 1 | 1 | Hayır |
1 | 3 | 2 | 1 | Evet |
3 | 2 | 2 | 1 | Evet |
1 | 2 | 2 | 2 | Evet |
2 | 2 | 1 | 2 | Evet |
2 | 1 | 2 | 1 | Evet |
3 | 2 | 1 | 2 | Hayır |
Kullanacağınız karar ağacı algoritmasına göre farklı metrikler uygulanarak karar kurallarının çıkarılması gerekiyor. Örneğin CHAID kullanarak bir karar ağacı kuracaksanız chi-square, ID3 ve C4.5 kullanacaksanız entropi, CART kullanacaksanız GINI indeks kullanmanız gerekecek. Paylaştığım linkler üzerinden bu algoritmalar ile adım adım karar ağaçları nasıl kurulur inceleyebilirsiniz. Bu yazıda bu adımı atlayarak doğrudan inşa edilmiş karar ağacı üzerinden konuşacağız.
Karar ağacı C4.5 ile inşa edildiği için her bir karar noktasında özniteliğe ait entropi değerini ve eğitim setinde o koşulu sağlayan kaç örneğin olduğunu not edilmiş.
Karar ağacından kuralların çıkarılması
İnşa edilmiş karar ağacındaki her bir karar noktasını basit bir eğer cümlesi ile ifade etmemiz münkün. Bu yazılımcıların daha kolay okuyabileceği bir gösterim. Python Chefboost paketini kullanarak veri setini eğer cümlelerinden oluşan bir karar ağacına bir kaç satır kod ile dönüştürebiliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
def findDecision(Outlook, Temperature, Humidity, Wind): if Humidity>1: if Wind<=1: return 'Yes' elif Wind>1: if Outlook>1: return 'Yes' elif Outlook<=1: return 'Yes' elif Humidity<=1: if Outlook>1: if Wind>1: return 'Yes' elif Wind<=1: return 'Yes' elif Outlook<=1: return 'No' |
Öznitelik önem sıralaması formülü
Her bir özniteliğin ne kadar önemli olduğunu hesaplamak için karar noktasının kendisine ve o karar noktasından türemiş alt düğümlerine (child node) bakacağız. C4.5 yerine CART algoritmasını kullanıyor olsaydık formülde entropi yerine GINI indeks kullanmamız gerekecekti.
Özniteliğin önemi = karar noktasına ait entropi * sağlayan örnek sayısı – sol alt düğüme ait entropi * sol alt düğümde sağlanan örnek sayısı – sağ alt düğüme ait entropi * sağ alt düğümde sağlanan örnek sayısı
Bazı kaynaklar bu formülü farklı bir gösterimle ifade etmektedir ancak hesaplamanın sonunda normalize edilmiş değerlerde ikisi de aynı sonucu vermektedir.
Burada dikkat edilmesi gereken husus bir öznitelik karar ağacında birden fazla yerde karar noktası olarak bulunabilir. Örneğin hava durumu 2. ve 3. seviyede olacak şekilde 2 defa yer almış. Bu durumda her iki karar noktası için yukarıdaki formülü uygulayıp toplamı hava durumuna ait önem değeri olacak.
Bundan sonrasında Öznitelik Önemi için ÖÖ kısaltmasını kullanacağız.
Karar Ağacının 1. Seviyesi
ÖÖ(Nem | 1. seviye) = 14x 0.940 – 7×0.985 – 7×0.591 = 2.121
Karar Ağacının 2. Seviyesi
ÖÖ(Hava Durumu|2. seviye) = 7×0.985 – 4×0.811 = 3.651
ÖÖ(Rüzgar|2. seviye) = 7×0.591 – 3×0.918 = 1.390
Görüldüğü üzere 2. seviyedeki hava durumu ve rüzgar karar noktalarının sağ alt düğümleri doğrudan kararı simgelemektedir. Doğrudan kararı simgeleyen yerlere ait entropi değerleri 0 olduğu için sağ alt düğüme ait bir hesap bulunmamaktadır.
Karar Ağacının 3. Seviyesi
ÖÖ(Rüzgar| 3. seviye) = 4×0.811 = 3.244
ÖÖ(Hava Durumu|3.seviye) = 3×0.918 = 2.754
Sonuçlar
ÖÖ(Nem) = ÖÖ(Nem|1.seviye) = 2.121
ÖÖ(Hava Durumu) = ÖÖ(Hava Durumu|2. seviye) + ÖÖ(Hava Durumu|3.seviye) = 3.651 + 2.754 = 6.405
ÖÖ(Rüzgar) = ÖÖ(Rüzgar|2. seviye) + ÖÖ(Rüzgar|3.seviye) = 1.390 + 3.244 = 4.634
Normalizasyon
Özniteliklere ait önem değerlerinin toplamına bölersek toplamları 1 olacak şekilde normalize etmiş oluruz. Bu yüzdesel olarak ifade için de daha anlaşılır olacaktır.
ÖÖ(Toplam) = ÖÖ(Nem) + ÖÖ(Hava Durumu) + ÖÖ(Rüzgar) = 2.121 + 6.405 + 4.634 = 13.16
ÖÖ(Nem)’ = ÖÖ(Nem) / ÖÖ(Toplam) = 2.121 / 13.16 = 0.16
ÖÖ(Hava Durumu)’ = ÖÖ(Hava Durumu) / ÖÖ(Toplam) = 6.405 / 13.16 = 0.48
ÖÖ(Rüzgar)’ = ÖÖ(Rüzgar) / ÖÖ(Toplam) = 4.634 / 13.16 = 0.35
Dolayısıyla hava durumu en önemli özniteliğiymizken ardından rüzgar sonra da nem gelmektedir.
Bagging ve Boosting
Özniteliklerin önem sırasını tek bir karar ağacı üzerinde gösterdik. Peki rastgele ormanlar ya da GBM kullanıyor olsaydık? Her ikisinde de birden fazla karar ağacı arka planda oluşturulmaktadır. Dolayısıyla her bir ağacın öznitelik önemlerinin toplamları bize global öznitelik önemini verecektir.
Bu yazıda karar ağaçları kullanarak elle nasıl özniteliklerin önemini çıkarabileceğimizi inceledik. Gördüğünüz gibi karar ağaçları kullanarak dizayn ettiğimiz yapılarda alınan karar ve aksiyonları okuyup anlayabiliyorken öznitelik önemini çıkararak büyük resmi de okuyup anlayabiliyor hale geliyoruz.
Son olarak Python Chefboost paketi ile aşağıdaki şekilde bir kaç satır kod ile öznitelik önemini çıkarabiliyoruz.
Bu yazı Feature Importance in Decision Trees yazısından Türkçe’ye çevrilmiştir.