1 Iris 데이터를 이용한 SVM 커널 실습
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2021)
1.1 1. Data
from sklearn.datasets import load_iris
iris = load_iris()
data = iris.data
target = iris.target
data = data[target !=0, :2]
target = target[target !=0]
plt.scatter(data[:, 0], data[:, 1], c=target)

from sklearn.model_selection import train_test_split
train_data, test_data, train_target, test_target = train_test_split(
data, target, train_size=0.9, random_state=2021
)
1.2 2. Linear Kernel
SVM은 sklearn.svm 의 SVC로 사용할 수 있습니다.
from sklearn.svm import SVC
우선 가장 기본적인 svm 커널인 linear 커널을 사용해 보겠습니다
linear_svc = SVC(kernel="linear")
linear_svc.fit(train_data, train_target)
아래는 svm의 결과를 시각화 하기 위한 함수입니다.
def plot_support_vector_machine(svm):
# 전체 데이터
plt.scatter(data[:, 0], data[:, 1], c=target, zorder=10, cmap=plt.cm.Paired,
edgecolor='k', s=20)
# test 데이터
plt.scatter(test_data[:, 0], test_data[:, 1], s=80, facecolors='none',
zorder=10, edgecolor='k')
plt.axis('tight')
x_min = data[:, 0].min()
x_max = data[:, 0].max()
y_min = data[:, 1].min()
y_max = data[:, 1].max()
# 영역 칠하기
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = svm.decision_function(np.c_[XX.ravel(), YY.ravel()])
Z = Z.reshape(XX.shape)
plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired, shading="auto")
plt.contour(XX, YY, Z, colors=['k', 'k', 'k'],
linestyles=['--', '-', '--'], levels=[-.5, 0, .5])
아래 plot의 속성들은 다음과 같습니다.
- decision boundary
- 검은색 직선
- support vector
- 검은색 점선
- 영역
- 클래스로 구별되는 영역
plt.figure(figsize=(7,7))
plot_support_vector_machine(linear_svc)

1.3 3. Poly Kernel
다음으로 알아볼 커널은 poly 커널 입니다.
poly커널은 직선을 곡선으로 mapping 시켜주는 커널입니다.
poly커널에 영향을 미치는 argument들은 다음과 같습니다.
- gamma
- 결경 경계를 스케일링해주는 값입니다.
- degree
- 몇 차원의 곡선으로 맵핑할지 정해주는 값입니다.
1.3.1 3.1 gamma
1.3.1.1 3.1.1 "scale"
default 옵션은 자동으로 scaling 해줍니다.
poly_svc = SVC(kernel="poly")
poly_svc.fit(train_data, train_target)
plt.figure(figsize=(7,7))
plot_support_vector_machine(poly_svc)

1.3.1.2 3.1.2 gamma=0.1
gamma값을 작게 주면 다음과 같습니다.
poly_svc = SVC(kernel="poly", gamma=0.1)
poly_svc.fit(train_data, train_target)
plt.figure(figsize=(7,7))
plot_support_vector_machine(poly_svc)

1.3.1.3 3.1.3 gamma=10
gamma값을 크게 주면 다음과 같습니다
poly_svc = SVC(kernel="poly", gamma=10)
poly_svc.fit(train_data, train_target)
plt.figure(figsize=(7,7))
plot_support_vector_machine(poly_svc)

1.3.2 3.2 degree
1.3.2.1 3.2.1 degree=2
poly_svc = SVC(kernel="poly", gamma=10, degree=2)
poly_svc.fit(train_data, train_target)
plt.figure(figsize=(7,7))
plot_support_vector_machine(poly_svc)

1.3.2.2 3.2.1 degree=4
poly_svc = SVC(kernel="poly", gamma=10, degree=4)
poly_svc.fit(train_data, train_target)
plt.figure(figsize=(7,7))
plot_support_vector_machine(poly_svc)

1.4 4. RBF Kernel
다음으로 알아볼 것은 rbf커널 입니다.
rbf 커널은 데이터를 고차원의 공간으로 mapping시켜줍니다.
rbf또한 gamma 값으로 scaling을 합니다.
1.4.1 4.1 "scale"
rbf_svc = SVC(kernel="rbf")
rbf_svc.fit(train_data, train_target)
plt.figure(figsize=(7, 7))
plot_support_vector_machine(rbf_svc)

1.4.2 4.2 gamma=0.1
rbf_svc = SVC(kernel="rbf", gamma=0.1)
rbf_svc.fit(train_data, train_target)
plt.figure(figsize=(7, 7))
plot_support_vector_machine(rbf_svc)

1.4.3 4.3 gamma=10
rbf_svc = SVC(kernel="rbf", gamma=10)
rbf_svc.fit(train_data, train_target)
plt.figure(figsize=(7, 7))
plot_support_vector_machine(rbf_svc)

1.5 5. Penalty
패너티는 C argument를 통해 줄 수 있습니다.
1.5.1 5.1 Poly
poly_svc = SVC(kernel="poly", gamma=10)
poly_svc.fit(train_data, train_target)
hard_penalty_poly_svc = SVC(kernel="poly", gamma=10, C=100)
hard_penalty_poly_svc.fit(train_data, train_target)
plt.figure(figsize=(14, 7))
plt.subplot(1,2,1)
plot_support_vector_machine(poly_svc)
plt.title("No penalty")
plt.subplot(1,2,2)
plot_support_vector_machine(hard_penalty_poly_svc)
plt.title("Hard penalty")
# 패널티의 유무는 서포트 백터가 가까워지냐 차이

1.5.2 5.2 RBF
rbf_svc = SVC(kernel="rbf", gamma=10)
rbf_svc.fit(train_data, train_target)
hard_penalty_svc = SVC(kernel="rbf", gamma=10, C=100)
hard_penalty_svc.fit(train_data, train_target)
plt.figure(figsize=(14, 7))
plt.subplot(1,2,1)
plot_support_vector_machine(rbf_svc)
plt.title("No penalty")
plt.subplot(1,2,2)
plot_support_vector_machine(hard_penalty_svc)
plt.title("Hard penalty")
# 패널티가 클때는 파란색영역내 갈색, 갈색영역내 파란색이 생김.

'Machine Learning > 머신러닝 온라인 강의' 카테고리의 다른 글
CH08_01. Clustering (0) | 2022.10.18 |
---|---|
CH07_04. 얼굴 사진 분류(Python) (0) | 2022.10.18 |
CH07_01. SVM (0) | 2022.10.12 |
CH06_04. 음수 가능 여부 판단 (Python) (0) | 2022.10.12 |
CH06_02. KNN 실습 (Python) (0) | 2022.10.11 |