머신 러닝 모델의 성능은 사용된 데이터, 모델의 구조, 그리고 모델을 구성하는 하이퍼파라미터에 의해 결정됩니다. 특히 하이퍼파라미터의 설정은 모델의 성능을 최적화하는 데 매우 중요한 역할을 합니다. 하이퍼파라미터 튜닝을 위해 많이 사용되는 방법 중 하나가 바로 그리드 서치(Grid Search)입니다. 이 방법은 가능한 많은 하이퍼파라미터 조합을 시도하여 최적의 조합을 찾아내는 과정을 포함합니다.
머신러닝에서 분류문제에 대해 공부하던 중, UCI HAR Dataset에 대해 그리드 서치를 통해 찾은 하이퍼 파라미터가 실제 테스트 데이터에서 최고의 성능을 보여주지 못하는 현상을 발견했습니다.
이 블로그 포스트에선 이 문제를 해결하기 위해 구글링을 하며 알게된 것들을 정리하려고 합니다. 그리드 서치를 사용한 하이퍼파라미터 튜닝의 과정과 이러한 방법의 한계점, 또한 실제 테스트 데이터에 대한 모델의 성능을 확인하는 것이 왜 중요한지에 대해서도 이야기 해보겠습니다.
그리드 서치는 지정된 하이퍼파라미터의 모든 조합을 시도하여, 가장 좋은 성능을 보이는 조합을 찾는 방법입니다. 이는 모델의 성능을 극대화하기 위한 중요한 과정으로, 특히 복잡한 모델에서 성능 향상에 큰 영향을 미칩니다.
params = {
'max_depth': [6, 8, 10, 12, 16, 20, 24]
}
dt_clf = DecisionTreeClassifier(random_state=156)
grid_cv = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv=5, verbose=1)
grid_cv.fit(X_train, y_train)
# 최적의 파라미터와 최고 정확도 출력
print('Best Parameters : ', grid_cv.best_params_)
print('Best Accuracy : {0:.4f}'.format(grid_cv.best_score_))
>Output
Fitting 5 folds for each of 7 candidates, totalling 35 fits
Best Score : 0.8513444970102249
Best Parameters : {'max_depth': 16}
위 코드는 DecisionTreeClassifier
에 대해 다양한 max_depth
값을 시도하는 간단한 그리드 서치 예시입니다. 여기서 cv=5
는 5-겹 교차 검증을 의미하며, 이는 모델이 데이터의 다른 부분집합에 대해 어떻게 성능을 나타내는지 평가하는 데 사용됩니다.
교차 검증을 통한 평가는 모델의 일반화 능력에 대한 더 정확한 추정을 제공합니다. 그러나 이 방법이 항상 테스트 데이터셋에 대해 최적의 결과를 보장하는 것은 아닙니다.
그리드 서치를 통해 찾은 하이퍼 파라미터가 테스트 데이터에 대해서도 같은 성능을 보이는지 확인해 보겠습니다.
max_depths = [6, 8, 10, 12, 16, 20, 24]
for max_depth in max_depths:
dt_clf = DecisionTreeClassifier(max_depth=max_depth, random_state=156)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print('max_depth = {0} 정확도 : {1:.4f}'.format(max_depth, accuracy))
>Output
max_depth = 6 정확도 : 0.8558
max_depth = 8 정확도 : 0.8707
max_depth = 10 정확도 : 0.8673
max_depth = 12 정확도 : 0.8646
max_depth = 16 정확도 : 0.8575
max_depth = 20 정확도 : 0.8548
max_depth = 24 정확도 : 0.8548
그리드 서치로 도출된 최적의 max_depth 값인 16과 달리, 실제 테스트 데이터에서는 max_depth가 8일 때 가장 높은 정확도를 보여주었습니다. 이러한 결과는 그리드 서치가 항상 실제 환경에서 최적의 결과를 보장하지 않을 수 있음을 시사합니다. 따라서, 그리드 서치 결과를 바탕으로 최종 모델을 선택하기 전에 반드시 실제 테스트 데이터셋에서의 추가적인 검증이 필요합니다.
그리드 서치를 통해 찾은 최적의 하이퍼파라미터 조합이 항상 실제 데이터에 대해 최고의 성능을 보장한다는 보장은 없습니다.
데이터의 다양성과 복잡성: 교차 검증 과정에서 사용된 데이터는 실제 테스트 데이터셋의 다양한 특성을 완전히 반영하지 못할 수 있습니다. 이로 인해, 교차 검증에서 좋은 성능을 보여도 실제 테스트 데이터셋에서는 그 성능이 재현되지 않을 수 있습니다.
과적합의 위험: 특히 복잡한 모델의 경우, 교차 검증을 통해 특정 데이터셋에 과적합될 위험이 있습니다. 과적합된 모델은 새로운 데이터에 대한 일반화 능력이 떨어집니다.
교차 검증의 랜덤성: 데이터를 훈련 세트와 검증 세트로 나누는 과정에 랜덤성이 개입합니다. 서로 다른 데이터 분할은 결과에 영향을 줄 수 있으며, 이는 교차 검증을 통한 하이퍼파라미터 최적화의 결과에 변동성을 추가할 수 있습니다.
이러한 한계들은 그리드 서치를 사용하는 과정에서 고려해야 할 중요한 요소들입니다. 따라서, 그리드 서치를 통해 찾은 최적의 하이퍼파라미터는 실제 테스트 데이터셋에서의 성능을 검증하는 출발점으로 사용되어야 합니다.
그리드 서치는 하이퍼파라미터 튜닝에 있어 강력하고 널리 사용되는 도구입니다. 그러나 그리드 서치를 통해 얻은 최적의 하이퍼파라미터 조합이 항상 보이지 않는 테스트 데이터에 대해 최고의 성능을 보장하는 것은 아닙니다. 이는 데이터의 다양성과 복잡성, 과적합의 위험, 교차 검증 과정의 랜덤성 등 여러 요인에 의해 발생할 수 있습니다.
따라서, 그리드 서치 결과를 최종적이고 절대적인 것으로 간주하기보다는, 모델의 성능을 평가하는 출발점으로 사용하는 것이 좋습니다. 모델의 일반화 능력을 확인하기 위해선 실제 테스트 데이터셋에서의 추가적인 성능 평가가 중요합니다.
머신 러닝 모델을 개발하고 최적화하는 과정에서는 항상 불확실성과 복잡성이 동반됩니다. 강의나 책에서도 '정답이 없다'는 말이 자주 나옵니다. 그래서 더 어렵게 느껴지고, 또 그래서 더 분석가의 역량이 중요하다는 생각이 듭니다.
참고