이사님🗣️ "베스트 머신러닝 알고리즘을 찾아보게나!"
랜덤포레스트의 기본 원리
: Ⓐ+Ⓑ로 개별 트리에 무작위성을 부여해서 트리의 성능이 너무 강력해지는 것을 막음 (=과대적합 방지) → ⭐물론 개별트리의 성능은 떨어짐 but 그걸 여러 개 묶어서 일반화하면 높은 성능이 나오게 됨!⭐
➡️ Ⓐ+Ⓑ의 방식으로 100개(기본값)의 결정트리를 훈련하고, (분류문제인 경우) 각 트리의 클래스별 확률을 평균하여 가장 높은 확률의 클래스를 예측클래스로!
cf. (회귀문제인 경우) '확률' 대신 '예측값(임의의 수치)'을 평균하면 됨!
RandomForestClassifier()
: 사이킷런의 ensemble
패키지에 있음return_train_score
: 훈련세트의 점수도 반환하도록 하는 설정 (for 과대적합 파악)feature_importances_
취합 → 랜덤포레스트의 feature_importances_
❗ 분할 자체를 무작위로 하다보니 랜덤 포레스트보다 무작위성이 더 크다. 그래서 랜덤포레스트보다는 트리 개수를 더 많이 해야 좋은 성능을 낸다고 알려져있다. 하지만
더 큰 무작위성 때문에 계산속도는 상대적으로 더 빨라진다는 장점도 있다.
ExtraTreesClassifier()
: 역시 ensemble
패키지에 있음. (Trees 주의^^)feature_importances_
제공하고, 마찬가지로 비교적 골고루 나옴.이젠 좀 다른 방식의 앙상블 학습을 알아보자
❗ 경사하강법에서 손실함수의 낮은 곳을 찾아 조금씩 이동했던 것처럼❗
score
구해보면 성능이 많이 높지 않음 but 그건 트리 개수 점점 더 넣으면서 높이면 됨! (결정트리 개수 늘려도 과대적합에 강하다는 장점!!)learning_rate
(기본값=0.1)GradientBoostClassifier()
: 역시 ensemble
패키지에 있음.n_estimators
: 추가할 트리 개수 설정 / learning_rate
: 학습률 설정보통 GB가 RF보다 조금 더 높은 성능을 내지만, 트리를 하나하나 추가하기 때문에 훈련속도가 느리다는 단점이 있음 ㅠ → 그걸 개선한 게 바로...!
HistGradientBoostClassifier()
: 역시 ensemble
패키지에 있음.max_iter
사용함.⭐ 이전과 좀 다르게, permutation_importance()
함수를 사용함
n_repeats
로 섞을 횟수 지정 가능!) → 많이 변할수록 중요한 특성으로, 별로 안 변할수록 중요하지 않은 특성으로 계산함!importances
(계산한 개별 특성중요도 모두), importances_mean
(그걸 평균 낸 최종 특성중요도), importances_std
(특성중요도들 간 표준편차) 가 담겨 있음.사이킷런 외에도 많은 라이브러리에서 그레이디언트 부스팅 알고리즘을 구현하고 있음.
obb_score_
: oob_score
옵션을 True로 하면 그걸로 평가한 점수가 여기에 저장됨.subsample
매개변수를 사용하면 트리 훈련에 쓸 훈련세트의 비율을 정할 수 있음.5주차에는 일반 검증 - 교차 검증 - 앙상블 학습, 이렇게 3가지를 배웠다.
실제 사용 과정에서 헷갈리는 느낌이 들어 개괄하여 적어둔다⭐
.
먼저 가장 기초적인 일반검증은 원래
dt = DecisionTreeClassifier()
처럼 모델 객체 만들고
dt.fit(입력, 타깃)
해서 가지고 있는 데이터로 훈련한 뒤,
dt.score(입력, 타깃)
해서 그 성능을 평가할 수 있었다
.
근데 좀 더 발전된 교차검증으로 오면
dt = DecisionTreeClassifier()
해서 모델 객체 만들어 놓은 것에
cross_validate(dt, 입력, 타깃)
하면 알아서 fit하고 score까지 한 다음, 그 결과값을 (딕셔너리 형태로) 반환해준다
.
그리고 성능이 가장 뛰어난 앙상블은
처음에dt = ___
이 자리에 앙상블 모델만 넣어주면 되는 것이다!!
이후는 똑같이cross_validate
해주는 것이 일반적인 듯하다 (당연히 교차검증이 더 효율적이니 교재에서도 그렇게 사용한 듯) 🆗
265p. 근데 기본적으로... 성능 낮춘 모델 여러개를 묶은게 성능 좋은 모델 하나보다 어떻게 더 좋은 모델이 되는거지...?
270p. RF와 ET 모두 2가지 방식으로 무작위성 주입했는데, ET가 더 빠르다는 건, 부트스트랩 샘플 뽑는 과정보다 분할 찾는(불순도 계산하는) 과정이 더 복잡하고 오래걸리는 과정이라서 그런 거라고 이해하면 될까요?
👨🏻🏫 네 맞습니다! 🆗
271p. 근데 GradientBoostingClassifier는 따로 손실함수는 정의 안 해줘도 되나..?
loss
매개변수에서 설정할 수 있고, 기본값이deviance
(=로지스틱 손실함수)라고 282p에 나와있네..^^ 🆗
272p. GradientBoosting은 무작위성이 덜하니까 특성 중요도가 한 특성에 치우친거죠?
👨🏻🏫 이 예제에 해당하는 경우라서 일반화하기 힘들 것 같습니다. 🆗
272p.
subsample
< 1 인 경우가 '확률적 or 미니배치 경사하강법'이면, 원래 기본값은 '배치 경사하강법'이라는 건가요?👨🏻🏫 네 맞습니다! 🆗
273p. 나누는 구간의 개수가 왜 하필 256개인지 특별한 이유가 있나요...? 282p 보니까 그 이상으로 쪼갤 수도 없게 되어있던데 왜 그런지 궁금합니다.
👨🏻🏫 이유를 어디서 본 것 같은데 기억이 안 나네요..^^ ⏯️ 찾게 되면 적어두자
그렇게 극찬하셨던 '앙상블' 알고리즘을 드디어 배웠다.. 확실히 더 발전된 느낌이긴한데, 생각보다 성능이 극적으로 좋게 나오거나 그러진 않아서 아직 제대로 와닿진 않는 것 같다. 아마 직접 프로젝트를 해보거나 큰 데이터를 다뤄보면 실감할 수 있겠지? 어쨌거나 <지도학습> 파트는 끝을 냈다고 생각하니 뿌듯 ㅠ 슬슬 프로젝트를 준비할 때다..! 파이팅!
더 강력한 성능의 모델을 만들기 위해 "앙상블 학습"을 도입 → 랜덤 포레스트와 엑스트라 트리는 성능을 낮춘 결정트리들을 앙상블 : 안정적인 성능 + 특성 의존도 줄어듦 → 그레이디언트 부스팅은 경사하강법의 원리로 얕은 트리들을 추가하면서 높은 성능에 다가감 → 이것의 속도와 성능을 더 개선한 것이 히스토그램 기반 그레이디언트 부스팅이고, 훈련 데이터를 256개 구간으로 쪼개서 속도를 높임 + permutation_importance
로 특성중요도 계산! → 그 외에도 XGBoost, LightGBM 등 많은 앙상블 알고리즘들이 있음. // 참 다양한 종류의 알고리즘을 배운 하루였다!