Maşın Öyrənməsində Sinifləndirmə alqoritmləri -2 (Qərar ağacları)

Nijat Zeynalov
4 min readMar 2, 2020

--

Şuşa, Azərbaycan

Bu məqaləmdə Maşın Öyrənməsində Sinifləndirmə metodlarından biri olan Qərar Ağacları haqqında danışacağıq. Metod haqqında təməl nəzəri bilikləri əldə etdikdən sonra, real verilənlər üzərində tətbiq edəcəyik.

K-ən yaxın qonşular alqoritmi kimi, qərar ağacları da həm sinifləndirmə, həm də reqressiya problemlərində istifadə edilə bilər. Əvvəlcədən təyin olunmuş hədəf dəyişəninə sahibdirlər və öyrənilən məlumatlar bir ağac üzərində modelləşdirildiyi üçün adına Qərar Ağacı deyilməkdədir. Əslində insan beyni daimi olaraq mürəkkəb qərar ağacları qurur, məsələn, insan resursları şöbəsində işləyən birinin ağlında aşağıda göstərilənə bənzər bir qərar ağacı ola bilər:

Bir namizəd x-y yaş aralığındadırsa, a, b, c, d, e ali məktəblərindən birini bitiribsə, ən azı t illik təcrübəsi varsa və əvvəlki iş təcrübəsi p ilindən çoxdursa, onu müsahibəyə çağıracam.

Bəs, bu Qərar Ağaclarının hansı üstünlükləri var? Biz niyə Qərar Ağaclarından istifadə etməliyik?

· Statistik testlərdən istifadə edərək bir modeli yoxlamaq mümkündür.

· Qərar Ağacı verilənlərin normallaşdırılmasını tələb etmir.

· Qərar ağacları modeli çox intuitivdir və başa düşmək, izah etmək asandır.

· Digər alqoritmlərlə müqayisədə qərar ağacları əvvəlcədən işləmə zamanı verilənlərin hazırlanması üçün daha az əziyyət tələb edir.

Wow! Əladır ki, bəs çatışmayan cəhətləri necə? Onlar hansılardır?

· Verilənləri yaxşı təsvir edən, lakin olduqca mürəkkəb ağaclar yaradıla bilər.

· Verilənlərdə kiçik bir dəyişikli qərar ağacının strukturunda böyük bir dəyişikliyə səbəb ola bilər.

· Qərar ağacı təlimi nisbətən əlverişli deyil, çünki mürəkkəblik və ayrılan vaxt daha çoxdur.

· Hər Qərar Ağacı yalnız bir çıxış atributu ilə məhdudlaşır.

Qərar ağacı alqoritmlərində necə bölünməsi, ağacın doğru qurulduğuna təsir edən amillərdən biridir. Təsnifat və reqressiya problemlərinin bölgü meyarları fərqlidir.

Qərar ağacı alqoritminin tətbiq edildiyi sinifləndirilmə problemlərində verilənlər iki əsas hissəyə bölünməlidir (təlim və test). Alqoritm təlim verilənlərindən istifadə edərək bir model yaradır. Daha sonra bu modeli test verilənlərinin üzərində tətbiq edərək, problemin həllində modelin ə dərəcədə uyğun olduğuna şahid ola bilərik. Ən çox istifadə olunan, qərar ağacı alqoritmləri :

  • ID3
  • C4.5
  • CHAID
  • CART

İndi isə Qərar Ağacını Pythonda real nümunə üzərindən praktika edərək öyrənək!

  1. Gərəkli kitabxanaları yükləyin:
import numpy as np 
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

2. Datasetimizi yükləyin:

df = pd.read_csv(‘adults.csv’)df.columns = [‘age’, ‘workclass’, ‘fnlwgt’, ‘education’, ‘education-num’, ‘marital-status’, ‘occupation’, ‘relationship’,’race’, ‘sex’, ‘capital-gain’, ‘capital-loss’, ‘hours-per-week’, ‘native-country’, ‘salary’]print(df.info())df.head()

