본문 바로가기
Machine Learning

성능 향상 (그리드 서치)

by Nowkeeh Ahc

 대부분의 머신러닝 모형은 고유한 인자가 존재하는데 이 인자의 값을 어떻게 설정하느냐에 따라 모형의 성능이 달라진다. 따라서, 최적의 인자값을 결정하는 일이 모형의 성능을 향상시킬 수 있는 또 하나의 방법이 된다. 그리드 서치 (Gird Search)는 최적의 인자값을 결정하기 위한 편리한 방법 중 하나로서, 가능한 모든 인자값의 조합을 시도하여 가장 우수한 성능을 보이는 인자값을 찾아준다. 

 그리드 서치는 sklearn.model_selection 모듈의 GridSearchCV( ) 함수에 구현되어 있다. GridSearchCV( ) 함수는 딕셔너리 형태의 객체를 반환하는데, 이 딕셔너리 객체의 키는 인자의 이름이고, 값은 탐색할 인자의 설정값이 된다.

이진변수 'D'  를 종속값으로하는 K-NN 분류 모형의 주요 인자인 k의 최적값을 1부터 50 사이에서 결정하는 예제를 살펴보자. 

#1. 모듈 및 함수 불러오기
from sklearn.model_selection import GridSearchCV

#2. 변수 지정(독립변수/종속변수) 
X = df[['A', 'B', 'C']]
Y = df['D']

#3. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

#4. 검색 대상 인자 생성
mylist = list(range(1,50))
k_list = [x for x in mylist if x %2 !=0]
parameter_grid = {'n_neighbors':k_list}

#5. 그리드 서치 수행
grid_search = GridSearchCV(KNeighborsClassifier(), parameter_grid, cv = 10)
grid_search.fit(X_train, Y_train)

print('최적의 인자 :', grid_search.best_params_)

▶ 4. range( ) 함수로 1부터 50 사이의 연속적인 값을 리스트 형태로 변환하여 mylist 객체에 저장한다. mylist에 저장된 1부터 50의 값 중 홀수만 추출하여 k_list에 저장한다. K-NN 모형의 k는 클래스를 판단하기 위해 참조하는 최근접 이웃의 개수로서 과반수로 클래스를 판단하기 때문에 k값은 보통 홀수로 설정하게 된다. ‘n_neighbors’라는 키와 후보 k값인 k_list를 값으로 parameter_grid라는 딕셔너리 객체를 만들었다. 

▶ 5. GridSearchCV( ) 함수를 통해 그리드 서치 객체를 생성한다. GridSearchCV( ) 함수는 목표로 하는 머신러닝 모형 함수, 최적값을 찾고자 하는 인자 딕셔너리, 그리고 교차검증의 횟수(여기에서는 10)를 인자로 사용한다. 생성된 그리드 서치 객체의 fit( ) 함수를 이용하여 학습용 데이터 세트에 적용한다.

예를 들어 출력 결과를 다음과 같다고 했을 때

최적의 인자 : {'n_neighbors': 9}

K-NN 모형에서 사용할 클래스 판단 기준 최근접 이웃의 개수는 9개라는 것을 의미한다. 


This post was written based on what I read and studied the book below.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747

댓글