다 똑같은 머신러닝 알고리즘을 사용하는데 개발 속도와 성능이 다른 걸까요? 머신러닝에서는 실행착오에서 얻은 경험치가 중요합니다. 실제로 개발 속도와 성능에 영향을 미치죠. 보통 하이퍼파라미터 튜닝에 경험치가 녹아들게 됩니다. 그럼 경험치는 뛰어넘거나 극복할 수 있는 방법은 아예 없는 것일까요?
이제부터 2회에 걸쳐서 개발 속도와 성능을 높이는 다음과 같은 실전 테크닉 2가지를 알려드리겠습니다.
① 그리드서치
② 주성분 분석(PCA)
① 그리드서치
하이퍼파라미터 튜닝은 임의의 값들을 넣어 더 나은 결과를 찾는 방식입니다. 이런 식으로 하나하나 확인하면 모델링 과정을 기다리고 재시도하는 단순 작업을 반복해야 합니다. 그리드 서치를 이용하면 한 번 시도로 수백 가지 하이퍼파라미터값을 시도해볼 수 있습니다.
그리드 서치의 원리는 간단합니다. 그리드 서치에 입력할 하이퍼파라미터 후보들을 입력하면, 각조합에 대해 모두 모델링해보고 최적의 결과가 나오는 하이퍼파라미터 조합을 알려줍니다. 예를들어 하이퍼파라미터로 max_depth와 learning_rate를 사용한다고 가정합시다. 다음과 같이하이퍼파라미터별로 다양한 값들을 지정해줍니다.
이를 그리드 서치로 적용하면 다음과 같이 9가지 조합이 만들어집니다.
이렇게 9가지 조합을 각각 모델링하게 되는데, 보통 그리드 서치에서는 6장에서 배운 교차검증도 함께 사용하기 때문에 교차검증의 횟수만큼 곱해진 횟수가 모델링됩니다. 예를 들어 위의 9가지 조합에 K-폴드값을 5로 교차검증을 한다면 9 _ 5 = 45회의 모델링을 진행합니다. 모델링 결과가 좋은 매개변수 조합을 알려주고, 해당 하이퍼파라미터셋으로 예측까지 지원합니다.
더 많은 하이퍼파라미터 종류와 더 많은 후보를 넣으면 더 좋은 결과를 얻을 수 있는 가능성도 높아지지만, 그만큼 학습 시간이 길어질 수 있습니다. 따라서 소요 시간을 고려하여 적정 수준으로 설정해주는 게 좋습니다.
그리드 서치 모듈은 사이킷런 라이브러리의 model_selection에서 불러올 수 있습니다.
그리드 서치에 넣어줄 매개변수 4개를 딕셔너리 형태로 입력하면 됩니다.
각 매개변수의 의미는 다음과 같습니다.
- learning_rate : 경사하강법에서 ‘매개변수’를 얼만큼씩 이동해가면서 최소 오차를 찾을지, 그보폭의 크기를 결정하는 하이퍼파라미터입니다. 기본적으로 보폭은 미분계수에 의해 결정되지만, learning_rate를 크게 하면 더 큰 보폭을, 작게 하면 그만큼 작은 보폭으로 움직입니다. learning rate를 우리말로 학습률이라고 합니다. 학습률 크기에 따라 최적의 에러를 찾는 과정은 다음과 그림과 같습니다.
왼쪽 그래프는 너무 작은 학습률을 쓴 경우입니다. 보폭이 너무 조금씩 움직이다 보니 최소 에러값을 찾는 데 상당한 시간이 들고 지역 최소해에 빠질 가능성도 상대적으로 커집니다. 반대로 오른쪽 그래프는 너무 큰 학습률을 사용해서 너무 성큼 움직이기 때문에 최소 에러를 정확히 찾지 못하고 좌우로 계속 넘어다닙니다. 가운데의 그래프가 가장 이상적입니다. 이처럼 적절한 크기의 학습률을 사용해야 큰 시간을 들이지 않고 최소 오차 지점을 찾아낼 수 있습니다.
- max_depth : 각 트리의 깊이를 제한합니다.
- subsample : 모델을 학습시킬 때 일부 데이터만 사용하여 각 트리를 만듭니다. 0.5를 쓰면 데이터의 절반씩만 랜덤 추출하여 트리를 만듭니다. 이 또한 오버피팅을 방지하는 데 도움이 됩니다.
- n_estimators : 전체 나무의 개수를 정합니다.
위와 같이 매개변수를 딕셔너리 형태로 설정해준 뒤에는, 알고리즘 속성이 부여된 빈 모델을 만듭니다.
이제 그리드 서치를 수행할 준비를 모두 갖춰졌으니, 모델을 생성할 GridSearchCV( ) 함수를 다음과 같이 설정해줍니다. 모델(model)과 딕셔너리형의 하이퍼파라미터셋(parameters)은 필수, 그외는 선택 사항입니다.
n_jobs는 사용할 코어 수이고, scoring은 모델링할 때 어떤 기준으로 최적의 모델을 평가할지를 정의합니다. 여기서는 F1-점수를 기준으로 판단하도록 설정했습니다. 그리고 cv는 교차검증에 사용할 K-폴드값입니다. 여기서는 5로 설정했습니다. 이제 gs_model을 가지고 학습을 시키겠습니다. 학습시키는 코드는 기존의 모델링과 같습니다.
이번에는 학습 완료까지 상당한 시간이 소요될 겁니다. 하이퍼파라미터셋이 총 4종류에 3개씩 값이 있으니 3의 4승으로 총 81번의 모델링을 진행하고 나서 교차검증 5회를 실행하므로 총 405번의 모델링 작업이 이뤄집니다.
그리드 서치는 학습이 완료된 후, 가장 좋은 성능을 보인 하이퍼파라미터 조합 정보를 보관합니다. 아래 코드로 최적의 조합을 확인할 수 있습니다.
또한 이전의 모델링 과정과 동일하게, 그리드 서치를 이용해서 새로운 데이터를 예측할 수도 있습니다. 이때 적용되는 모델은 최적의 하이퍼파라미터 조합이 자동으로 반영됩니다.
그럼 예측된 값에 대한 정확도(accuracy_score)와 분류 리포트(classification_report)를 확인하겠습니다.
정확도는 아주 미세하게 올라갔고, F1-점수는 0.02 상승했습니다. 일반적으로 하이퍼파라미터 튜닝으로 엄청난 개선을 얻기는 쉽지 않습니다. 예측에는 피처 엔지니어링과 모델 알고리즘 선정이 큰 영향을 미칩니다. 하이퍼파라미터 튜닝은 조금이라도 더 나은 모델을 만드는 역할입니다.
따라서 모든 하이퍼파라미터를 일일이 넣기보다는 그리드 서치를 이용하면 더 빠르게 더 많은 알고리즘에서 성능을 테스트할 수 있게 됩니다.
랜덤 그리드 서치를 이용하면 그리드 서치보다 더 빠르게 최적의 성능을 확인할 수 있습니다. 자세한 내용은 책 11장에서 다룹니다.
삼성전자에 마케팅 직군으로 입사하여 앱스토어 결제 데이터를 운영 및 관리했습니다. 데이터에 관심이 생겨 미국으로 유학을 떠나 지금은 모바일 서비스 업체 IDT에서 데이터 사이언티스트로 일합니다. 문과 출신이 미국 현지 데이터 사이언티스트가 되기까지 파이썬과 머신러닝을 배우며 많은 시행착오를 겪었습니다. 제가 겪었던 시행착오를 덜어드리고, 머신러닝에 대한 재미를 전달하고자 유튜버로 활동하고 책을 집필합니다.
현) IDT Corporation (미국 모바일 서비스 업체) 데이터 사이언티스트
전) 콜롬비아 대학교, Machine Learning Tutor, 대학원생 대상
전) 콜롬비아 대학교, Big Data Immersion Program Teaching Assistant
전) 콜롬비아 대학교, M.S. in Applied Analytics
전) 삼성전자 무선사업부, 스마트폰 데이터 분석가
전) 삼성전자 무선사업부, 모바일앱 스토어 데이터 관리 및 운영
강의 : 패스트캠퍼스 〈파이썬을 활용한 이커머스 데이터 분석 입문〉
SNS : www.youtube.com/c/데싸노트
2 Comments