Maşın Öyrənməsində Sinifləndirmə alqoritmləri -1 (K-ən yaxın qonşular)

Nijat Zeynalov
5 min readMar 1, 2020

--

Kəlbəcər, Azərbaycan

Rəhbərli öyrənmə (Supervised learning) texnikalarını iki hissəyə: reqressiya və sinifləndirmə alqoritmlərinə bölə bilərik.

Bu məqalədə, Maşın Öyrənməsində sinifləndirmə haqqında danışacağıq daha sonra K-ən yaxın qonşular metodundan bəhs edəcəyik. Sinifləndirmə nədir? Bunu daha yaxşı bir şəkildə başa düşmək üçün aşağıdakı nümunəyə baxaq.

Mənbə: https://apa.az/az/sosial_xeberler/bakida-tullantilarin-yigilmasi-dasinmasi-ve-cesidlenmesi-layihesi-baslayir-541428

Fərz edək ki, məişət tullantılarının ilkin çeşidlənməsi məqsədi ilə həyətinizdə biri kağız, karton, şüşə və s. tullantıları üçün, digəri qarışıq tullantılar üçün ayrılmış iki konteyner mövcuddur. Əlinizdəki şüşə ilə qida qalıqlarını fərqli konteynerə atmağınız, əslində sinifləndirmədir. Beləliklə, sinifləndirmə müəyyən bir əşyaya ‘sinif etiketi’ təyin edilməsi prosesidir, necə ki, siz şüşə və qida qalıqlarına fərqli sinif etiketi təyin edib, fərqli konteynerə atdız.

Sinifləndirmə anlayışını başa düşdük, bəs sinifləndirmənin hansı alqortimləri mövcuddur və onlar bir-birindən nə ilə fərqlənir? İlk olaraq, bu alqoritmlərin niyə mövcud olduğunu anlamalıyıq. Öncəki nümunəyə istinadən fərz edin ki, əlinizdə x tullantısı daha var və bu tullantı sizdə ilk dəfədir ki sizdədir, hansı konteynerə atacağınızı bilmirsiniz. Bu zaman əlinizdə olan digər tullantılara vəya konteynerin içindəki tullantılara nəzərən hansına ən uyğun olduğunu təxmin edə bilərsiz. Burada da məsələ altı-üstü belədir. Bir neçə metod olsa da, bu məqalədə aşağıdakılar haqqında nəzəri və praktiki biliklərə sahiblənəcəyik :

· Qərar ağacları

· K-ən yaxın qonşu metodu

· Logistik reqressiya

· Dəstək vektor maşınları

K-ən yaxın qonşu metodu

K-yaxın qonşuluq (KNN) alqoritmi asanlıqla həyata keçirilə bilən alqoritmlərdən biridir. Baxmayaraq ki, həm sinifləndirmə, həm də reqressiya problemlərini həll etmək üçün istifadə olunur, praktikada təsnifat problemlərini həlli üçün istifadəsinə daha çox şahid olacaqsınız.

1967-ci ildə T. M. Cover və P. E. Hart tərəfindən təklif edilmiş olan bu alqoritmdə verilənlər setimizdə mövcud olan və sinif etiketlərinə sahib verilənlərdən istifadə olunur. Bu verilənlər setinə əlavə olunan yeni verilənin əvvəlki verilənlərə görə uzaqlığını hesablayıb, K sayda yaxın qonşularına baxılır. Bu məsafənin hesablanması üçün əsasən Evklid məsafə funksiyasından istifadə olunsa da, alternativ olaraq Manhetten, Minkowski və Hamming funksiyaları da istifadə edilə bilər. K-ən yaxın qonşu metodunu daha yaxşı qavramaq üçün bu nümunəyə baxaq:

IBM-KNN diagram

Bu nümunədə A və B sinif etiketlərinə sahib verilənlər mövcuddur. Ulduzun (test verilənimizin) nə olduğunu təxmin etmək istəyirik. Əgər k dəyərini 3 götürsək, bu o deməkdir ki, biz test verilənimizin hansı sinifə aid olduğunu öyrənmək üçün 3 ən yaxın qonşusuna baxmalıyıq. Burada bir nüansı nəzərə alaq, k=3 düşünsək (3 ən yaxın verilən), bizim test verilənimizin B sinfinə aid olduğu qənaitinə gələcəyik, lakin k-nın dəyərini 6 olaraq nəzərə alsaq, A sinifinin proqnozunu alacağıq. Bu problemi necə həll edə bilərik? Necə edək ki, doğru nəticəni əldə edək? Bunun üçün K-ən yaxın qonşu metodunu Pythonda real nümunə üzərindən praktika edərək öyrənək!

  1. Gərəkli kitabxanaları yükləyin:
