본문 바로가기
머신러닝

[머신러닝] SVM(Support Vector Machine)

by eyoo 2022. 5. 9.

서포트 벡터 머신(SVM)은 분류선(Maximum Margin Classifer)을 기준으로 데이터를 분류할수있다.

 

# 분류선에 제일 근접한 데이터를, 가장 큰 마진으로 설정하는 선으로 결정한다.

# 이를 통해 분류하기 애매한것들을 쉽게 분류할수있다. (예시: 노란 사과와 오렌지, 초록색 오렌지와 초록색 사과 등)

 

 

df= 

 

먼저 전처리과정을 진행한다.

 

df.isna().sum()  #Nan 없음

X = df.loc[:,'Age':'EstimatedSalary']
y = df['Purchased']

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

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

 

 

SVM을 통해 분류작업을 하기위해 SVC를 사용한다.

 

from sklearn.svm import SVC
classifier = SVC(kernel= 'linear',random_state=3)

# kernel 파라미터를 리니어로 설정했다.

 

 

SVM 인공지능을 학습시킨다.

 

classifier.fit(X_train,y_train)

 

 

이제 성능을 확인해보자

 

먼저 컨퓨전 매트릭스를 나타내고

 

in:

y_pred = classifier.predict(X_test)
from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(y_test,y_pred)
cm

out:

array([[61,  4],
       [13, 22]], dtype=int64)

 

 

차트로 컨퓨전 매트릭스를 그린다.

 

in:

import seaborn as sb
sb.heatmap(data=cm, annot=True, cmap='RdPu')
plt.show()

out:

 

 

accuracy_score로 정확도를 나타내자 

 

in:

accuracy_score(y_test,y_pred)

out:

0.83

# SVM을 리니어 커널로 설정했더니 정확도가 83%이 나왔다.

 

 

선형으로 분리하기 어렵거나 정확도가 떨어질때, pbf커널을 사용해보자

 

 

 

# 원형으로 안쪽과 바깥쪽으로 서로 다른 데이터셋이 있어 단순히 선만으로 분류하는것은 어렵다.

# 따라서 3차원으로 구분하여 분류한다.

 

 

커널을 rbf로 설정하여 다시 모델링해보자.

 

classifier2 = SVC(kernel= 'rbf', random_state= 3)
classifier2.fit(X_train,y_train)

 

 

이제 정확도를 평가해보자

 

in:

y_pred2 = classifier2.predict(X_test)
accuracy_score(y_test,y_pred2)

out:

0.89

# 리니어 커널을 했을때보다 약 6%p 더 높은 89%가 나왔다.

# 이 데이터셋은 rbf로 커널을 설정했을때 더 높은 정확도를 보이는것을 알수있다.

 

 

각 커널별 SVM을 차트로 나타내면:

 

리니어 커널 SVM

 

 

rbf 커널 SVM

 

# rbf 커널로 설정한 SVM은 조금 더 굴곡진 차트로 생성된것을 볼수있다.

 

 

 

 

 

댓글