SVM Algoritması Örneği


Aşağıda SVM (Support Vector Machine) adlı makine öğrenmesi modeli ile yapay zeka adlı arkadaşa, mütevazı bir tahmin işlemi yaptıracağız. Bunun için Python ve SkLearn kütüphanesi ile aşağıda gördüğünüz şekildeki bir veri seti kullanıyoruz.

yasegitim_seviyesikredi_odememezlikrenk
5060green
6050green
7060green
5550green
5340green
5060green
5250green
5050green
4960green
5340green
5750green
2511red
3031red
4521red
2231red
3021red
3331red
2641red
2421red
Kredi ödememezlik tablosu

Yaş ve eğitim düzeyi bilgisi elimizdedir. Bu bilgilere göre bir de kredi geri ödeme durumunu biliyoruz.In [102]:

import pandas as pd
df = pd.read_excel('svm_ornek_data_1.xlsx')

In [115]:

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

In [111]:

df.sample(3)

Out[111]:

yasegitim_seviyesikredi_odememezlikrenk
134521red
16050green
65250green

Aşağıdaki grafikte dikkat ettiyseniz kredi geri ödememe durumu 0 olan (yani geri ödeyenler) eğitim düzeyi ve yaş yüksek kişiler. Diğerleri ise tam tersi düşük eğitimli ve genç kişiler.In [112]:

%matplotlib inline
import matplotlib.pyplot as plt
df.plot.scatter(x='yas',y='egitim_seviyesi',c=df['renk'])

Out[112]:

<matplotlib.axes._subplots.AxesSubplot at 0x27a0b7bc0b8>

Şimdi Support Vector Machine ile bu veri setini algoritmaya öğretip, bu veri setindeki bir durumda ortaya çıkacak durumu tahmin ettirelim.In [103]:

X = df.iloc[:,0:2].values.astype(float) #ilk iki kolonu al 0, 1
y = df.iloc[:,2:3].values.astype(float)# sadece 3. kolon 

StandardScaler kullanma nedeni: SVM veri setlerinin tüm kolonlar için benzer aralıkta olduğu durumlarda daha rahat çalışır. LinearSVC kullanma nedenimiz ise bu veri setinin lineer olarak ayrılabilimesi. Elbette bu mümkün olmayabilirdi de.In [131]:

scaler = StandardScaler()
X_std = scaler.fit_transform(X)

In [143]:

# Create support vector classifier
svc = LinearSVC(C=1.0, loss="hinge")

# Train model
model = svc.fit(X_std, y)
model

Out[143]:

LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='hinge', max_iter=1000, multi_class='ovr',
     penalty='l2', random_state=None, tol=0.0001, verbose=0)

Şimdi tahmin yapalım: 51 yaşıda ve eğitim seviyesi 3 olan biri kredisini geri öder mi (0:öder, 1:Ödemez)In [144]:

model.predict([[51., 3.]])

Out[144]:

array([0.])

Hyperplane (Ayırıcı Sınır) Çizdirelim

In [146]:

# Plot data points and color using their class
color = ['black' if c == 0 else 'lightgrey' for c in y]
plt.scatter(X_std[:,0], X_std[:,1], c=color)

# Create the hyperplane
w = model.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-2.5, 2.5)
yy = a * xx - (svc.intercept_[0]) / w[1]

# Plot the hyperplane
plt.plot(xx, yy)
plt.axis("off"), plt.show();

Mavi çizgi hyperplane’mizi tanımlıyor

Modeli tanımlama Pipeline Kullanarak da olurdu, ancak grafik çizdirirken sorun yarattığından pipeline kullanmadık.In [ ]:

svm_clf = Pipeline((
("scaler", StandardScaler()),
("linear_svc", LinearSVC(C=1, loss="hinge")),
))
model = svm_clf.fit(X, y.ravel()) 
#ravel dikey array'ı yatay hale getirir. Mecburen böyle Pipeline kabul etmiyor yoksa

K-Means ve TF.IDF ile gözetimsiz makine öğrenme algoritması örneği


Metin madenciliğinde sınıflandırma için kullanılacak algoritmalarda eğer gözetimli algoritma (supervised) kullanırsak dışarıdan eğitim verisine ihtiyaç duyarız. Dışarıdan gözetim gerektirmeyen (unsupervized) algoritmalarda ise metin içinde yapılar “cluster” adı verilen yapılara göre otomatik olarak algılanabilir.

Aşağıdaki kodlarla TF.IDF metriği üzerinden K-Means algoritması kullanılarak basit 6 cümleden oluşan bir korpus içinde 2 sınıf otomatik olarak ortaya çıkarılmıştır.

In [19]:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
all_text  =  """
 Ekonomik kriz insanları etkiledi
 Ekonomik krizde çözüm aranıyor
 Ekonominin patronlarından parasal çözümler
 Mide ağrısı nasıl geçirilir
 Mide ağrısı için hangi ilaçlar iyidir
 Mideniz ağrıdığında ne yapmalısınız?
""".split("\n")[1:-1]
# Preprocessing and tokenizing
def preprocessing(line):
    line = line.lower()
    line = re.sub(r"[{}]".format(string.punctuation), " ", line)
    return line

In [20]:

all_text

Out[20]:

[' Ekonomik kriz insanları etkiledi',
 ' Ekonomik krizde çözüm aranıyor',
 ' Ekonominin patronlarından parasal çözümler',
 ' Mide ağrısı nasıl geçirilir',
 ' Mide ağrısı için hangi ilaçlar iyidir',
 ' Mideniz ağrıdığında ne yapmalısınız?']

In [21]:

import re
import string
tfidf_vectorizer = TfidfVectorizer(preprocessor=preprocessing)
tfidf = tfidf_vectorizer.fit_transform(all_text)
sinif_sayisi =2
kmeans = KMeans(n_clusters=sinif_sayisi).fit(tfidf)

In [23]:

suat_order_centroids = kmeans.cluster_centers_.argsort()[:, ::-1]
suat_terms = tfidf_vectorizer.get_feature_names()

In [24]:

for i in range(sinif_sayisi):
     print("Cluster %d:" % i),
     for ind in suat_order_centroids[i, :10]:
         print(" %s" % suat_terms[ind])
Cluster 0:
 ekonomik
 aranıyor
 krizde
 etkiledi
 insanları
 çözüm
 kriz
 ağrıdığında
 ekonominin
 çözümler
Cluster 1:
 ağrısı
 mide
 nasıl
 geçirilir
 için
 hangi
 ilaçlar
 iyidir
 insanları
 ağrıdığında

Tahmin Denemesi

In [25]:

#hangi metin hangi cluster'da
# mide ağrısı Cluster'i 1 olduğundan aşağıda ilk sonuç 1 döner
lines_for_predicting = ["mide ağrısı", "ekonomi","kriz"]
kmeans.predict(tfidf_vectorizer.transform(lines_for_predicting))

# array([0, 1], dtype=int32)

Out[25]:

array([1, 0, 0], dtype=int32)