사이킷런의 RandomForestClassifier 클래스를 이용한다.
from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

각 특성 중요도는 feature_importances에 있다.
# 랜덤 포레스트의 특성 중요도는 각 결정트리의 값을 취합
rf.fit(train_input, train_target)
print(rf.feature_importances_)
# 알코올 당도 pH
# 랜덤 포레스트는 특성을 랜덤으로 선택하기 때문에 하나의 특성에 과도하게 집중하지 않음 -> 과대적합을 줄이고 일반화 성능 개선

랜덤 포레스트에서 Bootstrap 샘플에 포함되지 않은 것을 OOB (Out Of Bag)샘플이라 하는데, 이를 통한 검증을 할 수 있다.
rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)
rf.fit(train_input, train_target)
print(rf.oob_score_)

사이킷런의 ExtraTreesClassifier를 이용한다.
from sklearn.ensemble import ExtraTreesClassifier
et = ExtraTreesClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(et, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

역시 feature_importance를 통해 특성 중요도를 알 수 있다.
et.fit(train_input, train_target)
print(et.feature_importances_)

사이킷런의 GradientBoostingClassifier를 이용한다.
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

학습률 는 learning_rate 파라미터를 통해 정할 수 있다.
# 학습률과 트리 증가 (학습률 디폴트 0.1)
gb = GradientBoostingClassifier(n_estimators=500, learning_rate=0.2, random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

성능이 짱이라고 한다.
아직 사이킷런에서는 테스트 단계라 enable_hist_gradient_boosting 도 import해야 한다.
sklearn의 HistGradientBoostingClassifier를 사용한다.
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
hgb = HistGradientBoostingClassifier(random_state=42)
scores = cross_validate(hgb, train_input, train_target, return_train_score=True)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

앙상블 모델은 단일 모델보다 성능이 좋다. 당연히 더 많은 트리를 돌리니까 !