Python을 이용한 SVM (1)

요구사항

  1. 이 과제 Multiclass SVM을 직접 구현하시는 것입니다. 기본적으로 사이킷 런에 있는 SVM은 멀티클래스 SVM을 지원합니다. 그러나 과제에서는 그것을 쓰면 안됩니다! 아이리스 데이터는 총 세 개의 클래스가 있으므로 이 클래스를 one-hot 인코딩 한 뒤, 각각 binary SVM을 트레이닝하고 이 결과를 조합하여 multiclass SVM을 구현하는 것입니다.

  2. 위에서 말했듯 기본적으로 one vs one, one vs rest 방법이 있으며 어떤 것을 구현하든 자유입니다. 만약 투표결과 동점이 나온경우(예를 들어 각각의 SVM의 결과가 A vs B C의 경우 A로 판별 , B vs A C의 결과 B로 판별, C vs A B의 경우 C로 판별한 경우 투표를 통해 class를 결정할 수 없음) decision_function을 활용하시거나, 가장 개수가 많은 클래스를 사용하시거나 랜덤으로 하나를 뽑거나 하는 방법 등을 이용해 동점자인 경우를 판별해주시면 됩니다. 공식 문서를 보면 사이킷런이 어떤 방법으로 구현했는지가 글로 나와 있으므로 참조하셔도 무관합니다.

  3. 과제코드에는 제가 iris 데이터를 로드하고 iris 데이터를 one hot hot인코딩 한 부분까지 구현해 놓았습니다. 또한 decision function을 호출해서 사용하는 예시도 하나 넣어 놓았으니 참고하시면 됩니다. 개인적으로 one vs rest가 더 구현하기 쉬울것으로 생각되며, 생각보다 코드가 길지 않고 어렵지 않습니다.

우수과제 선정이유

클래스로 구현해 실제 함수로도 쓸 수 있게끔 깔끔하게 구현하고, one vs one 알고리즘까지 구현해 우수과제로 선정되었습니다.

Import packages

In [1]:

# data
import numpy as np
import pandas as pd

# visualization
import matplotlib.pyplot as plt
import seaborn as sns

# model
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import *

import warnings
warnings.filterwarnings(action='ignore')

Load iris data

In [2]:

Out[2]:

Split Data & Scaling

In [3]:

In [4]:

Implement One vs Rest Multiclass SVM

  • One vs Rest SVM 을 Class로 구현하였습니다.

In [5]:

In [6]:

In [7]:

Out[7]:

0

0

versicolor

1

versicolor

2

versicolor

3

virginica

4

virginica

5

virginica

6

setosa

7

virginica

8

setosa

9

versicolor

10

virginica

11

setosa

12

setosa

13

virginica

14

versicolor

15

versicolor

16

setosa

17

versicolor

18

virginica

19

virginica

20

setosa

21

virginica

22

versicolor

23

versicolor

24

virginica

25

setosa

26

setosa

27

virginica

28

virginica

29

versicolor

In [8]:

  • 사실상 one vs rest svm의 경우 투표의 개념을 도입할 필요 없이 decision function 값만 비교해주어도 된다!

  • 이를 이용해서 다시 간단하게 구현해보자

In [9]:

In [10]:

Implement One vs One Multiclass SVM

  • One vs One SVM 을 Class로 구현하였습니다.

In [11]:

In [12]:

In [13]:

Out[13]:

0

0

versicolor

1

versicolor

2

versicolor

3

virginica

4

virginica

5

virginica

6

setosa

7

virginica

8

setosa

9

versicolor

10

virginica

11

setosa

12

setosa

13

virginica

14

versicolor

15

versicolor

16

setosa

17

versicolor

18

virginica

19

virginica

20

setosa

21

virginica

22

versicolor

23

versicolor

24

virginica

25

setosa

26

setosa

27

virginica

28

virginica

29

versicolor

In [14]:

Compare Result

In [16]:

Out[16]:

  • One vs Rest Accuracy: 0.86667

  • One vs One Accuracy: 0.86667

  • Library Accuracy: 0.86667

    • 모두 같은 성능을 보이고 있다!

Last updated

Was this helpful?