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))
'Statistics > BSA' 카테고리의 다른 글
230529 / BSA13. k-means clustering (0) | 2023.05.29 |
---|---|
230524 / BSA12. 트리 앙상블 (Tree Ensemble) (0) | 2023.05.29 |
230524 / BSA12. 분류 나무 (Classification Tree) (0) | 2023.05.29 |
230522 / BSA12. pyspark에서 Logistic Regression (0) | 2023.05.24 |
230517 / BSA11. pyspark에서 통계 모델링 (0) | 2023.05.20 |