Lojistik regresyon gizli katmansız çok basit sinir ağı modelidir.
Burada, benzer lojistik regresyon modelini Scikit-learn ve Keras paketleri ile inşa edeceğiz. Scikit-learn LogisticRegression() sınıfı, lojistik regresyon modeli oluşturmak için en iyi opsiyondur. Fakat, sinir ağları mantığı ile Keras’ta benzer modeli oluşturabiliriz çünkü bir lojistik regresyon modeli teknik olarak ANN olarak olarak düşünülebilir.
Bu bölümün ana amaçları :
- Aynı lojistik regresyon modelinin performansını iki farklı kütüphane kullanarak kıyaslamak
- Keras sequential model oluşturmak
- Keras sınıflarını import alışkanları
- Keras sequential modelinin summary(), compile(), fit() ve evaluate() metotlarını kullanma
- Model eğitimi ve değerlendirmesinde her epoch’ta loss ve accuracy skorlarını çizmek
Bu bölümün sonunda, sinir ağları ile lojistik regresyon modeli oluşturup, onun performansını hem görsel hem de nümerik teknikler kullanarak değerlendireceğiz.
Kullandığımız data hakkında :
Burada, Kasım 1995’de oluşturulan Scikit-learn breast cancer Wisconsin veri setini kullanıyoruz.
Veri seti kaynağı : orjinal veri setini https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic) adresinden indirebilirsiniz.
import pandas as pd from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() df = pd.DataFrame(cancer.data, columns=cancer.feature_names) |
df.head()
Veri seti 569 gözlem değerine / satıra sahiptir ve 30 değişkene/özelliğe. Target kolonu buraya dahil edilmemiştir. Target kolonu iki sınıfı yansıtan 0 ve 1 değerlerinden oluşur.
df.isnull().sum() 0 sonucunu döndürür. Özellikler içinde eksik değer yok. Özellik bazında bakacaksak bu şekilde. Eğer toplam içinde var mı yok mu bakmak istersek ilave bir sum() eklemek gerekir. |
Boş olan özelliklik yok ve bunların tamamının toplamı 0 çıkıyor bu durumu da doğruluyor.
X ve y değerlerini eğitim ve test setleri yapalım.
X : feature matrix yani özellikler ve onların gözlem değerleri
y : target vektörü
X=df y=pd.Series(cancer.target) |
Şimdi, eğitim ve test setlerini oluşturuyoruz. Tüm verinin %20’sini test seti olarak ayarlıyoruz.
from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.20, shuffle=True, random_state=2) |
Veri setini karıştırıyoruz. %20’sini de test veri seti için ayırıyoruz.
Kodda random_state’i belirtmezseniz, kodunuzu her çalıştırdığınızda yeni bir rastgele değer üretilir ve “eğitim ve test veri kümeleri” her seferinde farklı değerlere sahip olur.
Scikit-learn ile Lojistik regresyon modeli oluşturalım
Scikit-learn LogisticRegression() sınıfını kullanarak breast cancer veri seti üzerinde lojistik regresyon modeli kuracağız. Modelimizi metrikler kullanarak test verileriyle değerlendireceğiz.
# lojistik regresyon modelini başlat from sklearn.linear_model import LogisticRegression log_reg_model = LogisticRegression(max_iter=2500, random_state=42) # Modeli eğit (train/fit) log_reg_model.fit(X_train, y_train) # tahmin yap y_pred = log_reg_model.predict(X_test) # Predictions y_true = y_test # True values # Model değerlendirmesi from sklearn.metrics import accuracy_score from sklearn.metrics import precision_recall_fscore_support import numpy as np print(“Accuracy:”, np.round(accuracy_score(y_true, y_pred), 2)) precision, recall, fscore, _ = precision_recall_fscore_support(y_true, y_pred, average=’binary’) print(“Precision:”, np.round(precision, 2)) print(“Recall:”, np.round(recall, 2)) print(“F-Score:”, np.round(fscore, 2)) |
Keras’ta sinir ağı ile benzer lojistik regresyon modelini İnşa edelim.
Adım 1 : sinir ağı mimarisini tanımla
Burada, sequential model oluşturuyoruz. Sıralı bir model (sequential model), katman yığınlarından başka bir şey değildir. Giriş, Gizli ve Çıkış katmanları modelde sırasıyla yığınlanır. Bir Yapay Sinir Ağı (YSA-ANN) türüdür.
Adım 2 : Keras Sequential() sınıfının bir modelini oluşturalım
from keras.models import Sequential ANN_model = Sequential() |
Adım 3 : Katmanları sequential modele ekle
Keras Sequential() modeli oluşturulduktan sonra, add() metodu kullanarak mevcut modele katmanlar eklenir. Burada, açık bir şekilde giriş katmanını tanımlıyoruz. Bu işlemi yaparken Keras’ın InputLayer() sınıfını kullanıyoruz. Çıkış katmanı Dense() sınıfı kullanılarak eklenir. Her ikisi de tam bağlı katmanlardır (fully connected)(dense).
Çıkış katmanında sigmoid aktivasyon fonksiyonu kullanılır.
from tensorflow.keras.layers import InputLayer from tensorflow.keras.layers import Dense ANN_model.add(InputLayer(input_shape=(30, ))) # No hidden layers ANN_model.add(Dense(1, activation=’sigmoid’)) |
Modelimizde 31 eğitilebilir parametre var. Eğitim boyunca, bu parametrelerin değerleri, loss fonksiyonu minimize olana kadar güncellenir. Giriş katmanı burada gösterilmez.
Adım 5 : Modeli derle
Bu adımda, eğitim aşamasında ihtiyaç duyulan Öğrenme parametrelerini ayarlıyoruz. Optimizer tipi, loss fonksiyonu ve model değerlendirme metriklerini belirliyoruz.
optimizer=tf.keras.optimizers.Adam(learning_rate=0.05)ANN_model.compile(optimizer=optimizer, loss=’binary_crossentropy’, metrics=[‘accuracy’]) |
Adam optimizerini, 0.05 öğrenme oranı ile kullanıyoruz. Öğrenme oranı (learning rate) modelimizin çıktısını ciddi şekilde etkiler. Bu yüzden değiştirerek farklı sonuçlar gözlemleyebilirsiniz.
Binary cross-entropy (log loss olarak da bilinir) eğitim boyunca iki sınıflı problemlerin performansını ölçmek için kullanılır.
Accuracy metriği, test verisi üzerinde ikili sınıflandırma probleminin performansını değerlendirmek için kullanılır.
Adım 6 : Model eğitimi
Model eğitilmeye hazır. fit() metodu kullanılarak yapılır. Burada, fit() metodu için eğitim verisini sağlamalıyız.
fit() metodunun çıktısı eğitim boyunca toplanan bazı yararlı bilgiler içerir ve history değişkeninde saklanır. Her iterasyondan (epoch) sonra hesaplanan kaybı (loss) ve diğer tüm metrik puanları içerir.
history = ANN_model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2, shuffle=False) |
Eğitim verisi için X_train, y_train sağlarız. Optimize edicinin tüm eğitim veri setinden 10 kez geçmesi için, epoch değeri 10 tanımlanır. Bir epoch tüm eğitim veri seti üzerinde bir iterasyondur.
Her bir veri seti batch’I 32 eğitim veri seti öğesi içerir. Çünkü batch_size 32 olarak tanımladık. Ortalama 569/32 batch vardır.
validation_split değeri opsiyonel bir argümandır. Loss ve diğer metrik puanlar, eğitim ve doğrulama bölümleri için ayrı ayrı hesaplanacaktır.
validation_split() argümanı, model performansını epoch sayısına göre değerlendirmek istediğimizde kullanışlıdır. Ya da eğitimden sonra evaluate() modelini kullanarak modelimizi değerlendirebiliriz.
Adım 7 : test verisi üzerinde model Değerlendirmesi
Modelimizi test verileri üzerinde henüz test etmedik. evaluate() methodunu kullanarak kolayca yapabiliriz. test_loss ve test_acc skorları döner.
Bu YSA tarafından dönen doğruluk skoru, lojistik regresyon model tarafından dönen doğruluk skoruna yakındır.
Özet :
Eğitim veri seti ile evaluate() metodunu da kullanabiliriz. fit() metodu içinde validation_split() argümanı tanımlamanın alternatifidir.
Basit bir YSA(Yapay sinir ağı-ANN) modeli için bile, hiperparametreler için en iyi değerleri tanımlamaya ihtiyaç duyarız.