Support Vector Machine

Kategori: Machine Learning , 06 Aralık 2019 , JanFranco


Support Vector Machine algoritmasını daha önce görmüştük. Amaç maximum margin değerini bularak bir doğru çizmekti. Classification problemlerinde de kullanacağımızdan bahsetmiştim. Daha önce açıkladığımız için direk koda geçelim:


import pandas as pd
from sklearn.svm import SVC
from sklearn.impute import SimpleImputer
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler

df = pd.read_csv('veriler.csv')

missing = SimpleImputer()
age = df.iloc[:, [3]].values
age = missing.fit_transform(age)
age = pd.DataFrame(data=age, columns=['age'])

labelEncoder = LabelEncoder()
gender = df.iloc[:, [4]].values
gender = labelEncoder.fit_transform(gender.ravel())
gender = pd.DataFrame(data=gender, columns=['gender'])

oneHotEncoder = OneHotEncoder()
country = df.iloc[:, [0]].values
country = oneHotEncoder.fit_transform(country).toarray()
country = pd.DataFrame(data=country, columns=['fr', 'tr', 'us'])

hw = df.iloc[:, [1, 2]].values
hw = pd.DataFrame(data=hw, columns=['height', 'weight'])

df = pd.concat([country, hw, age, gender], axis=1)
print(df)

x = df.iloc[:, [3, 4, 5]]
y = df.iloc[:, [6]]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.33, random_state=0)

scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)

svr = SVC(kernel='rbf', gamma='auto')
svr.fit(x_train, y_train.values.ravel())
svrRes = svr.predict(x_test)

confusionMatrix = confusion_matrix(y_true=y_test, y_pred=svrRes)
print("***** Confusion Matrix - RBF *****")
print("     E   K")
print("E   ", confusionMatrix[0][0], " ", confusionMatrix[0][1])
print("K   ", confusionMatrix[1][0], " ", confusionMatrix[1][1])

svr = SVC(kernel='linear', gamma='auto')
svr.fit(x_train, y_train.values.ravel())
svrRes = svr.predict(x_test)

confusionMatrix = confusion_matrix(y_true=y_test, y_pred=svrRes)
print("***** Confusion Matrix - Linear *****")
print("     E   K")
print("E   ", confusionMatrix[0][0], " ", confusionMatrix[0][1])
print("K   ", confusionMatrix[1][0], " ", confusionMatrix[1][1])

svr = SVC(kernel='poly', gamma='auto')
svr.fit(x_train, y_train.values.ravel())
svrRes = svr.predict(x_test)

confusionMatrix = confusion_matrix(y_true=y_test, y_pred=svrRes)
print("***** Confusion Matrix - Poly *****")
print("     E   K")
print("E   ", confusionMatrix[0][0], " ", confusionMatrix[0][1])
print("K   ", confusionMatrix[1][0], " ", confusionMatrix[1][1])

>>

     fr   tr   us  height  weight    age  gender
0   0.0  1.0  0.0     130      30  10.00       0
1   0.0  1.0  0.0     125      36  11.00       0
2   0.0  1.0  0.0     135      34  10.00       1
3   0.0  1.0  0.0     133      30   9.00       1
4   0.0  1.0  0.0     129      38  12.00       0
5   0.0  1.0  0.0     180      90  30.00       0
6   0.0  1.0  0.0     190      80  25.00       0
7   0.0  1.0  0.0     175      90  35.00       0
8   0.0  1.0  0.0     177      60  22.00       1
9   0.0  0.0  1.0     185     105  33.00       0
10  0.0  0.0  1.0     165      55  27.00       1
11  0.0  0.0  1.0     155      50  44.00       1
12  0.0  0.0  1.0     160      58  28.45       1
13  0.0  0.0  1.0     162      59  41.00       1
14  0.0  0.0  1.0     167      62  55.00       1
15  1.0  0.0  0.0     174      70  47.00       0
16  1.0  0.0  0.0     193      90  28.45       0
17  1.0  0.0  0.0     187      80  27.00       0
18  1.0  0.0  0.0     183      88  28.00       0
19  1.0  0.0  0.0     159      40  29.00       1
20  1.0  0.0  0.0     164      66  32.00       1
21  1.0  0.0  0.0     166      56  42.00       1
***** Confusion Matrix - RBF *****
     E   K
E    1   0
K    5   2
***** Confusion Matrix - Linear *****
     E   K
E    0   1
K    6   1
***** Confusion Matrix - Poly *****
     E   K
E    0   1
K    7   0
Burada kötü sonuçlar almamızın sebebi veri kümesinde aykırı veriler olmasıdır. O verileri (ilk 5 satır) çıkardığımızda sonucun daha başarılı olacağını görebiliriz. Ayrıca doğrusal olmayan verileri SVM ile çözmek mümkün. Kernel trick denilen yöntem ile içe içe girmiş verileri, doğrusal olarak çözülemeyen verileri 2 boyutludan 3 boyutlaya çıkararak (veya bir başka boyuttan bir başka boyuta), iki sınıf arasında bir çizgi yerine 2 boyutlu bir düzlem çizerek ayrım yapabiliriz.


Sonraki Yazı: Naive Bayes
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın