랜덤으로 선택된 수천 명의 사람에게 복잡한 질문을 하고 답을 모으면, 많은 경우 전문가의 수준의 답을 얻을 수 있다.
이러한 대중의 지혜를 머신 러닝에서도 찾을 수 있다.
투표 기반 분류기(Voting)
여러 개의 분류기를 통해 더 우수한 결론을 얻는 방법
- 직접 분류(hard voting)
같은 데이터를 서로 다른 예측기에 대입하고 , 다수결의 원칙으로 예측을 내는 방식
놀랍게도 다수결 투표 분류기가 앙상블에 포함된 개별 분류기 중 가장 뛰어난 것보다도 정확도가 높은 경우가 많다.
약한 학습기일지라도, 앙상블에 있는 약한 학습기가 충분하게 많고, 다양하다면 강한 학습기가 될 수 있다. (대수의 법칙)
from sklearn.datasets import make_moons
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
X, y = make_moons(n_samples = 500, noise = 0.30)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 42)
voting_clf = VotingClassifier(
estimators=[
("lr", LogisticRegression()),
("rf", RandomForestClassifier()),
("svc", SVC())
]
)
voting_clf.fit(X_train, y_train)
같은 알고리즘을 사용하고 훈련세트에서 서브셋을 랜덤으로 구성하여 분류기를 다르게 학습하는 방법이 있다.
훈련 세트를 중복하여 샘플링하는 방식을 Boostrap aggregating, bagging이라 하고, 중복을 허용하지 않은 샘플링 방식을 pasting이라고 한다.
bagging과 pasting을 이용하면 같은 훈련 샘플을 여러번의 예측기에 걸쳐 사용할 수 있다. 그중에서 bagging만이 한 예측기를 위해 같은 훈련 샘플을 여러번 샘플링할 수 있다.
베깅과 페이스팅은 훈련 세트에서 랜덤으로 샘플링을 하여 여러 개의 예측기를 훈련시킨다.
훈련을 마친 후, 예측기의 예측을 모아 집계 함수(분류 문제에서는 통계적 최빈값: statistical mode, 회귀에서는 평균)을 통해 최종 예측 값을 내보낸다.
#bagging 훈련세트에 중복을 허용하여 샘플, 분류기로 예측, 최빈값
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(DecisionTreeClassifier())
bag_clf.fit(X_train, y_train)
배깅은 각 예측기가 학습하는 서브셋에 다양성을 추가하여, 페이스팅보다 조금 더 편향이 높다.
OOB 평가
Bagging은 중복을 허용하여, 새로운 서브 데이터셋을 만든다. 이때 선택되지 않는 데이터 역시 생긴다.
이를 Out of Bag, OOB 샘플이라고 한다. Bagging을 이용한 예측에서, 평균적으로 약 63% 정도만 샘플링 되고, 그외 37%는 OOB에 포함된다.
https://psystat.tistory.com/92
예측기의 훈련에 사용되지 않은 37%의 OOB를 이용하여 예측기의 성능을 평가하는 것이 가능하다. 이를 OOB 평가라고 한다.
사이킷런 BagginClassifier에서 obb_score =true로 지정하면 자동으로 OOB 평가를 진행한다.
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators = 500, oob_score=True, n_jobs=-1)
bag_clf.fit(X_train, y_train)
bag_clf.oob_score_
랜덤 포레스트는 배깅 방식(또는 페이스팅)을정요한 결정 트리의 앙상블이다.
BaggingClassifier에 DecisionTreeClassifier를 대입하는 방식 대신 RandomForestRegressor, RandomForestClassifier를 이용하면 편리하게 랜덤 포레스트 모델을 만들 수 있다.
from sklearn.ensemble import RandomForestClassifier
rnd_clf = RandomForestClassifier(n_estimators= 500, max_leaf_nodes = 16, n_jobs= -1)
rnd_clf.fit(X_train, y_train)
y_pred_rf = rnd_clf.predict(X_test)
랜덤 포레스트의 장점은 특성의 상대적 중요도를 측정하기 쉽다는 점이다.
▶ 결정트리 기반의 모델은 모두 특성 중요도를 제공한다. 특히 무작위성을 가지는 랜덤포레스트에서는 거의 모든 특성에 대해 평가할 기회를 가진다.
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
rnd_clf = RandomForestClassifier(n_estimators=500)
rnd_clf.fit(iris.data, iris.target)
for score, name in zip(rnd_clf.feature_importances_, iris.data.columns):
print(round(score, 2), name)
0.09 sepal length (cm)
0.03 sepal width (cm)
0.42 petal length (cm)
0.46 petal width (cm)
사이킷런은 어떤 특성을 사용한 노드가 모든 트리에서 평균적으로 불순도를 얼마나 감소시키는지 확인하여 특성의 중요도를 측정한다. → DecisionTree에서는 지니 불순도를 감소시키는 특성의 기준값을 결정하는 방식으로 작동한다.
측정된 특성 중요도는 .feature_importances_ 변수에 저장되어 있다. 위 예시에서는 petal length 42%, petal width 46%의 중요도를 가짐을 알 수 있다.
'Datascience' 카테고리의 다른 글
DecisionTree와 Ensembling 실습 : wine 데이터 셋 (1) | 2024.01.07 |
---|---|
Ensemble 2: AdaBoosting과 GradientBoosting (0) | 2024.01.06 |
Trading Off Precision and Recall(정밀도와 재현률 트레이드 오프) (1) | 2024.01.01 |
머신러닝 알고리즘의 성능 평가 지표(Evaluation Metric) (0) | 2023.12.29 |
Data Preprocessing : Label Encoding * One hot Encoding (0) | 2023.12.29 |