갈루아의 반서재

서포터 벡터 머신과 이미지 인식 (3) - 서포트 벡터 머신 훈련 (1)


서포트 벡터 머신 훈련


scikit-learn 의 SVM 을 사용하기 위해 sklearn.svm 모듈에서 SVC 클래스를 임포트한다. SVC를 초기화할 때는 중요한 매개변수를 가진다. 분류기에서 사용하는 커널 함수를 정의하는 kernel 이다(커널 함수는 인스턴스 간의 유사도 측정을 다르게 한다). 가장 간단한 커널이 linear을 사용하자.

1
2
>>> from sklearn.svm import SVC
>>> svc_1 = SVC(kernel='linear')
cs


데이터셋을 훈련 데이터와 테스트 데이터로 구분한다.

1
2
>>> from sklearn.cross_validation import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(faces.data, faces.target, test_size=0.25, random_state=0)
cs


K-중첩 교차 검증로 평가하는 함수를 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> from sklearn.cross_validation import cross_val_score, KFold
>>> from scipy.stats import sem
>>> 
>>>  def evaluate_cross_validation(clf, X, y, K):
>>>     # k-중첩 교차 검증 생성기를 만든다.
>>>     cv = KFold(len(y), K, shuffle=True, random_state=0)
>>>     # 기본적으로 점수함수는 에스터메이터의 점수 함수로 반환된 함수를 사용한다(정확도).
>>>     scores = cross_val_score(clf, X, y, cv=cv)
>>>     print scores
>>>     print ("Mean score: {0:.3f} (+/-{1:.3f})").format(np.mean(scores), sem(scores))
>>>   
>>> evaluate_cross_validation(svc_1, X_train, y_train, 5)
 
0.93333333  0.86666667  0.91666667  0.93333333  0.91666667]
Mean score: 0.913 (+/-0.012)
cs


5-중첩 교차 검증은 꽤 좋은 결과를 얻는다(0.933의 정확도). 단지 몇 단계로 얼굴 분류기를 만들었다.


훈련 데이터에 대한 훈련을 수행하고 테스터 데이터에 대한 성능을 평가하는 함수도 정의한다. 훈련 후 평가하면 분류기는 거의 오차없이 수행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
>>> from sklearn import metrics
>>> 
>>> def train_and_evaluate(clf, X_train, X_test, y_train, y_test):
>>>   
>>>     clf.fit(X_train, y_train)
>>>     
>>>     print "Accuracy on training set:"
>>>     print clf.score(X_train, y_train)
>>>     print "Accuracy on testing set:"
>>>     print clf.score(X_test, y_test)
>>>     
>>>     y_pred = clf.predict(X_test)
>>>     
>>>     print "Classification Report:"
>>>     print metrics.classification_report(y_test, y_pred)
>>>     print "Confusion Matrix:"
>>>     print metrics.confusion_matrix(y_test, y_pred)
>>>     
>>> train_and_evaluate(svc_1, X_train, X_test, y_train, y_test)
 
Accuracy on training set:
1.0
Accuracy on testing set:
0.99
Classification Report:
             precision    recall  f1-score   support
 
          0       0.86      1.00      0.92         6
          1       1.00      1.00      1.00         4
          2       1.00      1.00      1.00         2
          3       1.00      1.00      1.00         1
          4       1.00      1.00      1.00         1
          5       1.00      1.00      1.00         5
          6       1.00      1.00      1.00         4
          7       1.00      0.67      0.80         3
          9       1.00      1.00      1.00         1
         10       1.00      1.00      1.00         4
         11       1.00      1.00      1.00         1
         12       1.00      1.00      1.00         2
         13       1.00      1.00      1.00         3
         14       1.00      1.00      1.00         5
         15       1.00      1.00      1.00         3
         17       1.00      1.00      1.00         6
         19       1.00      1.00      1.00         4
         20       1.00      1.00      1.00         1
         21       1.00      1.00      1.00         1
         22       1.00      1.00      1.00         2
         23       1.00      1.00      1.00         1
         24       1.00      1.00      1.00         2
         25       1.00      1.00      1.00         2
         26       1.00      1.00      1.00         4
         27       1.00      1.00      1.00         1
         28       1.00      1.00      1.00         2
         29       1.00      1.00      1.00         3
         30       1.00      1.00      1.00         4
         31       1.00      1.00      1.00         3
         32       1.00      1.00      1.00         3
         33       1.00      1.00      1.00         2
         34       1.00      1.00      1.00         3
         35       1.00      1.00      1.00         1
         36       1.00      1.00      1.00         3
         37       1.00      1.00      1.00         3
         38       1.00      1.00      1.00         1
         39       1.00      1.00      1.00         3
 
avg / total       0.99      0.99      0.99       100
 
Confusion Matrix:
[[6 0 0 ..., 0 0 0]
 [0 4 0 ..., 0 0 0]
 [0 0 2 ..., 0 0 0]
 ..., 
 [0 0 0 ..., 3 0 0]
 [0 0 0 ..., 0 1 0]
 [0 0 0 ..., 0 0 3]]
cs