부스팅 : 이전 분류기의 학습 결과를 토대로 다음 분류기의 학습 데이터의 샘플가중치를 조정해 학습하는 방법
결정트리
분류, 회귀 모두 쓰임
정답에 가장 빨리 도달하는 질문찾기
회귀 : 찾은 리프노드의 훈련 데이터 평균값이 출력
순수노드로 이루어진 트리 : 훈련 세트에 100% 맞음 ->overfit
overfit 막는 전략 :트리 일찍 중단(pre-pruning)-> 트리 최대 깊이 제한
트리 만들고 데이터 포인트 적은 노드 삭제하거나 병합(pruning)
t = DecisionTreeClassifier(max_depth=4,random_state=0)
t.fit(X_train, y_train)
트리 시각화
tree.plot_tree(t, filled=True,fontsize=5);
plt.figure(figsize=(50,50))
특성중요도
전체 트리 살피는게 어려우니 어떻게 작동하는지 요약 (전체 합 1, 항상 양수)

특성이 어떤 클래스를 지지하는지는 모름
값이 낮다고 해서 특성이 유용하지 않다는 것은 아님(단지 트리가 그 특성을 선택안함)
회귀 트리는 외삽, 즉 훈련 데이터의 범위 밖의 포인트에 대해 예측 못함
장점 : 데이터의 스케일에 영향 x -> 정규화 필요 x
but 사전 가지치기해도 overfit가능
앙상블 : 여러 머신러닝 모델을 연결
1. random forest : 조금씩 다른 여러 결정 트리의 묶음 결과를 평균냄
트리 생성시 1. 데이터 포인트를 무작위로 선택하거나
2. 특성을 무작위로 선택
forest = RandomForestClassifier(n_estimators=5, random_state=2)
forest.fit(X_train, y_train)
n_estimator = 만들 트리 개수
부트스트랩 샘플 생성
전체 특성을 대상으로 최선의 테스트를 찾는 것이 아니고 특성을 무작위로 선택한 후 이 후보들 중에서 최선의 테스트 찾음
max_feature로 조정
부트스트랩 샘플링은 랜덤 포레스트의 트리가 조금씩 다른 데이터셋을 이용해 만들어지도록 함.
max_feature를 크게하면 트리들은 비슷해짐. 낮추면 트리들은 많이 달라지고 깊이가 깊어짐
회귀 : 예측들을 평균냄
분류 : 약한 투표 전략
하나의 트리에서 보다 랜덤포레스트에서 제공하는 특성 중요도가 더 신뢰적(특성들이 더 많이 0이상임-> 더 넓은 시각으로 데이터를 봄)
트리는 매우 차원이 높고 희소한 데이터에는 작동 x
선형 모델보다 메모리더 써서 훈련과 예측이 느림
n_estimator 는 클수록 좋음
max_feature얼마나 무작위가 될지 정해줌, 과대적합 방지
max_feature = sqrt(n_features) 회귀 : max_feature = n_features
그레디언트 부스팅 회귀 트리 (앙상블)
이전 트리의 오차를 보완
무작위성 없음 강력한 사전 가지치기 사용
learning rate = 이전 트리의 오차를 얼마나 강하게 보정할 것인지
학습률이 크면 트리의 보정을 강하게 해서 복잡한 모델을 만듦
gbrt = GradientBoostingClassifier(learning_rate=0.01,random_state=0)
gbrt.fit(X_train, y_train)
gbrt = GradientBoostingClassifier(max_depth=1,random_state=0)
gbrt.fit(X_train, y_train)
n_estimator를 크게하면 앙상블에 트리가 더 많이 추가되어 모델의 복잡도 커짐
장점 : 다른 트리처럼 특성 스케일 조정안해도 됨.
단점 : 매개변수를 잘 조정해야하고 훈련시간이 김, 희소한 고차원 데이터에는 작동 x
랜덤 포레스트 : n_estimator를 크게할수록 좋음
그레디언트 부스팅 : 크게하면 모델이 복잡해지고 overfit가능
max_depth를 작게 설정 (5이하)
배깅, 엑스트라 트리, 에이타부스트
bagging : bootstrap aggregating
부트스트랩 사용
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import BaggingClassifier
bagging = BaggingClassifier(LogisticRegression(), n_estimators=100, oob_score=True, random_state=42)
bagging.fit(Xc_train, yc_train)
print(f'train set {bagging.score(Xc_train, yc_train)}')
print(f'test set {bagging.score(Xc_test, yc_test)}')
print(f'oob set {bagging.oob_score_}')
bagging = BaggingClassifier(DecisionTreeClassifier(), n_estimators=100, oob_score=True, random_state=42)
bagging.fit(Xm_train, ym_train)
oob : 부트스트래핑에 포함되지 않은 샘플을 기반으로 훈련된 모델을 평가 -> 테스트 성능 짐작가능
배깅은 랜덤 포레스트와 달리 max_samples 매개변수에서 부트스트랩 샘플의 크기를 지정가능
extra tree
후보 특성을 무작위로 분할한 다음 최적의 분할 찾음
--무작위성을 증가시키면 bias는 증가하지만 variance 감소
AdaBoost
그레디언트 부스팅처럼 약한 학습기 사용
차이점 : 이전의 모델이 잘못 분류한 샘플에 가중치를 높여서 다음 모델을 훈련시킴
'머신러닝' 카테고리의 다른 글
| MLP (0) | 2021.07.21 |
|---|---|
| svm (0) | 2021.07.15 |
| linear model (2) | 2021.07.03 |
| Supervised learning - KNN (0) | 2021.07.01 |
| ML_introduction (0) | 2021.06.29 |