Makine Öğrenmesi - Sınıflandırma Algoritmaları
Karar ağaçları (Decision Tree)
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ı: