Caner Erden

Caner Erden

PhD in Industrial Engineering

Karar Ağaçları ile Sınıflandırma

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

  1. Özellik seçim ölçütlerini kullanarak en iyi özelliği belirle.
  2. Seçilen özelliği karar nodu yap ve veri setini kümelere ayır.
  3. 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

In [1]:
# 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
In [2]:
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)
In [3]:
pima.head()
Out[3]:
pregnant glucose bp skin insulin bmi pedigree age label
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
In [4]:
#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
In [5]:
# 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)
In [6]:
# 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)
In [7]:
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.6666666666666666
In [8]:
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO  
from IPython.display import Image  
import pydotplus
C:\Users\caner\Anaconda3\lib\site-packages\sklearn\externals\six.py:31: DeprecationWarning: The module is deprecated in version 0.21 and will be removed in version 0.23 since we've dropped support for Python 2.7. Please rely on the official version of six (https://pypi.org/project/six/).
  "(https://pypi.org/project/six/).", DeprecationWarning)
In [9]:
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())
In [10]:
graph.write_png('diabetes.png')
Out[10]:
True
In [ ]:
 

DROP A COMMENT

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir