
서포트 벡터머신(Support Vector Machine)
일반적으로 성능이 뛰어난 알고리즘이다.
데이터 크기가 중간크기 이하, 여러 변수를 기준으로 분류하는 다소 복잡한 과제에 적합한 머신러닝 기법이다.
레이블 법주를 선형적으로 구분하거나 비선형적으로 분류하는 선 혹은 초평면을 찾는 것이 핵심 과제이다.
두 집단을 가장 멀리 떨어뜨리는 최적선을 찾는다.
scikit-learn
서포트 벡터머신은 사이킷런의 svm안에 있다.
분류 알고리즘으로 SVC(Support Vector Classification)
회귀 알고리즘으로 SVR(Support Vector Regression)을 대표적으로 사용한다.
SVC에서는 C가 가장 중요한 하이퍼파라미터이며, 'kernel'도 중요하다.
kernel은 'kernel=rbf'가 디폴트값이며 linear, poly sigmoid, precomputed 등의 다양한 커널 함수를 제공한다.
C는 분류에만 존재하고 kernel은 분류, 회귀 모두 존재한다. -> 실습할 때 회귀에서 C값 지정해줬는데 뭐지,,
Part1. 분류(Classification)
서포트벡터머신은 다른 알고리즘에 비해 kernel 종류, C와 gamma 등 하이퍼파라미터가 다양하기 때문에 모델의 유연성이 뛰어난 편이다. 모델에 대한 깊은 이해가 필요하며, 대규모 데이터에는 다소 느린 학습속도를 보인다.
1) 데이터셋 나누기, 정규화
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
data=pd.read_csv('breast-cancer-wisconsin.csv', encoding='utf-8')
X=data[data.columns[1:10]]
y=data[["Class"]]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
#min-max 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_scaled_train = scaler.transform(X_train)
X_scaled_test = scaler.transform(X_test)
유방암 데이터를 이용해서 실습 시작!
2) 기본 모델 적용
#Part1. 분류(Classification)
from sklearn.svm import SVC
model = SVC()
model.fit(X_scaled_train, y_train)
pred_train = model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)
sklearn.svm으로부터 SVC 라이브러리를 가져왔다.
model에 SVC()를 넣어주고 fit - predict, score(정확도) 순으로 코드를 작성했다.
분석 결과 정확도 98%로 매우 우수한 수준을 나타냈다.
3) 오차행렬과 분류예측 레포트
from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬:\n", confusion_train)
from sklearn.metrics import classification_report
cfreport_train = classification_report(y_train, pred_train)
print("분류예측 레포트:\n", cfreport_train)
sklearn.metrics로부터 confusion_matrix, classification_report를 가져와
오차행렬과 분류예측 레포트를 확인해보았다.
정밀도(precision)와 재현율(recall)등 아주 높은 수치를 보였다.
테스트데이터도 같은 방식으로 코드를 작성하고 확인했다.
4) Grid Search
#Grid Search
param_grid = [{'kernel': ['rbf'], 'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma' : [0.001, 0.01, 0.1, 1, 10, 100]},
{'kernel': ['linear'], 'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}]
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_scaled_train, y_train)
print("Bset Parameter:\n".format(grid_search.best_params_))
print("Best score:{:.4f}".format(grid_search.best_score_))
print("TestSet score:{:.4f}".format(grid_search.score(X_scaled_train, y_train)))

하이퍼파라미터 중 kernel을 'rbf'와 'linear'
'C'는 0.001, 0.01, 0.1, 1, 10, 100으로 6가지
'gamma'도 0.001, 0.01, 0.1, 1 ,10, 100 6가지로 조합했다.
최적의 파라미터결과는 'C'는 100, 'gamma'는 0.01, 'kernel'은 'rbf'로 나타났다고는 하지만
내 주피터 노트북에는 공백으로 나온다. 이유는 모르겠다..
5) Random Search
#Random Search
from scipy.stats import randint
param_distribs={'kernel':['rbf'], 'C':randint(low=0.001,high=100),'gamma':randint(low=0.001,high=100)}
from sklearn.model_selection import RandomizedSearchCV
random_search = RandomizedSearchCV(SVC(), param_distributions=param_distribs, n_iter=100, cv=5)
random_search.fit(X_scaled_train, y_train)
print("Best Parameter:\n".format(random_search.best_params_))
print("Best score:{:.4f}".format(random_search.best_score_))
print("TestSet score:{:.4f}".format(random_search.score(X_scaled_train, y_train)))

