Makine Öğrenmesi - Sınıflandırma Algoritmaları
Destek Vektör Sınıflandırması (Support Vector Classification)
Destek Vektör Sınıflandırması (Support Vector Classification - SVC), Support Vector Machines (Destek Vektör Makineleri - SVMs)'nin sınıflandırma projelerinde kullanılmak üzere geliştirilmiş bir algoritmadır.
SVMs, eğitim verilerini uzayda geniş bir boşlukla kategorilere ayrılmış noktalar olarak temsil eden bir sınıflandırıcıdır. Daha sonra bu noktaların hangi kategoriye gireceğini ve hangi alana ait olacağını tahmin ederek uzaya yeni noktalar ekler. Karar işlevinde eğitim noktalarının bir alt kümesini kullanır, bu nedenle bellek açısından da verimlidir. Direkt olarak olasılık sağlamamaları dezavantajı olarak sayılabilir.
SVM'ler hem sınıflandırma projelerinde hemde regresyon modellerinde kullanılabilir. Sınıflandırma projelerinde daha başarılı çalışmaktadır.
Sınıflandırma projelerinde kullanmak için "Support Vector Classification" kütüphanesinin içe aktarılması gerekmektedir.
from sklearn.svm import SVC
Söz dizimi: SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=- 1, decision_function_shape='ovr', break_ties=False, random_state=None)
- kernel, algoritmada kullanılacak yöntem türünü temsil eder. ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ olmak üzere 5 değer alabilir. Default olarak da rbf bulunmaktadır.
Örnek-1: Titanic veri seti üzerinden, survived sütununa(hayatta kalıp/kalmadığı) "SVC" algoritmasını uygulayalım.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.svm import SVC
Keşifsel Veri Analizi EDA
#Veri seti okunur
df=sns.load_dataset("titanic")
df.head()
Çıktı:
# Veri seti hakkında bilgi
df.info()
Çıktı:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 survived 891 non-null int64 1 pclass 891 non-null int64 2 sex 891 non-null object 3 age 714 non-null float64 4 sibsp 891 non-null int64 5 parch 891 non-null int64 6 fare 891 non-null float64 7 embarked 889 non-null object 8 class 891 non-null category 9 who 891 non-null object 10 adult_male 891 non-null bool 11 deck 203 non-null category 12 embark_town 889 non-null object 13 alive 891 non-null object 14 alone 891 non-null bool dtypes: bool(2), category(2), float64(2), int64(4), object(5) memory usage: 80.7+ KB
#Veri setinde boş elemanların toplamı
df.isnull().sum()
Çıktı:
survived 0 pclass 0 sex 0 age 177 sibsp 0 parch 0 fare 0 embarked 2 class 0 who 0 adult_male 0 deck 688 embark_town 2 alive 0 alone 0 dtype: int64
Boş değişkenler olduğundan dolayı veri seti üzerinde temizleme işlemi yapılır.
# Veri seti temizleme
#age sütununda 177 tane boş alan olduğundan, ortalama değer ile boş alanları dolduralım.
df.age.fillna(df.groupby("sex")["age"].transform("mean"),inplace=True)
#embarked gemiye binilen yerin kısaltması 2 tane eksik alan olduğundan onlar en çok olan değerle doldurulabilir.
df.embarked.fillna(df.embarked.mode()[0],inplace=True)
#class ve pclass değerleri birbirleri ile aynı olduğundan class sütununu silelim
del df["class"]
#deck(güverte) alanında da 688 boş alan var,203 alan doludur.
#Önem derecesine bağlı olarak silinebilir veya en çok değerle doldurulabilir.
#Değerinin fazla olmadığını düşünerek ilgili sütunu silelim.
del df["deck"]
#alive değerleri surivived tahmin sütununun tekrarı olduğundan silinebilir.
del df["alive"]
#alone değerleri 0 ve 1 olarak değiştirilebilir.
df.alone=df.alone.map(lambda x:1 if x==True else 0)
#embarked sütunu ile embark_town sütun değerlerinin kısaltması olduğundan embark_town kaldırılabilir
del df["embark_town"]
#son durumda veri setinden rastgele değerlere baklım
df.sample(5)
Çıktı:
#survived sütunu eleman sayıları
df.survived.value_counts()
Çıktı:
0 549 1 342 Name: survived, dtype: int64
#Veri seti açıklamaları
df.describe()
Çıktı:
#Sütunların birbirleri ile korelasyonu
df.corr()
Çıktı:
#Korelasyon görüntülenmesi
sns.heatmap(df.corr(),annot=True)
Çıktı:
Model Oluşturma İşlemleri
#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("survived",axis=1),df[["survived"]]
#object değerler olduğu için get_dummies işlemi yapılır
x=pd.get_dummies(x,drop_first=True)
#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=13)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
Çıktı:
((712, 12), (179, 12), (712, 1), (179, 1))
#SVC ataması yapılır
svc=SVC()
#Model eğitme işlemi
svc.fit(x_train,y_train)
#x_test verilerini tahminleme işlemi
predict_svc=svc.predict(x_test)
confusion_matrix(y_test,predict_svc)
Çıktı:
array([[105, 5], [ 48, 21]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_svc),annot=True,linewidths=2)
Çıktı:
#Sınıflandırma raporu
print(classification_report(y_test,predict_svc))
Çıktı:
precision recall f1-score support 0 0.69 0.95 0.80 110 1 0.81 0.30 0.44 69 accuracy 0.70 179 macro avg 0.75 0.63 0.62 179 weighted avg 0.73 0.70 0.66 179
Sınıflandırma raporunda da görüldüğü gibi SVC algoritması ile girilen değerlere göre survived sütununda bulunan hayatta kalıp kalmama durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %70 olarak bulundu.