Sklearn Kütüphanesi ile Karar Ağaçları Uygulaması
Bu eğitimde Sklearn kütüphanesi kullanarak karar ağacı uygulaması gerçekleştirilecektir. Karar Ağaçları ile ilgili sunumu aşağıda bulabilirsiniz.
Kodlar
Uygulama bu adresteki uygulamadır.
Bu uygulamada Karar Ağaçları Sınıflandırmasının Python Scikit-learn paketi ile nasıl kullanılacağı gösterilecektir.
Sınıflandırma iki aşamadan oluşur. Birinci aşamada öğrenme gerçekleşir. İkinci aşamada tahmin modeli çalıştırılır. Tahmin edilen değerler ile test değerlerinin ne kadar doğru olup olmadığı ile ilgili olarak sınıflandırma kalitesi ortaya çıkar. Karar ağaçları en kolay uygulanan sınıflandırma algoritmalarından birisidir.
Bu uygulamada özellik seçim ölçütlerinden Information Gain(Bilgi Kazanımı), Gain Ratio(Kazanım Oranı), Gini Index(Gini Indeksi) ölçütleri kullanılacaktır.
Adımlar
- Özellik seçim ölçütlerini kullanarak en iyi özelliği belirle.
- Seçilen özelliği karar nodu yap ve veri setini kümelere ayır.
- Bu işlemi her bir dal için yap taa ki, her özellik değeri bir sınıfa ait olana kadar.
Özellik Seçim Ölçütleri¶
Burada başlangıçta dallanmayı nereden yapacağımıza dair en iyi özellik seçimi gerçekleştirilir. Özellik Seçim Ölçütleri sayesinde her bir özelliğin birbirleri ile olan sıralamasını gerçekleştiririz. Ardından en iyi skora sahip olan özellik ile dallandırmaya başlarız. Eğer özelliklerde sürekli değişkenler varsa bölme noktalarının da ayrıca belirlenmesi gerekir. Bu uygulamada Bilgi Kazanımı, Kazanım Oranı ve Gini İndex kullanılacaktır.
Bilgi Kazanımı¶
Entropi veri setinin ne kadar kirliliğe sahip olduğunun ölçüsüdür. Fizikte ya da matematikte entropi sistemdeki kirlilik ya da rastgelelik olarak tanımlanır. Bilgi kazanımı entropinin azalması anlamına gelir. Bilgi Kazanımı bölünmeden önceki ve sonraki entropiyi kıyaslayarak arasındaki farkı ölçer. ID3 algoritması bilgi kazanımını aşağıdaki formül ile hesaplar.
$ Info(D) = - \sum_{i=1}^{m}p_ilog_2p_i$
$p_i$ i özelliğinin sınıfa ait olma olasılığı demektir.
$Info_A(D)=\sum_{j=1}^V\frac{D_j}{D}\times Info{(D_j)}$
$Gain(A)=Info(D)-Info_A(D)$
$Info(D)$ D içerisindeki bir sınıfa ait olmak için gereken ortalama bilgi
$\frac{D_j}{D}$ j bölünmesinin ağırlığı
$Info_A(D)$ A bölünmesinin ardından D ye ait bir sınıfın tanımlanmasının beklenen bilgi değeri
# Load libraries
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("diabetes-1.csv", header=None, names=col_names, skiprows=1)
pima.head()
#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# Create Decision Tree classifer object
clf = DecisionTreeClassifier()
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data, filled=True, rounded=True, special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('diabetes.png')