저번에 배웠던 SVM은 default로 기본적인 값들 상태들에 대해서만 분석을 진행을 하였습니다.
이번에는 모델을 최적화 시키는 방법에 대해서 알아보도록 하겠습니다.
오늘의 경우 feature selection을 제외하고, Best parameter를 찾는 방법에 대해서 알아보도록 하겠습니다.
먼저 저번 모델을 불러 오도록 하겠습니다.
1. 사용할 모듈 적용시키기
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
import pandas as pd
from warnings import simplefilter
simplefilter(action='ignore',category=FutureWarning)
import seaborn as sns
2. 분석할 데이터 불어오고 정리하기
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
names = ['id', 'clump_thickness', 'uniform_cell_size', 'uniform_cell_shape','marginal_adhesion', 'single_epithelial_size', 'bare_nuclei','bland_chromatin', 'normal_nucleoli', 'mitoses', 'class']
df = pd.read_csv(url, names=names)
df.drop(['id'],1,inplace=True)
df.replace('?','-3',inplace=True)
3. train set, test set 만들기
X=np.array(df.drop(['class'],1))
y=np.array(df['class'])
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=7054)
4. 최적화 시키기
최적화에는 크게 두가지 방법이 있다.
첫번째는 저번에 SVM을 돌릴때 사용하였던 방법인 K-fold를 이용하여 진행하는 것이다.
K-fold의 경우 데이터를 N개로 등분하여 1/N개는 test set, N-1/N개는 train set으로 사용하는데 N번 train set, test set이 돌아가면서 모델을 만든다. 결과값으로는 N번 결과의 평균값을 준다.
이 경우는 약간 모델의 결과를 잘나오게 하는 꼼수?! 라고 할수가 있다. 왜냐하면 결과적으로 dataset전체를 test set, train set으로 사용한것이기 때문에 모델결과에 전체적인 모델들이 적용되었기 때문이다. (대부분 K-fold로 진행하면 잘 나오는경우가 많다.)
SVM_model=SVC(kernel='linear')
kfold=model_selection.KFold(n_splits=10,random_state=7054)
cv_result=model_selection.cross_val_score(SVM_model,X_train,y_train,cv=kfold,scoring='accuracy')
cv_result.mean() # 평균적인 결과값, 정확도
cv_result.std() # 결과값들의 표준편차
>>> msg='{0}:{1}({2})'.format('SVM',cv_result.mean(),cv_result.std())
>>> msg
'SVM:0.97144412191582(0.015236928738414214)'
두번째로 SVM에서의 parameter를 변경하는 것이다.
SVM에는 Cost, gamma 2가지 parameter가 사용된다. (rbf기준, linear 에서는 C만 받음)
모델에서 각 parameter의 값들을 볼수가 있다.
SVM_model.C # 1
SVM_model.gamma # scale
값들을 변경시켜서 다시 돌려보려면 다음과 같다.
# 일반 모델로 만들시에
SVM_model=SVC(kernel='linear',gamma=10,C=10)
SVM_model.fit(X_train,y_train)
predict1=SVM_model.predict(X_test)
accuracy_score(predict1,y_test)
# K fold적용시에
kfold=model_selection.KFold(n_splits=10,random_state=7054)
cv_result=model_selection.cross_val_score(SVM_model,X_train,y_train,cv=kfold,scoring='accuracy')
cv_result.mean()
cv_result.std()
위와 같이 최적화를 하려면 복잡한 코드를 짜야하고 귀찮다. 이걸 또 쉽게하는 방법이 GridSearchCV라는 기능이다.
GridSearchCV는 말 그대로 최적의 parameter를 알려주고 CV(Cross validation)까지 해주는 아주 유용한 기능이다.
GridSearchCV과 함께 사용하는 기능이 있는데, Pipeline이라는 기능이다. pipeline은 말 그대로 순서대로 적용시켜서 진행해준다 라고 생각하면된다.
또한 저번에 breast cancer 데이터를 이용하여 SVM model을 만들 때는 Scale을 하지 않았는데, sklearn에서의 설명에는 Scale을 진행을 하는 것을 추천하고 있다.
scikit-learn.org/stable/modules/svm.html
1.4. Support Vector Machines — scikit-learn 0.23.1 documentation
1.4. Support Vector Machines Support vector machines (SVMs) are a set of supervised learning methods used for classification, regression and outliers detection. The advantages of support vector machines are: Effective in high dimensional spaces. Still effe
scikit-learn.org
GridSearchCV사용법
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
# StandardScaler = Scale하는 기능
pipe_svc = Pipeline([('scl', StandardScaler()), ('clf', SVC(random_state=1))])
param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]
param_grid = [
{'clf__C': param_range, 'clf__kernel': ['linear']},
{'clf__C': param_range, 'clf__gamma': param_range, 'clf__kernel': ['rbf']}]
gs = GridSearchCV(estimator=pipe_svc, param_grid=param_grid,
scoring='accuracy', cv=10, n_jobs=1)
gs = gs.fit(X_train, y_train)
위와 같이 하게 되면 최적의 kernel과 최적의 parameter들을 알려준다.
또 다른 방식으로는 make_pipeline인데 다음과 같이 코딩하면된다.(위와 같은 결과를 갖는다)
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe_svc=make_pipeline(StandardScaler(),SVC())
param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]
param_grid = [
{'svc__C': param_range, 'svc__kernel': ['linear']},
{'svc__C': param_range, 'svc__gamma': param_range, 'svc__kernel': ['rbf']}]
gs = GridSearchCV(estimator=pipe_svc, param_grid=param_grid,
scoring='accuracy', cv=10, n_jobs=1)
gs = gs.fit(X_train, y_train)
위와의 차이점은 param_grid에 svc가 들어갔다는 것인데, make_pipeline을 돌리게되면 default로 SVC()는 svc를 받는다. 처음 코드의 경우 clf를 SVC를 지정을 해놨기 때문에 param_grid에서 clf라고 쓰여진다.
위에서 n_jobs라는 기능이 있는데 이는 병렬처리를 하는 것이다. 그말 즉슨 빠르게 한꺼번에 계산이 가능하도록 만들었다는 것이다.
n_jobs 값이 클수록 여러개의 계산을 동시에 진행하여 빠른 결과가 가능하다.
(그러나 돌리고있는 컴퓨터가 펜티엄이고 데이터가 크면 멈춰버릴 수 있다.;CPU코어의 수에 따라 돌아감. model.fit을 계산할 때 속도가 빠르다는 뜻.)
결과적으로 최적의 모델과 예측력(score)을 확인하기 위해서는 다음과 같이 하면된다.
참고로 fit을 필수적으로 돌려야지
gs.best_estimator_
gs.best_score_
test 적용시에는 다음과 같이 하면된다.
prediction=gs.predict(X_test)
accuracy_score(prediction,y_test)
여기까지 SVM모델의 최적화를 알아보았습니다.
다음 포스팅은 또다른 모델의 최적화에 대해서 알아보도록 하겠습니다.!
감사합니다~!
'python > Machine learning' 카테고리의 다른 글
Breast Cancer Detection with Decision tree (0) | 2020.07.17 |
---|---|
Breast Cancer Detection with K-Nearest Neighbor (KNN) (0) | 2020.07.16 |
Breast Cancer Detection with Logistic regression (0) | 2020.07.15 |
Breast Cancer Detection with Ramdom Forest Classification (0) | 2020.07.14 |
Kaggle - Breast Cancer Detection with SVM (Explanation, 설명) (0) | 2020.07.13 |
댓글