기계 학습 모델을 개발할 때, 성능을 극대화하기 위해서는 모델의 하이퍼파라미터를 적절히 설정하는 것이 중요합니다. 하이퍼파라미터란 모델의 학습 과정에 직접적으로 영향을 미치는 변수로, 학습률, 신경망의 레이어 수, 뉴런 수, 정규화 계수 등이 포함됩니다. 하지만 최적의 하이퍼파라미터를 찾는 과정은 쉽지 않습니다. 이 글에서는 대표적인 매개변수 탐색 알고리즘과 그 특징에 대해 알아보겠습니다.
1. 그리드 탐색(Grid Search)
그리드 탐색은 모든 가능한 매개변수 조합을 체계적으로 탐색하는 방법입니다. 사용자가 지정한 각 매개변수의 값들에 대해 모든 조합을 시도하며, 가장 성능이 좋은 조합을 찾습니다.
간단한 예제
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# 데이터와 모델 정의
X, y = [[1, 2], [2, 4], [3, 6]], [0, 1, 0]
model = SVC()
# 하이퍼파라미터 설정
param_grid = {'kernel': ['linear', 'rbf'], 'C': [0.1, 1, 10]}
# 그리드 탐색 수행
grid_search = GridSearchCV(model, param_grid, cv=3)
grid_search.fit(X, y)
print("최적의 매개변수:", grid_search.best_params_)
2. 랜덤 탐색(Random Search)
랜덤 탐색은 그리드 탐색과 달리, 무작위로 매개변수 조합을 샘플링하여 최적의 조합을 찾는 방법입니다. 특정 범위 내에서 매개변수를 랜덤하게 선택하므로, 탐색 시간이 짧고 효율적일 수 있습니다.
간단한 예제
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
import numpy as np
# 데이터와 모델 정의
X, y = [[1, 2], [2, 4], [3, 6]], [0, 1, 0]
model = RandomForestClassifier()
# 랜덤 탐색용 매개변수 설정
param_dist = {'n_estimators': np.arange(10, 100, 10), 'max_depth': [None, 10, 20, 30]}
# 랜덤 탐색 수행
random_search = RandomizedSearchCV(model, param_dist, n_iter=10, cv=3, random_state=42)
random_search.fit(X, y)
print("최적의 매개변수:", random_search.best_params_)
3. 베이즈 최적화(Bayesian Optimization)
베이즈 최적화는 이전 탐색 결과를 바탕으로 확률적 모델을 만들어 매개변수를 탐색하는 방법입니다. 대표적인 라이브러리로는 scikit-optimize가 있습니다.
간단한 예제
from skopt import BayesSearchCV
from sklearn.svm import SVC
# 데이터와 모델 정의
X, y = [[1, 2], [2, 4], [3, 6]], [0, 1, 0]
model = SVC()
# 베이즈 탐색용 매개변수 설정
param_space = {'C': (0.1, 10.0, 'log-uniform'), 'kernel': ['linear', 'rbf']}
# 베이즈 탐색 수행
bayes_search = BayesSearchCV(model, param_space, n_iter=10, cv=3, random_state=42)
bayes_search.fit(X, y)
print("최적의 매개변수:", bayes_search.best_params_)
4. 진화 알고리즘(Evolutionary Algorithms)
진화 알고리즘은 자연 선택의 원리를 바탕으로 매개변수를 최적화하는 방법입니다. DEAP 라이브러리가 대표적입니다.
간단한 예제
from deap import base, creator, tools, algorithms
import random
# 목표 함수 정의
def objective(individual):
x, y = individual
return -(x**2 + y**2), # 최대화 문제
# 설정 초기화
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
# 개체 및 툴 정의
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -10, 10)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=2)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 연산 등록
toolbox.register("mate", tools.cxBlend, alpha=0.5)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.2)
toolbox.register("select", tools.selTournament, tournsize=3)
toolbox.register("evaluate", objective)
# 진화 수행
population = toolbox.population(n=10)
algorithms.eaSimple(population, toolbox, cxpb=0.7, mutpb=0.2, ngen=50, verbose=False)
best_ind = tools.selBest(population, k=1)[0]
print("최적의 개체:", best_ind, "적합도:", best_ind.fitness.values)
5. 하이퍼밴드(Hyperband)
하이퍼밴드는 자원의 효율적 분배를 통해 매개변수를 탐색합니다. hyperopt 라이브러리를 이용해 구현할 수 있습니다.
간단한 예제
from hyperopt import fmin, tpe, hp, Trials
# 목표 함수 정의
def objective(space):
x = space['x']
return (x - 3) ** 2
# 탐색 공간 정의
space = {
'x': hp.uniform('x', -10, 10)
}
# 하이퍼밴드 탐색 수행
trials = Trials()
best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=50, trials=trials)
print("최적의 매개변수:", best)
'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글
[알고리즘] Union-Find 유니온-파인드(Disjoint Set Union) (0) | 2025.01.21 |
---|---|
[알고리즘] 분할정복(Divide and Conquer) (1) | 2024.10.07 |
[알고리즘] 프림 알고리즘(Prim) (0) | 2024.09.30 |
[알고리즘] Greedy Algorithm - Interval Scheduling (0) | 2024.09.23 |
[알고리즘] 비트마스크(BitMask) (0) | 2024.09.20 |