모델을 학습시킬 때 hyperparameter tunning을 해보자.
그나저나 본고에서 모델을 학습시킬 때 세 가지 방법을 사용했는데, 각각을 보면
얘는 기본. 성능보다는 속도를 중시한다.
개발자가 해당 문제에 대해 지식이 조금 있는 경우 parameter를 조정할 수 있다. 모델이 parameter를 학습하는 과정을 보완하는 것이다.
얘가 시간이 가장 오래 걸린다.
아무튼 hypterparameter tunning을 해서 모델을 학습시키자.
tuner = tfdf.tuner.RandomSearch(num_trials=1000)
먼저 튜너를 설정한다. 이 튜너를 통해 무작위의 1,000개의 hyperparameter 조합을 시도한다.
tuner.choice("min_examples", [2, 5, 7, 10])
tuner.choice("categorical_algorithm", ["CART", "RANDOM"])
여기부터는 choice() 함수를 통해 hyperparameter가 가능한 값들의 선택지를 설정한다.
min_examples는 각 노드가 분할되기 위해 필요한 최소 샘플 수를 지정한다. 전술했듯, 이 값이 크면 모델이 덜 복잡해지고 일반적으로 학습하고, 작으면 모델이 복잡해지고 과적합의 위험이 있다.
두 번째 parameter에 있는 [2, 5, 7, 10] 중에서 매번 하나를 랜덤으로 고른다.
categorical_argorithm은 범주형 변수를 처리하는 알고리즘이다. CART와 RANDOM에서 무작위로 택한다.
CART와 RANDOM의 차이는 (.. 찾아봤는데 뭔 소린지 모르겠어서 생략 ..)
local_search_space = tuner.choice("growing_strategy", ["LOCAL"])
local_search_space.choice("max_depth", [3, 4, 5, 6, 8])
growing_strategy는 트리의 성장 전략을 결정한다.
LOCAL은 각 노드에서 최적의 분할을 선택하여 트리를 성장시키는 방식을 의미한다. 후술할 BEST_FIRST_GLOBAL에 대비된다.
max_depth는 랜덤하게 저 다섯 개의 숫자 중에서 고른다.
아래의 코드도 비슷하다.
global_search_space = tuner.choice("growing_strategy", ["BEST_FIRST_GLOBAL"], merge=True)
global_search_space.choice("max_num_nodes", [16, 32, 64, 128, 256])
BEST_FIRST_GLOBAL은 분할을 선택할 때 트리 전체에서 평가하기 때문에 최적화가 더 잘 되지만 속도가 느리다.
max_num_nodes는 랜덤하게 저 다섯 개의 숫자 중에서 고른다.
이렇게 search space를 둘로 나눈 이유는 성장 전략을 쪼개고 각각에 대해 독립적으로 hyperparameter 튜닝을 수행하기 위해서다.
local search에서 max_depth를 설정한 이유는, 이 전략은 각 노드별로 최적 분할을 선택하기 때문에 최대 깊이를 제어하는 게 긴요하고, global search에서 max_num_nodes를 설정한 이유는, 이 전략은 전체적으로 평가하기 때문에 깊이 자체는 별로 중요하지 않고 노드의 개수가 중요하기 때문이다.
#tuner.choice("use_hessian_gain", [True, False])
tuner.choice("shrinkage", [0.02, 0.05, 0.10, 0.15])
tuner.choice("num_candidate_attributes_ratio", [0.2, 0.5, 0.9, 1.0])
use_hessian_gain은,, 자세한 건 알기 귀찮고,, True를 쓰면 성능 좋아지고 시간 많이 들고, False는 그 반대다 정도만 알아두자.
shrinkage는 학습률로 각 트리가 얼마나 기여할지를 결정한다. 낮을수록 속도는 줄지만 과적합을 방지할 수 있다.
num_candidate_attributes_ratio는 각 분할에서 후보로 고려되는 속성의 비율을 결정한다. 0.2면 전체 features 중에서 20%만 고려대상이 되니 빨라지고 다양성이 증가한다! (얼토당토않은 애들만 후보군으로 골라지면 어쩔 수 없이 얘네들 중에 골라야 하기 때문)
tuner.choice("split_axis", ["AXIS_ALIGNED"])
oblique_space = tuner.choice("split_axis", ["SPARSE_OBLIQUE"], merge=True)
oblique_space.choice("sparse_oblique_normalization", ["NONE", "STANDARD_DEVIATION", "MIN_MAX"])
oblique_space.choice("sparse_oblique_weights", ["BINARY", "CONTINUOUS"])
oblique_space.choice("sparse_oblique_num_projections_exponent", [1.0, 1.5])
이거는,,, 또 무슨 oblique space라는 건데 솔직히 관심이 없으니 대충 넘어가자.
이런 식으로 총 세 개의 search space가 만들어졌고, tuner가 이들을 모두 고려해서 최적의 튜닝을 한다.
tuned_model = tfdf.keras.GradientBoostedTreesModel(tuner=tuner)
tuned_model.fit(train_ds, verbose=0)
이제 GBT 모델을 정의하는데 앞에서 만든 tuner를 사용해서 튜닝을 실시한다.
그러고 나서 train_ds로 모델을 학습시킨다.
tuned_self_evaluation = tuned_model.make_inspector().evaluation()
print(f"Accuracy: {tuned_self_evaluation.accuracy} Loss: {tuned_self_evaluation.loss}")
평가 결과를 보면 된다!
이전 두 방법에 비해 더 정확도가 높아진 것을 알 수 있다!
'분명 전산학부 졸업 했는데 코딩 개못하는 조준호 > AI, ML, DL' 카테고리의 다른 글
Kaggle Competition - Binary Prediction of Poisonous Mushrooms (2) EDA correlation matrix (0) | 2024.09.02 |
---|---|
Kaggle Competition - Binary Prediction of Poisonous Mushrooms (1) EDA 전까지 (1) | 2024.09.02 |
역시 ML의 시작은 타이타닉 - (4) GBT 모델 뜯어보기 (3) | 2024.07.20 |
역시 ML의 시작은 타이타닉 - (3) 모델 만들고 학습시키고 평가하기 (7) | 2024.07.20 |
역시 ML의 시작은 타이타닉 - (2) Preprocess 후 Tensorflow DataSet으로 전환 (0) | 2024.07.20 |
한국은행 들어갈 때까지만 합니다
조만간 티비에서 봅시다