본문 바로가기

머신러닝

tree

부스팅 : 이전 분류기의 학습 결과를 토대로 다음 분류기의 학습 데이터의 샘플가중치를 조정해 학습하는 방법

 

결정트리

분류, 회귀 모두 쓰임

정답에 가장 빨리 도달하는 질문찾기

회귀 : 찾은 리프노드의 훈련 데이터 평균값이 출력

 

순수노드로 이루어진 트리 : 훈련 세트에 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