Makine Öğrenmesi - Sınıflandırma Algoritmaları

Karar ağaçları (Decision Tree)

Yayın tarihi :16-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Decision Tree (Karar ağaçları), hem sınıflandırma (classification) hem de regresyon (regression) için kullanılan parametrik olmayan bir makine öğrenmesi terimidir. En çok kullanılan denetimli öğrenme modellerinden biridir. Amacı veri setindeki verileri bir karar doğrultusunda yukardan aşağıya doğru küçük birimlere bölmektir. Küçültme işlemi ne kadar çok yapılırsa karar verme işlemi de daha doğru çalışacaktır.

Avantajları nelerdir?

  • Karar ağaçları görselleştirebildiğinden anlaması ve yorumlaması basit hale gelir.
  • Veri seti temizliğine fazla gerek kalmadan çalışma yapılabilir.
  • Hem sayısal hem de kategorik verileri işleyebilir.
  • Çoklu çıkış problemlerini çözebilir.
  • İstatistiksel testler kullanarak bir modeli doğrulamak mümkündür. Bu, modelin güvenilirliğini hesaba katmayı mümkün kılar.

Dezavantajları nelerdir?

  • Veri setindeki verileri iyi genellemeyen aşırı karmaşık ağaçlar oluşabilir.
  • Karar ağaçları kararsız olabilir çünkü verilerdeki küçük değişiklikler tamamen farklı bir ağacın üretilmesine neden olabilir.
  • Eğer bazı sınıflar baskınsa, önyargılı ağaçlar oluşturulabilir.

Ağaç Algoritmaları

  • ID3
  • C4.5
  • C5.0
  • CART

Kullanımı

Kullanabilmek için "tree" kütüphanesinin içe aktarılması gerekir.

from sklearn import tree

Tree kütüphanesi altında sınıflandırma ile alakalı bazı modeller bulunmaktadır. Bunlar:

  • DecisionTreeClassifier
    from sklearn.tree import DecisionTreeClassifier
  • ExtraTreeClassifier
    from sklearn.tree import ExtraTreeClassifier

Örnek-1: Bazı fiziksel özelliklere bakılarak kişilerin akciğer kanseri olup olmayacağını tahmin edelim. Veri seti olarak "lung_cancer_examples.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.tree import DecisionTreeClassifier,ExtraTreeClassifier

Keşifsel Veri Analizi EDA

#Veri seti okunur
df=pd.read_csv("lung_cancer_examples.csv")
df.head()

Çıktı:

# Veri seti hakkında bilgi 
df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 59 entries, 0 to 58
Data columns (total 7 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   Name     59 non-null     object
 1   Surname  59 non-null     object
 2   Age      59 non-null     int64 
 3   Smokes   59 non-null     int64 
 4   AreaQ    59 non-null     int64 
 5   Alkhol   59 non-null     int64 
 6   Result   59 non-null     int64 
dtypes: int64(5), object(2)
memory usage: 3.4+ KB
#Result sütunu eleman sayıları
df.Result.value_counts()

Çıktı:

0    31
1    28
Name: Result, dtype: int64
#Veri seti açıklamaları
df.describe()

Çıktı:

#Sütunların birbirleri ile korelasyonu
df.corr()

Çıktı:

#Korelasyon görüntülenmesi
sns.heatmap(df.corr(),annot=True)

Çıktı:


Model Oluşturma İşlemleri

#Model temizleme
#Akciğer kanseri olma durumunun Name ve Surname ile bir bağlantısı olmadığından bu sütunlar çıkartılabilir.
df.drop(["Name","Surname"],axis=1,inplace=True)
#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("Result",axis=1),df[["Result"]]
#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ı:

((47, 4), (12, 4), (47, 1), (12, 1))

DecisionTreeClassifier algoritması

#DecisionTreeClassifier ataması yapılır
D=DecisionTreeClassifier()

#Model eğitme işlemi
D.fit(x_train,y_train)

#x_test verilerini tahminleme işlemi
predict_D=D.predict(x_test)
confusion_matrix(y_test,predict_D)

Çıktı:

array([[4, 1],
       [0, 7]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_D),annot=True,linewidths=2)

Çıktı:

 
#Sınıflandırma raporu
print(classification_report(y_test,predict_D))

Çıktı:

              precision    recall  f1-score   support

           0       1.00      0.80      0.89         5
           1       0.88      1.00      0.93         7

    accuracy                           0.92        12
   macro avg       0.94      0.90      0.91        12
weighted avg       0.93      0.92      0.91        12

Sınıflandırma raporunda da görüldüğü gibi DecisionTreeClassifier algoritması ile girilen değerlere göre Result sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %92 olarak buldu.

ExtraTreeClassifier algoritması

#ExtraTreeClassifier ataması yapılır
E=ExtraTreeClassifier()

#Model eğitme işlemi
E.fit(x_train,y_train)

#x_test verilerini tahminleme işlemi
predict_E=E.predict(x_test)
confusion_matrix(y_test,predict_E)

Çıktı:

array([[5, 0],
       [1, 6]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_E),annot=True,linewidths=2)

Çıktı:

 
#Sınıflandırma raporu
print(classification_report(y_test,predict_E))

Çıktı:

              precision    recall  f1-score   support

           0       0.83      1.00      0.91         5
           1       1.00      0.86      0.92         7

    accuracy                           0.92        12
   macro avg       0.92      0.93      0.92        12
weighted avg       0.93      0.92      0.92        12

Sınıflandırma raporunda da görüldüğü gibi ExtraTreeClassifier algoritması ile girilen değerlere göre Result sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %92 olarak buldu.

Model Tahminleme İşlemleri

ExtraTreeClassifier algoritması ile eğitmiş olduğumuz modele dışardan bilgiler girerek ilgili kişinin akciğer kanseri olup olmayacağı bilgisine bakalım.

#1. Hasta bilgileri
#Sırasıyla:'Age', 'Smokes', 'AreaQ', 'Alkhol' değerleri girilir.
patientInformation=[[32, 15, 5, 4]]

#Model tahminleme işlemi
E.predict(patientInformation)

Çıktı:

array([0], dtype=int64)

Girilen kişinin akciğer kanseri olma durumu 0 olarak sonuçlandı. Yani kişi akciğer kanseri değildir. 

#2. Hasta bilgileri
#Sırasıyla:'Age', 'Smokes', 'AreaQ', 'Alkhol' değerleri girilir.
patientInformation=[[78, 5, 5, 6]]

#Model tahminleme işlemi
E.predict(patientInformation)

Çıktı:

array([1], dtype=int64)

Girilen kişinin akciğer kanseri olma durumu 1 olarak sonuçlandı. Yani kişi akciğer kanseridir. 

Model Grafikleme

Elde etmiş olduğumuz modele karşılık veri setinin ağaç yapısını görüntülemek için;

from sklearn.tree import plot_tree

plt.figure(figsize=(16,12))
fn=["Age","Smokes","AreaQ","Alkhol"]
cn=["Akciğer Hastası Değil","Akciğer Hastası"]
plot_tree(
    E,
    feature_names = fn, 
    class_names=cn,
    filled = True);

Çıktı:

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.