1. 배깅, 엑스트라 트리, 에이다부스트 (2.3.7)
: scikit-learn이 제공하는 다른 앙상블 알고리즘
1. 배깅 Bagging
: 중복을 허용한 랜덤 샘플링으로 만든 훈련 세트(부트스트랩 샘플)를 사용하여 분류기를 각기 다르게 학습시킴
- 분류기가 predic_proba() 메서드를 지원 o: 확률값을 평균하여 예측 수행
- 지원 X: 가장 빈도가 높은 클래스 레이블이 예측 결과가 됨
from sklearn.ensemble import BaggingClassifier
특징
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import BaggingClassifier
bagging = BaggingClassifier(LogisticRegression(), n_estimators=100,
oob_score=True, n_jobs = -1, random_state =42)
bagging.fit(Xc_train, yc_train)
- oob_score = true: 부트스트래핑에 포함되지 않은 샘플을 기반으로 훈련된 모델을 평가 (테스트 세트? 같은 거 -> 사실 테스트 세트는 load_breast_cancer datasets에 따로 있음)
-> oob_score를 통해 테스트 세트의 성능 짐작 가능
- RandomForestClassifier도 oob_score 지원 (두 모델 모두 기본값 = False)
잠깐 !!!!!!!!
- 배깅: 부트스트랩을 여러번 하여, 여러 훈련 세트를 만들고 각각의 훈련 세트에 모델을 적용하여 그 결과의 값을 평균을 냄 -> 분산을 줄이는 기법
- max_samples 매개변수로 부트스트랩 샘플의 크기 지정 가능
- 랜덤포레스트: 배깅의 일종, 배깅과의 차이는 설명변수(특성)도 무작위로 선택
- 랜덤포레스트는 DecisionTreeClassifier(splitter='best')를 사용하도록 고정 -> splitter='random'으로 설정하면 무작위로 분할한 후보 노트 중에서 최선의 분할을 찾음
- Using best, the model if taking the feature with the highest importance
- Using random, the model if taking the feature randomly but with the same distribution.
: 랜덤 포레스트와 비슷하지만 후보 특성을 무작위로 분할한 다음 최적의 분할을 찾음
from sklearn.ensemble import ExtraTreesClassifier
특징
- DecisionTreeClassifier(splitter='random')
- 부트스트랩 샘플링 X
- 랜덤 포레스트보다 계산 비용이 적지만 무작위 분할로 일반화 성능을 높이기 위해서는 많은 트리를 만들어야 함 = 랜덤 포레스트를 더 선호하는 이유
- 특성 중요도는 랜덤 포레스트와 비슷
3. 에이다 부스트 AdaBoost
: 그레이디언트 부스팅처럼 약한 학습기 사용
from sklearn.ensemble import AdaBoostClassifier
특징
- 그레이디언트 부스팅과의 차이점: 이전의 모델이 잘못 분류한 샘플에 가중치를 높여서 다음 모델을 훈련 시킴
- 각 모델은 성능에 따라 가중치 부여
- 예측: 예측한 레이블을 기준으로 모델의 가중치를 합산하여 가장 높은 값을 가진 레이블을 선택
- 기본값 = DecisionTreeClassifier(max_depth=1) -> depth = 1이기 때문에 각 트리의 결정 경계가 직선 1개
2. 커널 서포트 벡터 머신 (2.3.8)
1. 커널 서포트 벡터 머신 SVM
: 입력 데이터에서 단순한 초평명으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장한 것
선형 모델과 비선형 특성
- 선형 모델을 유연하게 만드는 방법: 특성끼리 곱하거나 특성을 거듭제곱함 -> 비선형 특성 추가
X_new = np.hstack([X,X[:, 1:] ** 2)

이거를 원래 두 개의 특성으로 투영해보면

-> 더 이상 선형이 아님!
커널 기법
: 수학적 기교를 사용해서 새로운 특성을 많이 만들지 않고서도 고차원 분류기를 학습시킬 수 있음
-> 실제로 데이터를 확장하지 않고 확장된 특성에 대한 데이터 포인트들의 거리를 계산함
<서포트 벡터 머신에서 데이터를 고차원 공간에 매핑하는 데 사용하는 방법>
1. 다항식 커널: 원래의 특성을 가능한 조합을 지정된 차수까지 모두 계산
2. RBF 커널 (가우시안 커널): 차원이 무한한 특성 공간에 매핑 (모든 차수의 모든 다항식 고려)
SVM
- 학습이 진행되는 동안 SVM은 각 훈련 데이터 포인트가 두 클래스 사이의 결정 경계를 구분하는 데 얼마나 중요한지를 배움
- 일반적으로 훈련 데이터의 일부만 결졍 경계를 만드는 데 영향
-> 서포트 벡터: 두 클래스 사이의 경계에 위한 데이터 포인트
- 새로운 데이터 포인트 예측 = 각 서포트 벡터와의 거리를 측정 -> 분류 결정: 서포트 벡터까지의 거리에 기반
- 데이터 포인트 사이의 거리: 가우시안 커널에 의해 계산
from sklearn.svm import SVC
X, y = mglearn.tools.make_handcrafted_dataset()
svm = SVC(kernel = 'rbf', C=10, gamma=0.1).fit(X, y)
- gamma 매개변수: 가우시안 커널 폭의 역수 -> 하나의 훈련 샘플이 미치는 영향의 범위 (작은 값은 넓은 영역)
가우시안 커널의 반경이 클수록 훈련 샘플의 영향 범위도 커짐
- C 매개변수: 규제 매개변수 like 선형 모델 -> 각 포인트의 중요도를 제한
장단점
- 장점
- 다양한 데이터셋에서 잘 작동
- 데이터의 특성이 몇 개 안되더라도 복잡한 결정 경계를 만들 수 있음
- 단점
- 데이터 전처리와 매개변수 설정에 신경을 많이 써야함
-> 그래서 요즘엔 사람들이 대부분 랜덤 포레스트나 그레이디언트 부스팅 같은 (전처리가 거의 또는 전혀 필요가 없는) 트리 기반 모델을 애플리케이션에 많이 사용
끝
오 이제 뭔가 이해되기 시작하는듯 !! 하다가 SVM 하면서 의욕을 잃었다 ㅎ... 배깅이랑 에이다 부스트, 엑스트라 트리가 랜덤 포레스트, 그레이디언트 부스트랑 꽤나 큰 연관이 있는 것 같으니까 지도학습 끝나면 한 번 싹 정리해야겠다 ~~.. 오늘의 TIL도 ... 무사히... 끝...
열심히 하시네요^^