랜덤서치로 kernel은 'rbf', C는 0.001~100, gamma는 0.001~100
100번 무작위(n_iter=100) 모델을 수행했다.
최적의 파라미터는 'C'는 19, 'gamma'는 5, kernel은 rbf로 나타났다고는 하지만
내 주피터 노트북에는 해당 부분이 공백으로 나타났다.
Part2. 회귀(Regression)
서포트벡터머신의 회귀 알고리즘 SVR은 kernel에 민감하다. 5가지 kernel중 가장 잘 맞는 것을 선정하는 것이 중요하다.
그리드탐색, 랜덤탐색 하는데 걸리는 시간은 데이터가 많아지면 상당히 길어진다. 따라서 많은 데이터에서 적용하기 어렵다고 할 수 있다.
1) 데이터셋 나누기와 정규화
import pandas as pd
data2 = pd.read_csv('house_price.csv', encoding='utf=8')
X=data2[data2.columns[1:5]]
y=data2[["house_value"]]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 42)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_scaled_train = scaler.transform(X_train)
X_scaled_test = scaler.transform(X_test)
'house price.csv' 데이터를 다시 가져와 실습했다.
2) 기본모델 적용
#Part2. 회귀(Regression) : SVR
from sklearn.svm import SVR
model = SVR(kernel='poly')
model.fit(X_scaled_train, y_train)
pred_train = model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)
pred_test = model.predict(X_scaled_test)
model.score(X_scaled_test, y_test)
SVR kernel값을 'poly'로 지정해주었다. (이유는 5가지 kernel중 이게 제일 높은 정확도 보임)
훈련데이터 정확도는 약 47%로 상식적인 수준으로 보인다.
테스트데이터에서의 정확도는 다른 회귀 알고리즘에 비해 10%낮은 정확도를 보였다.
3) 오차값 확인
#RMSE(Root Mean Squared Error)
import numpy as np
from sklearn.metrics import mean_squared_error
MSE_train = mean_squared_error(y_train, pred_train)
MSE_test = mean_squared_error(y_test, pred_test)
print("훈련데이터 RMSE: ", np.sqrt(MSE_train))
print("테스트데이터 RMSE: ", np.sqrt(MSE_test))
4) Grid Search
#Grid Search
param_grid={'kernel':['poly'], 'C':[0.01,0.1,1,10], 'gamma':[0.01,0.1,1,10]}
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(SVR(), param_grid, cv=5)
grid_search.fit(X_scaled_train, y_train)
print("Best Parameter: {}".format(grid_search.best_params_))
print("Best score: {:.4f}".format(grid_search.best_score_))
print("TestSet score: {:.4f}".format(grid_search.score(X_scaled_test, y_test)))

Kernel은 poly로 고정, C와 gamma를 몇 가지로 설정하여 분석해보았다.
C는 10, gamma도 10일때 최적의 결과를 나타내었다.
훈련데이터 정확도 48.9%, 테스트데이터 정확도 51%정도로 다른 모델에 비해 낮은편이다.
5) Random Search
params_distribs = {'kernel':['poly'], 'C':randint(low=0.01, high=10), 'gamma':randint(low=0.01, high=10)}
from sklearn.model_selection import RandomizedSearchCV
random_search = RandomizedSearchCV(SVR(), param_distributions=params_distribs, n_iter=20, cv=5)
random_search.fit(X_scaled_train, y_train)
print("Best Parameter: {}".format(random_search.best_params_))
print("Best score: {:.4f}".format(random_search.best_score_))
print("TestSet score: {:.4f}".format(random_search.score(X_scaled_test, y_test)))

C와 gamma를 0.01~10 사이로 설정하였고, 수행횟수는 20회(n_iter)로 설정했다.
(2017년산 노트북으로 돌리니까 결과 보는데 5분 넘게 걸렸다.)
C는 5, gamma는 9일때 최적의 결과를 나타내었다.
훈련데이터 정확도는 45.7%, 테스트데이터는 48.2% 정확도를 보였고 역시나 낮은 편이다.
'자기계발 > Python' 카테고리의 다른 글
| [빅데이터분석기사] 19 랜덤포레스트 (0) | 2022.06.22 |
|---|---|
| [빅데이터분석기사] 18 의사결정나무 (0) | 2022.06.22 |
| [빅데이터분석기사] 16 인공신경망 (0) | 2022.06.21 |
| [빅데이터분석기사] 15 나이브 베이즈 (0) | 2022.06.21 |
| [빅데이터분석기사] 14 K-최근접이웃법(KNN) (0) | 2022.06.21 |