: 학습 데이터로 주어진 데이터의 피처와 레이블값을 머신러닝 알고리즘으로 학습해 모델 생성, 이 모델로 새로운 데이터 값이 주어졌을 때 미지의 레이블 값 예측하는 방법 (지도학습)
<종류>
: 서로 다른/또는 같은 알고리즘을 단순히 결합한 형태 또는 배깅, 부스팅
: 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리(Tree) 기반의 분류 규칙을 만드는 것. 따라서 데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘 성능을 좌우.
트리의 구조
규칙이 너무 많으면(=트리의 깊이가 깊어지면) 예측 성능이 저하될 수 있음. (분류 방식이 복잡해져 과적합이 될 가능성이 큼)
--> 결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만듦 (균일도가 높아야 예측이 잘 됨)
ex. 10개의 공이 모두 검은색인 세트-> 쉽게 검은색이라고 예측,
검은공 5개, 흰 공 5개인 세트->데이터를 판단하는데 있어 많은 정보 필요
: 엔트로피라는 개념을 기반으로 균일도를 측정하는 방법
DecisionTreeClassifier()은 지니 계수를 이용해 데이터 세트를 분할함.
결정트리 알고리즘은 정보 이득이 높거나 지니 계수가 낮은 조건을 찾아서 반복적으로 분할함.
분류: DecisionTreeClassifier()/ 회귀: DecisionTreeRegressor()
: Graphviz 패키지 이용
from sklearn.tree import export_graphviz
# export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성함.
export_graphviz(dt_clf, out_file="tree.dot", class_names=iris_data.target_names , \
feature_names = iris_data.feature_names, impurity=True, filled=True)
import graphviz
# tree.dot 파일을 Graphviz 읽어서 Jupyter Notebook상에서 시각화
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
max_depth
깊이를 줄이면 보다 간단한 트리 생성
mean_samples_split
mean_samples_split=4이면, 샘플 수가 3인 노드들은 분할 불가
mean_samples_leaf
mean_samples_leaf=4이면, 샘플 수가 4 이하이면 리프 노드가 됨
: 결정 트리는 균일도에 기반해 어떤 속성을 규칙 조건으로 선택하는지가 중요. 중요한 몇 개의 피처가 명확한 규칙 트리를 만드는 데 기여하며, 간결하고 이상치에 강한 모델을 만들 수 있음. (featureimportances)
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)
petal length의 중요도가 가장 높음. 따라서 결정 트리의 루트 노드의 조건이 petal length에 대해서 생성됨.
X_features, y_labels = make_classification(n_features=2,
n_redundant=0, n_informative=2,n_classes=3,
n_clusters_per_class=1,random_state=0)
# n_features: 독립 변수의 수(여기서는 2차원 시각화를 위해 2로 설정)
# n_redundant: 독립 변수 중 다른 독립 변수의 선형 조합으로 나타나는 성분의 수
# n_informative: 독립 변수 중 종속 변수와 상관관계가 있는 변수의 수
# n_classes: 종속 변수의 클래스 수
# n_clusters_per_classes: 클래스 당 클러스터 수
좌측 그래프는 일부 이상치 데이터까지 분류하여 결정 기준 경계가 많아지고 매우 복잡해짐(과적합 가능성 매우 높음). 이를 min_samples_leaf=6을 설정하여 다시 시각화한 결과 이상치에 크게 반응하지 않으면서 좀 더 일반화된 분류 규칙에 따라 분류되었음.
@
: 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
: 서로 다른 알고리즘을 가진 분류기를 결합하여 최종 예측 결과를 결정하는 방식
하드 보팅: 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정
소프트 보팅: 분류기들의 레이블 값 결정 확률을 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정(일반적 방법/예측 성능이 더 좋음)
보팅 분류기(VotingClassifier)
# 로지스틱 회귀와 KNN 사용
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)
# 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기
vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)] , voting='soft' )
# estimator: 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력
# voting: hard/soft (default=hard)
보팅으로 분류기를 결합한다고 해서 무조건 예측 성능이 향상되는 것은 아님. 하지만 보통은 단일 알고리즘보다는 좋은 경우가 많음.
: 각각의 분류기가 모두 같은 유형의 알고리즘을 기반으로 하지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행 ex. 랜덤 포레스트
: 여러 개의 분류기가 순차적 학습, 앞선 분류기의 예측이 틀린 데이터에 대해서 다음 준류기에게 가중치를 부여하면서 학습과 예측 진행 ex. 그래디언트 부스트, XGBoost, LightGBM
: 여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법
: 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링하여 개별적으로 학습 수행, 최종적으로 모든 분류기가 보팅을 통해 예츠 결정
: 서브세트의 데이터 건수는 전체 데이터 건수와 동일하지만 개별 데이터가 중첩되어 있음.
params = {
'n_estimators':[100],
'max_depth' : [6, 8, 10, 12],
'min_samples_leaf' : [8, 12, 18 ],
'min_samples_split' : [8, 16, 20]
}
# RandomForestClassifier 객체 생성 후 GridSearchCV 수행
rf_clf = RandomForestClassifier(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rf_clf , param_grid=params , cv=2, n_jobs=-1 )
grid_cv.fit(X_train , y_train)