230529 / BSA13. SVM Classification

BSA08_SVM-Classification.ipynb

 

패키지 호출

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Image
%matplotlib inline

import sklearn
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# !pip install mlxtend
from mlxtend.plotting import plot_decision_regions

 

데이터 불러오기 및 전처리

iris = datasets.load_iris()

# 설명변수, 반응변수 분리
# 첫번째(sepal length)와 세번째(petal length) 변수만 추출하여 x로 할당
x = iris.data[:, [0, 2]]
y = iris.target

# 학습자료, 검증자료 분리
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size=0.3, random_state=1, stratify=y)

# 표준화
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)

# x_train_std의 평균과 표준편차
print('Mean of x_train_std:',np.mean(x_train_std[:,0]), np.mean(x_train_std[:,1]))
print('Stdof x_train_std:',np.std(x_train_std[:,0]), np.std(x_train_std[:,1]))

 

1. SVC

# C가 작은 경우(오분류를 관대하게 허용)
# SVC 클래스에 kernel='linear', 시드넘버는 1, C=0.1로 설정
svm_smallc = SVC(kernel='linear', random_state=1, C=0.1)
svm_smallc.fit(x_train_std, y_train)

# 표준화된 것과 안된 것
x_combined_std = np.vstack((x_train_std, x_test_std))
y_combined = np.hstack((y_train, y_test))

# 데이터와 결정경계그림
plot_decision_regions(x_combined_std, y_combined, clf=svm_smallc)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

# 예측값과 관측값 비교
y_pred = svm_smallc.predict(x_test_std)
y_pred,(y_test!=y_pred)
print('Misclassified samples: %d' % (y_test!=y_pred).sum())

# 정확도 계산
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
# C가 큰 경우(오분류를 엄격하게 허용)
# SVC 클래스에 kernel='linear', 시드넘버는 1, C=10로 설정
svm_largec = SVC(kernel='linear', random_state=1, C=10)  # C값을 크게 설정하면 오분류율이 줄어듦
svm_largec.fit(x_train_std, y_train)

# 데이터와 결정경계그림
plot_decision_regions(x_combined_std, y_combined, clf=svm_largec)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

# 예측값과 관측값 비교
y_pred= svm_largec.predict(x_test_std)
y_pred,(y_test!=y_pred)
print('Misclassified samples: %d' % (y_test!=y_pred).sum())

#정확도 계산
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

 

2. Kernel SVM

# Kernel SVM : Gamma의 값에 따른 결정경계면의 변화
# gamma가 작을 때: 1
# SVC 클래스에 kernel='rbf', 시드넘버는 1, gamma=1로 설정
svm_k_smallg = SVC(kernel='rbf', random_state=1, gamma=1)  # rbf : 비선형 결정경계
svm_k_smallg.fit(x_train_std, y_train)

# 데이터와 결정경계그림
plot_decision_regions(x_combined_std, y_combined, clf=svm_k_smallg)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

# 예측값과 관측값 비교
y_pred= svm_k_smallg.predict(x_test_std)
y_pred,(y_test!=y_pred)
print('Misclassified samples: %d' % (y_test!=y_pred).sum())

# 정확도 계산
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
# Kernel SVM : Gamma의 값에 따른 결정경계면의 변화
# gamma가 클 때: 100
# SVC 클래스에 kernel='rbf', 시드넘버는 1, gamma=100로 설정
svm_k_largeg= SVC(kernel='rbf', random_state=1, gamma=100)
svm_k_largeg.fit(x_train_std, y_train)

# 데이터와 결정경계그림
plot_decision_regions(x_combined_std, y_combined, clf=svm_k_largeg)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

# 예측값과 관측값 비교
y_pred = svm_k_largeg.predict(x_test_std)
y_pred,(y_test!=y_pred)
print('Misclassified samples: %d' % (y_test!=y_pred).sum())

# 정확도 계산
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))