자기계발/Python

[빅데이터분석기사] 17 서포트 벡터머신

호등 2022. 6. 22. 10:26
반응형

서포트 벡터머신(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% 정확도를 보였고 역시나 낮은 편이다.

 

반응형