Makine Öğrenmesi - Sınıflandırma Algoritmaları
Yapay Sinir Ağları (Artificial Neural Network)
Yapay sinir ağları (YSA) (Artificial neural networks-ANN), insan beynindeki biyolojik nöronların birbirine sinyal gönderme şeklini taklit ederek makine öğrenmesi ve derin öğrenme alanlarındaki kalıpları tanımasına ve sorunları çözmesine olanak tanır. (Derin öğrenme konusunda daha detaylı bir şekilde anlatılacaktır.)
YSA, bir girdi katmanı, bir veya daha fazla gizlenmiş halde duran katmanlardan ve son olarak da çıktı katmanından oluşmaktadır.
Bir girdi katmanı belirlendikten sonra ağırlıklar atanır. Bu ağırlıklar, herhangi bir değişkenin önemini belirlemeye yardımcı olur ve daha büyük olanlar diğer girdilere kıyasla çıktıya daha fazla katkıda bulunur. Tüm girdiler daha sonra ilgili ağırlıklarıyla çarpılır ve toplanır. Daha sonra çıktı, çıktıyı belirleyen bir aktivasyon fonksiyonundan geçirilir. Bu çıktı belirli bir eşiği aşarsa, ağdaki bir sonraki katmana veri ileterek düğümü etkinleştirir. Bu, bir düğümün çıktısının bir sonraki düğümün girdisi olmasına neden olur. Çıktı katmanına kadar bu yöntem uygulandığı için ileri beslemeli bir ağ olarak tanımlanır.
Yukarıda bahsetmiş olduğumuz Yapay Sinir Ağları (YSA) konusunu sınıflandırma projelerinde kullanabilmek için "MLPClassifier" algoritmasını kullanabiliriz. Kullanım için ilgili kütüphanenin içe aktarılması gerekmektedir.
from sklearn.neural_network import MLPClassifier
Söz dizimi: MLPClassifier(hidden_layer_sizes=(100,), activation='relu', *, solver='adam', alpha=0.0001, batch_size='auto', learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=200, shuffle=True, random_state=None, tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False, validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)
- hidden_layer_sizes, gizli katmanın boyutunu temsil etmektedir.Örn (50,100,100) 3 tane gizli katmanın oluştuğunu gösterecektir. İstenilen sayı kadar katman oluşturulabilir. Default olarak (100,)'dür.
- activation, gizli katmanın aktivasyon fonksiyonunu temsil eder. 4 farklı değer alabilir; identity, logistic, tanh, relu, default olarak relu bulunmaktadır.
- solver, ağırlık optimizasyonunu temsil etmektedir. 3 farklı değer alabilir; lbfgs, sgd, adam default olara adam bulunmaktadır. Burada dikkat edilecek husus adam büyük veri setlerinde iyi sonuç verebileceği gibi lbfgs de küçük veri setlerinde iyi sonuçlar verebilir.
Örnek-1: Bazı fiziksel özelliklere ve kan değerlerine bakılarak kişilerin kalp hastası olup olmayacağını MLPClassifier algoritması kullanarak tahmin edelim. Veri seti olarak "heart.csv" kullanılacaktır.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.neural_network import MLPClassifier
Keşifsel Veri Analizi EDA
#Veri seti okunur
df=pd.read_csv("heart.csv")
df.head()
Çıktı:
# Veri seti hakkında bilgi
df.info()
Çıktı:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 303 entries, 0 to 302 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 age 303 non-null int64 1 sex 303 non-null int64 2 cp 303 non-null int64 3 trestbps 303 non-null int64 4 chol 303 non-null int64 5 fbs 303 non-null int64 6 restecg 303 non-null int64 7 thalach 303 non-null int64 8 exang 303 non-null int64 9 oldpeak 303 non-null float64 10 slope 303 non-null int64 11 ca 303 non-null int64 12 thal 303 non-null int64 13 target 303 non-null int64 dtypes: float64(1), int64(13) memory usage: 33.3 KB
#target sütunu eleman sayıları
df.target.value_counts()
Çıktı:
1 165 0 138 Name: target, dtype: int64
#Veri seti açıklamaları
df.describe()
Çıktı:
#Sütunların birbirleri ile korelasyonu
df.corr()
Çıktı:
#Korelasyon görüntülenmesi
plt.figure(figsize=(16,6))
sns.heatmap(df.corr(),annot=True)
Çıktı:
Model Oluşturma İşlemleri
#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("target",axis=1),df[["target"]]
#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=13)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
Çıktı:
((242, 13), (61, 13), (242, 1), (61, 1))
#MLPClassifier ataması yapılır
MLP=MLPClassifier()
#Model eğitme işlemi
MLP.fit(x_train,y_train)
#x_test verilerini tahminleme işlemi
predict_MLP=MLP.predict(x_test)
confusion_matrix(y_test,predict_MLP)
Çıktı:
array([[21, 5], [ 7, 28]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_MLP),annot=True,linewidths=2)
Çıktı:
#Sınıflandırma raporu
print(classification_report(y_test,predict_MLP))
Çıktı:
precision recall f1-score support 0 0.75 0.81 0.78 26 1 0.85 0.80 0.82 35 accuracy 0.80 61 macro avg 0.80 0.80 0.80 61 weighted avg 0.81 0.80 0.80 61
Sınıflandırma raporunda da görüldüğü gibi MLPClassifier algoritması ile girilen değerlere göre target sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %80 olarak buldu.
MLPClassifier varsayılan değerleri değiştirerek tekrar model oluşturulsa;
#MLPClassifier ataması yapılır
MLP2=MLPClassifier(
hidden_layer_sizes=(18, 175, 256),
batch_size=50,
learning_rate_init=0.0001,
beta_1=0.001,
beta_2=0.001,
max_iter=1,
warm_start=True)
#Model eğitme işlemi
MLP2.fit(x_train,y_train)
#x_test verilerini tahminleme işlemi
predict_MLP2=MLP2.predict(x_test)
confusion_matrix(y_test,predict_MLP2)
Çıktı:
array([[25, 1], [33, 2]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_MLP2),annot=True,linewidths=2)
Çıktı:
#Sınıflandırma raporu
print(classification_report(y_test,predict_MLP2))
Çıktı:
precision recall f1-score support 0 0.43 0.96 0.60 26 1 0.67 0.06 0.11 35 accuracy 0.44 61 macro avg 0.55 0.51 0.35 61 weighted avg 0.57 0.44 0.31 61
Sınıflandırma raporunda da görüldüğü gibi MLPClassifier algoritması ile girilen değerlere göre target sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %44 değerine kadar düştü. En iyi sonucu almak için GridSearchCV kütüphanesi kullanılabilir.
Model Tahminleme İşlemleri
MLPClassifier algoritması ile eğitmiş olduğumuz modele dışardan bilgiler girerek ilgili kişinin kalp hastası olup olmayacağı bilgisine bakalım.
#1. Hasta bilgileri
#Sırasıyla:'age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal' değerleri girilir.
patientInformation=[[45.0, 1.0, 1.0, 170.0, 270.0, 1.0, 0.0, 150.0, 1.0, 1.6, 1.0, 0.0, 3.0]]
#Model tahminleme işlemi
MLP.predict(patientInformation)
Çıktı:
array([0], dtype=int64)
Girilen kişinin kalp hastası olma durumu 0 olarak sonuçlandı. Yani kişi kalp hastası değildir.
#2. hasta bilgileri
#Sırasıyla:'age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal' değerleri girilir.
patientInformation=[[52.0, 0.0, 1.0, 105.0, 198.0, 0.0, 1.0, 168.0, 0.0, 0.0, 2.0, 1.0, 2.0]]
#Model tahminleme işlemi
Log.predict(patientInformation)
Çıktı:
array([1], dtype=int64)
Girilen kişinin kalp hastası olma durumu 1 olarak sonuçlandı. Yani kişi kalp hastası olabilir.