Yapay Öğrenme Modelleri İçin Öznitelik Önemi
Açıklanabilir yapay zeka ve yapay öğrenme yorumlanabilirliği (interpretability) günümüzde veri dünyasının en öne çıkan konularından. Yapay zeka araştırmacıları her ne kadar öncelikle derin öğrenme ve gradyan arttırma yöntemleri ile modelleme eğiliminde olsalar da lineer regresyon algoritması halen en güçlü açıklanabilirliği sunmaktadır. Derin öğrenme gibi ileri seviye algoritmalar çok başarılı sonuçlar üretse de tek başlarına açıklanabilirlikten uzak birer kara kutudan ibarettir. Ancak eğitim setinizin öznitelikleri (feature) ve derin öğrenme algoritmanızın tahminleriyle bir lineer regresyon modeli kurarsanız modeliniz açıklanabilir olacaktır. Buradaki hileyi lineer regresyon modelinizin aşırı öğrenmesi (overfitting) şeklinde düşünebilirsiniz. Öznitelik önemi (feature importance), öznitelik seçimi (feature seletion) adımında size yardımcı olacaktır. Daha az önemli öznitelikleri modelinize hiç beslemeyerek daha hızlı bir şekilde eğitimin gerçekleşmesini sağlayabilirsiniz.
Lineer regresyon
Basit lineer regresyon denklemini hatırlayalım.
y = β0 + β1X1 + β2X2 + … + βPXP
Bu denklemdeki X değerleri girdilerimiz iken beta değerleri katsayıları ifade etmektedir. Örneğin tek bir girdimiz olsaydı denklemimiz y = β0 + β1X1 şeklinde olacaktı. Burada y değerinin gelir olduğunu X1 girdisinin de eğitim süresi olduğunu varsayalım. Bu durumda β1 eğitim süresinin gelir üzerindeki etkisini belirtecekti. İşte bu denklemdeki beta katsayıları bize özniteliklerin önemine dair ipuçları verecek.
Problem: ev fiyatlarının tahmin edilmesi
Ev fiyatı tahmini veri seti için bir lineer regresyon modeli kuralım. Evin büyüklüğü gibi bazı özniteliklere bağlı olarak fiyatını tahmin etmeyi amaçlıyoruz.
1 2 3 4 5 6 |
import pandas as pd df = pd.read_csv("kc_house_data.csv") |
Her ne kadar girdi seti geniş olsa da öznitelik öneminin kavranması için veri setini daha basit tutalım. Oda sayısı, yüz ölçümü ve inşa yılı değerleri üzerinden ev fiyatını tahmin etmeye çalışalım.
1 2 3 4 5 6 |
x = df[["bedrooms", "sqft_living", "yr_built"]] y = df["price"] |
Model
Modelimizi bu veri seti için kurabiliriz. Scikit-learn’in lineer regresyon için oldukça basit bir arayüz sunmakta.
1 2 3 4 5 6 7 |
from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(x, y) |
Model başarısı
Kurulan lineer regresyon modeli regressor objesinde saklanmaktır. Bu objenin aynı zamanda predict fonksiyonu ile veri setine ait tahminleri yaptırabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
predictions = regressor.predict(x) mae = 0 for i in range(0, len(predictions)): prediction = predictions[i] actual = y.iloc[i] error = abs(actual - prediction) mae = mae + error mae = mae / len(predictions) |
Lineer regresyon modeli %30 hata ile eğitim setini öğrenmiş durumda. Bu yazıdaki amacımız özniteliklerin önemini açıklamak olduğu için en iyi modeli kurma gibi bir niyetimiz bulunmuyor. Dolayısıyla bu model ile yolumuza devam edebiliriz.
mae: 163801.15090700495
mean: 540088.1417665294
mae / mean ratio: 30.328596064198223
Katsayılar
Lineer regresyon denklemindeki beta katsayılarına ihtiyacımız bulunuyor.
1 2 3 4 5 6 7 |
intercept = regressor.intercept_ features = pd.DataFrame(regressor.coef_, x.columns, columns=['coefficient']) features.head() |
Katsayılardaki pozitif ya da negatif işaretleri doğru ya da ters orantılı olduğunu belirtmektedir. Korelasyon katsayısında nasıl +1 doğru yönde kuvvetli korelasyon -1 ise ters yönde kuvvetli korelasyon ise burada da yönü belirtmektedir. Özniteliklerin önemini karşılaştırmak için mutlak değerleri ile ilerleyebiliriz.
1 2 3 4 5 |
features.coefficient = features.coefficient.abs() |
Katsayıların karşılaştırılması
Katsayıları mukayese edersek oda sayısı > inşa yılı > yüz ölçümü sıralamasını elde ediyoruz. Peki özniteliklerinde önem sırası bu sıra ile aynıdır diyebilir miyiz? Cevap tabi ki de hayırdır.
Lineer regresyon denklemine yeniden bir göz atalım: y = β0 + β1X1 + β2X2 + β3X3
Tahmin etmeye çalıştığımız ev fiyatı olan y’nin birimi dolardır. Denklemin sağ tarafının birimi de bu durumda dolar olacaktır. Dolayısıyla β0, β1X1, β2X2, … , βPXP bunların her birinin birimi de dolar olmalı. X1 girdisinin oda sayısı olduğunu biliyoruz. β1X1 çarpımının birimi dolar ise bu durumda β1 katsayısının birimi dolar / oda sayısı olmalıdır. Benzer şekilde β2 katsayısının birimi dolar / metrekare, β3 katsayısının birimi de dolar / yıl olmalıdır.
Peki farklı birimleri olan β1, β2, β3 katsayılarını karşılaştırabilir miyiz? Bu elmalarla armutları karşılaştırmaya benzer.
Standart sapma
Standart sapma farklı birimlerdeki bu katsayıları aynı birime dönüştürmemizde bize yardım edebilir. Standart sapma formülünü hatırlayalım.
σ = √[Σ(xi – x_avg)2/ (n – 1)]
Bu formülü yüz ölçümü için uyguladığımızı düşünelim. xi yerine her bir yüz ölçümü değerini aktaracağız. Bunu birimi metrekaredir. Bundan yüz ölçümlerinin ortalamasını çıkarmamız bekleniliyor. Dolayısıyla x_avg’nin de birimi metrekare olacaktır. Parantezin içersinin birimi metrekare iken bunun karesini aldığımız zaman payın birimi metrekare * metrekate olacak. Paydadaki n değerinin bir birimi bulunmuyor. metrekare*metrekare’yi birimsiz bir sayıya bölersek köşeli parentezin içerisini elde ediyoruz. Bunun da karekökünü alırsak sigma’nın birimi metrekare olacak. Yani özniteliğin biriminin tam kendisi.
Katsayıları aynı birime dönüştürme
β1 katsayısının birimi dolar / oda sayısı idi. Bunu X1‘in standart sapması ile çarparsak birim dolara dönüşecektir. β2 ve β3 katsayılarını da ilgili özniteliklerin standart sapmaları ile çarparsak hepsinin birimi dolar olacaktır. Bu da artık karşılaştırabileceğimiz anlamına geliyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
stdevs = [] for i in x.columns: stdev = df[i].std() stdevs.append(stdev) import numpy as np features["stdev"] = np.array(stdevs).reshape(-1,1) features["importance"] = features["coefficient"] * features["stdev"] features['importance_normalized'] = 100*features['importance'] / features['importance'].max() |
Görüldüğü gibi katsayı değerlerinin sıralamasından farklı olarak en önemli öznitelik yüz ölçümü, sonrasında inşa yılı, sonrasında da oda sayısı çıkmaktadır. Katsayıların sıralaması ise tam tersi durumdaydı.
Önem değerlerini grafiksel olarak göstermek daha anlaşılır kılacaktır.
1 2 3 4 5 6 |
import matplotlib.pyplot as plt plt.barh(features.index, features.importance_normalized) |
Özetle beta katsayılarını doğrudan karşılaştırmak sizi yanlışa yönlendirebilir.
Bu yazımızda öznitelik önemi kavramını basit bir lineer regresyon örneği üzerinde gösterdik. Her ne kadar lineer regresyonu günlük hayat problemleri için kullanmasak da algoritma bize kara kutu modellerin açıklanmasında yardımcı olmaktadır.
Öznitelik önemi kavramını video eşliğinde adım adım uygulamak isterseniz aşağıdaki videoya göz atmanızda fayda olacaktır.
Bu yazı “A Gentle Introduction to Feature Importance in Machine Learning” yazısından Türkçe’ye çevrilmiştir.