Sütunlara ad qoyduq və verilənlərin tiplərini, çatışmayan verilən olub-olmadığını yoxladıq. Modelimizdəki hədəf dəyişən ‘salary’ olduğundan, onun paylanmasına baxırıq və onu verilənlərin digər hissəsindən ayırırıq.

X = df.drop([‘salary’], axis=1)y = df[‘salary’]

İndi isə, tipi object olan verilənlərə göz gəzdirək.

X.select_dtypes(include=’object’).tail(25)

Göy qələmlə işarələdiyim yerlərə diqqət yetirsək görərik ki, bizim datasetimizdə bir neçə naməlum verilən “?” işarəsi ilə qeyd olunub və bu işimizə mane olacaq. Bu problemi aradan qaldırmaq üçün isə, tipi object olan sütunlar seçilir və o sütunlarda “?” işarəsi ilə qeyd olunan verilənlər mode() dəyəri ilə doldurulur. Bu hissəni daha yaxşı qavramaq üçün, çatışmayan verilənlər haqqında yazmış olduğum məqaləni oxumağınızı tövsiyyə edirəm.

categorical_columns = [c for c in X.columns if X[c].dtype.name == ‘object’]for c in categorical_columns:      X[c] = np.where(X[c] == ‘ ?’, X[c].mode(), df[c])

Maşın öyrənmə modelləri kateqoriyalı dəyişənləri aşkar edə bilmədiyi üçün, “obyekt” tipli dəyişənləri enkodinq metodundan istifadə edərək 0 və 1-lərə ayırırıq.

X = pd.concat([X,pd.get_dummies(X.select_dtypes(include=’object’))], axis=1)
X = X.drop([‘workclass’, ‘education’, ‘marital-status’, ‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘native-country’], axis=1)
X.head()

Nəticədə gördüyümüz kimi, sütunların sayı artaraq hər bir sətirə uyğun şəkildə 0 və ya 1 qiymətinə sahib verilənləri özündə ehtiva edir.

3. Modelin qurulması

Verilənlərimizi normal vəziyyətə gətirdiyimiz üçün artıq modelimizi qura bilərik. Əvvəlki dərsdə olduğu kimi, verilən setimizi təlim/test setinə böləcəyik.

from sklearn.model_selection import train_test_split
X_trainset, X_testset, y_trainset, y_testset = train_test_split(X, y, test_size = 0.3, random_state = 3)

Əvvəlcə adultTree adlanan DecisionTreeClassifier yaradırıq, daha sonra sinifləndiricinin daxilində meyar olaraq “entropiya” təyin edirik.

adultTree = DecisionTreeClassifier(criterion = “entropy”, max_depth = 4)
adultTree.fit(X_trainset, y_trainset)

4. Proqnozlaşdırma

Test verilənlər setində bəzi proqnozlar verək və bu proqnozları predTree adlanan dəyişənə mənimsədək. Daha sonra isə proqnozla həqiqi dəyərlərimizi müqayisə edək!

predTree = adultTree.predict(X_testset)print(predTree[0:3])print(y_testset[0:3])

5. Proqnozun dəqiqliyini hesablama

Ötən dərsdən də bildiyimiz kimi, sklearn kitabxanasından metrics-i import edərək, proqnozumuzun dəqiqliyini hesablaya bilərik.

from sklearn import metrics
print(“Accuracy is “, metrics.accuracy_score(y_testset, predTree))

6. Vizuallaşdırma

İndi isə yaratmış olduğumuz qərar ağacını vizuallaşdıraq. Vizuallaşdırma üçün normalda GraphViz-dən istifadə olunsa da, məndə problemlər yaratdığından dtreeplt modulundan istifadə edəcəm.

#visualizing
from dtreeplt import dtreeplt
dtree = dtreeplt(
model=adultTree,
feature_names=X.columns,
target_names=np.unique(y_trainset)
)
fig = dtree.view()

Qərar Ağacları haqqında bu qədər gözəl insanlar! Bu məqalədə mövcud olan kod və verilənlər setini github hesabımdan yükləyə bilərsiniz. Növbəti məqalədə görüşənədək!

--

--