import itertools
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
import pandas as pd
import numpy as np
import matplotlib.ticker as ticker
from sklearn import preprocessing
dataset = pd.read_csv('dataset.csv')

2. Verilənlər seti haqqında:

İstifadə edəcəyimiz verilənlər seti beş sütundan ibarətdir və sosial media qeydlərindən tərtib edilmişdir. Müştəri id-si, Cins, Yaş, Təxmini Gəlir- illik təxmin edilən gəliri, Status- müştərinin müəyyən bir məhsulu alıb-almamasını müəyyənləşdirən unikal rəqəmdir. Burada əsas hədəf dəyişkənimiz Müştərinin satın alma statusunu ehtiva edən status dəyişkənidir, digər 4 dəyişkənimiz isə müstəqil dəyişkəndir. Bu müstəqil dəyişkənlərlə asılı dəyişkən (satın alıb-almayacağını) təxmin edəcəyik. Verilənlər setini buradan yükləyə bilərsiniz.

3. Verilənlər setini asılı və müstəqil dəyişkənlərə ayırın:

Qeyd etməkdə fayda var ki, burada yaşı və təxmini gəliri müstəqil dəyişkən olaraq götürəcəyik.

X = dataset.iloc[:, [2,3]].values
y = dataset.iloc[:, 4].values

4. Verilənləri təlim və Test olaraq ayırın:

Verilənlərin setində 400 sətr var və bunun 300-ünü təlim, 100-ünü test üçün ayıraq.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

5. K ən yaxın qonşu modelini yaradın və öyrədin:

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5, metric='minkowski', p = 2)
classifier.fit(X_train, y_train)

Bu kod parçasında görmüş olduğunuz n_neighbor-istifadə edəcəyimiz qonşu sayı, metric- məsafə funksiyasının Minkowski seçdiyimizi bildirməkdədir.

6. Test Setini proqnozlaşdırın:

y_pred = classifier.predict(X_test)

7. Proqnozun dəqiqliyini hesablayın:

#accuracy evaluation
from sklearn import metrics
print(‘Train set accuracy ‘, metrics.accuracy_score(y_train, classifier.predict(X_train)))
print(‘Test set accuracy ‘, metrics.accuracy_score(y_test, y_pred))

8. Bu ən yaxşı K dəyəridir mi?

Məqalənin əvvəlində qeyd etdiyim kimi, ən yaxşı K dəyərini seçməyimiz çox önəmlidir, əks halda yanlış nəticə əldə edəcəyik. Ən yaxşı K dəyərini bilmək üçün isə k dəyərini 1-dən 10-a qədər artırmaq və hərdəfəsində proqnozun dəqiqliyini hesablamalıyıq:

Ks = 10
mean_acc = np.zeros((Ks-1))
std_acc = np.zeros((Ks-1))
ConfustMatrx = []for i in range(1, Ks):
classifier = KNeighborsClassifier(n_neighbors = i, metric = ‘minkowski’)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)

mean_acc[i-1] = metrics.accuracy_score(y_test, y_pred)
std_acc[i-1]=np.std(y_pred==y_test)/np.sqrt(y_pred.shape[0])mean_acc

Nəticəni qrafik şəklində göstərək:

plt.plot(range(1,Ks),mean_acc,’g’)
plt.fill_between(range(1,Ks),mean_acc — 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
plt.legend((‘Deqiqlik ‘, ‘+/- 3xstd’))
plt.ylabel(‘Deqiqlik ‘)
plt.xlabel(‘Qhonsularin sayi (K)’)
plt.tight_layout()
plt.show()

Ev tapşırığı:

Mövzunu daha yaxşı qavramaq üçün aşağıdakı tapşırıqları yerinə yetirin:

  1. Fərqli olaraq, Evklid və Hamming məsafə funksiyalarından istifadə edib, proqnozun dəqiqliyini müqayisəli şəkildə göstərin.
  2. Sizcə, k-qonşuların sayı nədən asılıdır? Bu barədə internet üzərində araşdırma edin.
  3. Yaşı asılı dəyişkən olaraq, maaşı müstəqil dəyişkən olaraq seçib addımları təkrarlayın.

Bu məqalə Maşın Öyrənməsi haqqında yazdığım məqalələrdən biridir, daha çoxu üçün profili izləyin. Dəstək üçün məqaləni “alqışlaya” bilərsiniz, uğurlar!

Məqalədə qeyd olunmuş bütün kod və verilənlər setini github hesabımdan yükləyə bilərsiniz.

--

--