01. 분류(Classification)의 개요¶
- 지도학습은 레이블(Label), 즉 명시적인 정답이 있는 데이터가 주어진 상태에서 학습하는 머신러닝 방식입니다. 즉, 기존 데이터가 어떤 레이블에 속하는지 패턴을 알고리즘으로 인지한 뒤에 새롭게 관측된 데이터에 대한 레이블을 판별하는 것입니다.
□ 분류는 다양한 머신러닝 알고리즘으로 구현
- 베이즈(Bayes) 통계와 생성 모델에 기반한 나이브 베이즈
- 독립변수와 종속변수의 선형 관계성에 기반한 로지스틱 회귀
- 데이터 균일도에 따른 규칙 기반의 결정 트리(Decision Tree)
- 개별 클래스 간의 최대 분류 마진을 효과적으로 찾아주는 서포트 벡터 머신(Support Vector Machine)
- 근접 거리를 기준으로 하는 최소 근접(Nearest Neighbor) 알고리즘
- 심층 연결 기반의 신경망(Neural Network)
- 서로 다른(또는 같은) 머신러닝 알고리즘을 결합한 앙상블(Ensemble)
- 이번 장에서는 앙상블 방법을 집중적으로 다룹니다. 이미지, 영상, 음성, NLP 영역에서 신경망에 기반한 딥러닝이 머신러닝계를 선도하고 있지만, 이를 제외한 정형 데이터의 예측 분석 영역에서는 앙상블이 매우 높은 예측 성능으로 인해 많이 애용되고 있습니다.
- 앙상블은 서로 다른/또는 같은 알고리즘을 단순히 결합한 형태도 있으나, 일반적으로 배깅(Bagging)과 부스팅(Boosting) 방식으로 나뉩니다.
- 배깅(Bagging)의 대표인 랜덤 포레스트(Random Forest)는 뛰어난 예측 성능, 상대적으로 빠른 수행 시간, 유연성 등으로 많은 분석가가 애용하는 알고리즘입니다.
- 부스팅(Boosting)의 대표인 그래디언트 부스팅(Gradient Boosting)의 경우 뛰어난 예측 성능을 가지고 있지만, 수행 시간이 너무 오래 걸리는 단점으로 인해 최적화 모델 튜닝이 어려웠습니다. 하지만 XgBoost와 LightGBM 등 기존 그래디언트 부스팅의 예측 성능을 한 단계 발전시키면서도 수행 시간을 단축시킨 알고리즘이 계속 등장하면서 정형 데이터의 분류 영역에서 가장 활용도 높은 알고리즘으로 자리 잡았습니다.
- 앙상블의 기본 알고리즘으로 결정 트리가 있으며 결정 트리는 매우 쉽고 유연하게 적용될 수 있는 알고리즘입니다. 또한 데이터의 스케일링이나 정규화등의 사전 가공의 영향이 매우 적습니다. 하지만 예측 성능 향상을 위해 복잡한 규칙 구조를 가져 과적합이 발생해 예측 성능이 저하될 수도 있다는 단점이 있습니다.
- 하지만 앙상블은 매우 많은 여러 개의 약한 학습기를 결합해 확률적 보완과 오류가 발생한 부분에 대한 가중치를 계속 업데이트하면서 예측 성능을 향상시키는데, 결정 트리가 좋은 약한 학습기가 되기 때문에 결정트리의 과적합 단점은 앙상블 기법에서는 장점으로 작용합니다.
02. 결정 트리¶
- 결정 트리(Decision Tree)는 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리(Tree) 기반의 분류 규칙을 만드는 것입니다. 데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘의 성능을 크게 좌우합니다.
- 결정 트리는 규칙 노드(Decision Node)로 표시된 노드는 규칙 조건이 되는 것이고, 리프 노드(Leaf Node)로 표시된 노드는 결정된 클래스 값입니다. 그리고 새로운 규칙 조건마다 서브 트리(Sub Tree)가 생성됩니다. 즉, 트리의 깊이(depth)가 깊어질수록 결정 트리의 예측 성능이 저하될 가능성이 높습니다.
- 따라서 가능한 한 적은 결정 노드로 높은 예측 정확도를 가지려면 데이터를 분류할 때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 합니다. 이를 위해 어떻게 트리를 분할(Split)할 것인가가 중요한데 최대한 균일한 데이터 세트를 구성할 수 있도록 분할하는 것이 필요합니다.
- 정보의 균일도를 측정하는 대표적인 방법인 엔트로피를 이용한 정보 이득 지수와 지니 계수가 있습니다.
※ 정보 이득은 엔트로피라는 개념을 기반으로 합니다. 엔트로피는 주어진 데이터 집합의 혼잡도를 의미하는데, 서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮습니다. 정보 이득 지수는 1 - 엔트로피 지수입니다. 결정 트리는 이 정보 이득 지수로 분할 기준을 정합니다. 즉, 정보 이득이 높은 속성을 기분으로 분할합니다.
※ 지니 계수는 0이 가장 평등하고 1로 갈수록 불평등합니다. 머신러닝에 적용될 때는 지니 계수가 낮을수록 데이터 균일도가 높은 것으로 해석해 지니 계수가 낮은 속성을 기준으로 분할합니다.
- 결정 트리는 정보 이득이 높거나 지니 계수가 낮은 조건을 찾아서 자식 트리 노드에 걸쳐 반복적으로 분할한 뒤, 데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 결정합니다.
◎ 결정 트리 모델의 특징¶
- 결정 트리의 가장 큰 장점은 정보의 '균일도'라는 룰을 기반으로 하고 있어서 알고리즘이 쉽고 직관적이라는 점입니다.
- 결정 트리 룰이 매우 명확하고, 이에 기반해 어떻게 규칙 노드와 리프 노드가 만들어 지는지 알 수 있고, 시각화로 표현까지 할 수 있습니다. 또한 정보의 균일도만 신경 쓰면 되므로 특별한 경우를 제외하고는 각 피처의 스케일링과 정규화 같은 전처리 작업이 필요 없습니다.
- 반면에 과적합으로 정확도가 떨어진다는 점이 가장 큰 결정 트리의 단점입니다. 피처 균일도에 따른 룰 규칙으로 서브 트리를 계속 만들다 보면 피처가 많고 균일도가 다양하게 존재할수록 트리의 깊이가 커지고 복잡해질 수 밖에 없습니다.
- 복잡한 학습 모델은 결국에는 실제 상황에 유연하게 대처할 수 없어서 예측 성능이 떨어질 수밖에 없습니다. 차라리 모든 데이터 상황을 만족하는 완벽한 규칙은 만들 수 없다고 먼저 인정하는 편이 더 나은 성능을 보장할 수 있습니다. 즉, 트리의 크기를 샂전에 제한하는 것이 오히려 성능 튜닝에 더 도움이 됩니다.
◎ 결정 트리 파라미터¶
- 사이킷런은 결정 트리 알고리즘을 구현한 DecisionTreeClassifier와 DecisionTreeRegressor 클래스를 제공합니다. 사이킷런의 결정 트리 구현은 CART(Classificcation And Regression Trees)알고리즘 기반입니다.
□ 파라미터
※ min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터 수로 과적합을 제어하는 데 사용, 디폴트는 2이고 작게 설정할수록 과적합 가능성 증가
※ min_samples_leaf : 말단 노드(Leaf)가 되기 위한 최소한의 샘플 데이터 수, min_samples_split와 유사하게 과적합 제어 용도, 그러나 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우 작게 설정 필요
※ max_features : 최적의 분할을 위해 고려할 최대 피처 개수, 디폴트는 None으로 데이터 세트의 모든 피처를 사용해 분할 수행, int 형으로 지정하면 대상 피처의 개수, float 형으로 지정하면 전체 피처 중 대상 피처의 퍼센트
※ max_depth : 트리의 최대 깊이, None으로 설정하면 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가
※ max_leaf_nodes : 말단 노드(Leaf)의 최대 개수
◎ 결정 트리 모델의 시각화¶
- 결정 트리 알고리즘이 어떠한 규칙을 가지고 트리를 생성하는지 시각적으로 보여주는 Graphviz 패키지가 있습니다.
- Graphviz는 파이썬으로 개발된 패키지가 아니며 Graphviz를 설치한 뒤에 파이썬과 인터페이스할 수 있는 파이썬 래퍼(Wrapper) 모듈을 별도로 설치해야 합니다.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
# DecisionTree Classifier 생성
dt_clf = DecisionTreeClassifier(random_state=156)
# 붓꽃 데이터를 로딩하고, 학습과 테스트 데이터 셋으로 분리
iris_data = load_iris()
X_train , X_test , y_train , y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.2, random_state=11)
# DecisionTreeClassifer 학습.
dt_clf.fit(X_train , y_train)
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는 결정 트리의 최대 트리 깊이를 제어합니다. max_depth를 제한 없음에서 3개로 설정하면 간단한 결정 트리가 됩니다.
- min_samples_splits는 자식 규칙 노드를 분할해 만들기 위한 최소한의 샘플 데이터 개수입니다.
- min_samples_leaf는 리프 노드가 될 수 있는 샘플 데이터 건수의 최솟값을 지정합니다. 즉 min_sample_leaf의 값을 키우면 더 이상 분할하지 않고, 리프 노드가 될 수 있는 조건이 완화됩니다.
- 사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는 데 있어 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 featureimportances 속성으로 제공합니다.
◎ 결정 트리 과적합(Overfitting)¶
- 사이킷런은 분류를 위한 테스트용 데이터를 쉽게 만들 수 있도록 make_classification() 함수를 제공합니다.
- 결정 트리는 학습 데이터에만 지나치게 최적화된 분류 기준을 만들어 테스트 데이터 세트에서 정확도를 떨어뜨릴 수 있습니다.
- visuallize_boundary(dt, X, y)는 기준 경계를 시각화하는 코드
◎ 결정 트리 실습 - 사용자 행동 인식 데이터 세트¶
- 생략
03. 앙상블 학습¶
◎ 앙상블 학습 개요¶
- 앙상블 학습(Ensemble Learning)을 통한 분류는 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법을 말합니다. 즉, 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 신뢰성이 높은 예측값을 얻는 것입니다.
- 앙상블 학습의 유형은 전통적으로 보팅(Voting), 배깅(Bagging), 부스팅(Boosting)의 세 가지로 나눌 수 있으며, 이외에도 스태깅을 포함한 다양한 앙상블 방법이 있습니다.
- 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식입니다. 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고, 배갱의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링이 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것입니다.
- 개별 분류기가 부트스트래핑(개별 Classifier에게 데이터 샘플링해서 추출하는 방식)방식으로 샘플링된 데이터 세트에 대해서 학습을 통해 개별적인 예측을 수행한 결과를 보팅을 통해서 최종 예측 결과를 선정하는 방식이 바로 배깅 앙상블 방식입니다.
- 교차 검증이 데이터 세트간에 중첩을 허용하지 않는 것과 다르게 배깅 방식은 중첩을 허용합니다.
- 부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 가중치(weight)를 부여하면서 학습과 예측을 진행하는 것입니다. 대표적인 부스팅 모듈로 그래디언트 부스트, XGBoost, LightGBM이 있습니다.
- 스태킹은 여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법입니다.
◎ 보팅 유형 - 하드 보팅와 소프트 보팅¶
- 보팅 방법에는 하드 보팅과 소프트 보팅 두 가지가 있습니다. 하드 보팅을 이용한 분류는 다수결 원칙과 비슷합니다. 소프트 보팅은 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정합니다. 일반적으로 소프트 보팅이 보팅 방법으로 적용됩니다.
- 일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 좋아서 더 많이 사용됩니다.
◎ 보팅 분류기(Voting Classifier)¶
- 사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공하고 있습니다.
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
data_df.head(3)
mean radius | mean texture | mean perimeter | mean area | mean smoothness | mean compactness | mean concavity | mean concave points | mean symmetry | mean fractal dimension | ... | worst radius | worst texture | worst perimeter | worst area | worst smoothness | worst compactness | worst concavity | worst concave points | worst symmetry | worst fractal dimension | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 17.99 | 10.38 | 122.8 | 1001.0 | 0.11840 | 0.27760 | 0.3001 | 0.14710 | 0.2419 | 0.07871 | ... | 25.38 | 17.33 | 184.6 | 2019.0 | 0.1622 | 0.6656 | 0.7119 | 0.2654 | 0.4601 | 0.11890 |
1 | 20.57 | 17.77 | 132.9 | 1326.0 | 0.08474 | 0.07864 | 0.0869 | 0.07017 | 0.1812 | 0.05667 | ... | 24.99 | 23.41 | 158.8 | 1956.0 | 0.1238 | 0.1866 | 0.2416 | 0.1860 | 0.2750 | 0.08902 |
2 | 19.69 | 21.25 | 130.0 | 1203.0 | 0.10960 | 0.15990 | 0.1974 | 0.12790 | 0.2069 | 0.05999 | ... | 23.57 | 25.53 | 152.5 | 1709.0 | 0.1444 | 0.4245 | 0.4504 | 0.2430 | 0.3613 | 0.08758 |
3 rows × 30 columns
# 개별 모델은 로지스틱 회귀와 KNN 임.
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)
# 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기
vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)] , voting='soft' )
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
test_size=0.2 , random_state= 156)
# VotingClassifier 학습/예측/평가.
vo_clf.fit(X_train , y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.4f}'.format(accuracy_score(y_test , pred)))
# 개별 모델의 학습/예측/평가.
classifiers = [lr_clf, knn_clf]
for classifier in classifiers:
classifier.fit(X_train , y_train)
pred = classifier.predict(X_test)
class_name= classifier.__class__.__name__
print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test , pred)))
Voting 분류기 정확도: 0.9474
LogisticRegression 정확도: 0.9386
KNeighborsClassifier 정확도: 0.9386
§ 보팅으로 여러 개의 기반 분류기를 결합한다고 해서 무조건 기반 분류기보다 예측 성능이 향상되지는 않습니다.
§ 보팅과 스태킹은 서로 다른 알고리즘을 기반으로 하고 있지만, 배깅과 부스팅은 대부분 결정 트리 알고리즘을 기반으로 합니다. 이처럼 앙상블 학습에서는 결정 트리 알고리즘의 과적합이라는 단점을 많은 분류기를 결합해 다양한 상황을 학습하게 함으로써 극복하고 있습니다.
04. 랜덤 포레스트¶
◎ 랜덤 포레스트의 개요 및 실습¶
- 배깅의 대표적인 알고리즘은 랜덤 포레스트입니다. 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며, 다양한 영역에서 높은 예측 성능을 보이고 있습니다. 랜덤 포레스트의 기반 알고리즘은 결정 트리로서, 결정 트리의 쉽고 직관적인 장점을 그대로 가지고 있습니다.
- 랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅(소프트 보팅)을 통해 예측 결정을 하게 됩니다.
- 랜덤 포레스트는 여러 개의 데이터 세트를 중첩되게 부리하는 부트스트래핑(bootstrapping) 분할 방식을 사용합니다.
- n_estimators = 3으로 하이퍼 파라미터를 부여하면 3개의 결정 트리 기반으로 학습을 진행합니다.
◎ 랜덤 포레스트 하이퍼 파라미터 및 튜닝¶
- 트리 기반의 앙상블 알고리즘의 단점은 하이퍼 파라미터가 많고, 그로 인해 튜닝을 위한 시간이 많이 소모된다는 것입니다.
※ 파라미터
- n_estimators : 랜덤 포레스트에서 결정 트리의 개수를 지정합니다. 디폴트는 10개입니다.
- max_features : 결정 트리에 사용된 max_features 파라미터와 같습니다. 디폴트는 'None'이 아니라 'auto' 즉 'sqrt'
- max_depth 나 min_sample_leaf : 결정 트리에서 과적합을 개선하기 위해 사용되는 파라미터
- 랜덤 포레스트는 CPU 병렬 처리도 효과적으로 수행되어 빠른 학습이 가능
- GridSearchCV 생성 시 n_jobs = -1 파라미터를 추가하면 모든 CPU 코어를 이용해 학습할 수 있습니다.
05. GBM(Gradient Boosting Machine)¶
◎ GBM의 개요 및 실습¶
- 부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식입니다. 부스팅의 대표적인 구현은 AdaBoost(Adaptive boosting)와 그래디언트 부스트가 있습니다.
- GBM도 에이다부스트와 유사하나, 가중치 업데이트를 경사 하강법(Gradient Descent)을 이용하는 것이 큰 차이입니다.
- 오류 값 = 실제 값 - 예측값으로 오류값을 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트하는 것이 경사 하강법입니다.
- 일반적으로 GBM이 랜덤 포레스트보다는 예측 성능이 조금 뛰어난 경우가 많습니다. 그러나 수행 시간이 오래 걸리고, 하이퍼 파라미터 튜닝 노력도 더 필요합니다.
- 사이킷런의 GradientBoostingClassifier는 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 CPU 코어 시스템을 사용하더라도 병렬 처리가 지원되지 않아서 대용량 데이터의 경우 학습에 매우 많은 시간이 필요합니다.
◎ GBM 하이퍼 파라미터 및 튜닝¶
※ 파라미터
- loss : 경사 하강법에서 사용할 비용 함수를 지정합니다.
- learning_rate : GBM이 학습을 진행할 때마다 적용하는 학습률입니다. 0~1 사이의 값을 지정할 수 있으며 기본값은 0.1입니다. 너무 작은 값을 적용하면 업데이트 되는 값이 작아져서 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 높습니다. 하지만 많은 반복이 필요해서 수행 시간이 오래 걸립니다. 이러한 특성 때문에 learning-rate는 n_estimators와 상호 보완적으로 조합해 사용합니다.learning_rate는 작게 n_estimators는 크게 하면 성능이 좋아지지만 오래 걸립니다.
- n_estimators : weak learner의 개수입니다.
- subsample : weak learner가 학습에 사용하는 데이터 샘플링 비율입니다. 과적합이 염려가 되는 경우 subsample을 1보다 작은 값으로 설정합니다.
- GBM은 과적합에도 강한 뛰어난 예측 성능을 가진 알고리즘입니다. 하지만 수행 시간이 오래 걸린다는 단점이 있습니다.
06. XGBoost(eXtra Gradient Boost)¶
◎ XGBoost 개요¶
- XGBoost는 트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘 중 하나입니다. XGBoos는 GBM에 기반하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제 부재 등의 문제를 해결, 병렬 CPU 환경에서 병렬 학습이 가능해 빠르게 학습을 완료할 수 있습니다.
- 장점 : 뛰어난 예측 성능, 빠른 수행 시간, 과적합 규제, Tree pruning, 자체 내장된 교차 검증, 결손값 자체 처리
◎ 파이썬 래퍼 XGBoost 하이퍼 파라미터¶
※ 주요 일반 파라미터
- booster : gbtree(tree based model) 또는 gblinear(linear model) 선택, 디폴트는 gbtree입니다.
- silent : 디폴트는 0이며 출력 메시지를 나타내고 싶지 않을 경우 1로 설정
- nthread : CPU의 실행 스레드 개수를 조정하며, 디폴트는 CPU의 전체 스레드를 다 사용하는 것입니다.
※ 주요 부스터 파라미터
- eta : 학습률과 같은 파라미터, 사이킷런 래퍼 크래스의 경우 eta는 learning_rate 파라미터로 대체되며 디폴트는 0.1입니다. 보통은 0.01~0.2 사이의 값을 선호합니다.
- num_boost_rounds : GBM의 n_estimators와 같은 파라미터
- min_child_weight : 트리에서 추가적으로 가지를 나눌지를 결정, 클수록 분할을 자제하며 과적합 조절을 위해 사용.
- gamma : 해당 값보다 큰 손실이 감소된 경우에 리프 노드를 분리합니다. 값이 클수록 과적합 감소 효과가 있습니다.
- max_depth : 0을 지정하면 깊이에 제한이 없습니다. 보통은 3~10 사이의 값을 적용
- sub_sample : 데이터를 샘플링하는 비율을 지정, 0.5로 지정하면 전체 데이터의 절반을 트리를 생성하는 데 사용. 0.5~1 사이의 값을 사용
- colsample_bytree : 트리 생성에 필요한 피처를 임의로 샘플링하는 데 사용, 매우 많은 피처가 있는 경우 과적합을 조정하는 데 사용.
- lambda :피처 개수가 많을 경우 적용을 검토하며 클수록 과적합 감소 효과가 있습니다.
- scale_pos_weight : 특정 값으로 치우친 비대칭한 클래스로 구성된 데이터 세트의 균형을 유지하기 위한 파라미터
※ 학습 태스크 파라미터
- objective : 최솟값을 가져야할 손실 함수를 정의합니다.
- binary:logistic : 이진 분류일 때 적용
- multi:sofmax : 다중 분류일때 적용
- multi:softprob : 개별 레이블 클래스의 해당되는 예측 확률을 반환
- eval_metric : 검증에 사용되는 함수 정의 (rmse, mae, logloss, error, merror, mlogloss, auc)
§ 뛰어난 알고리즘일수록 파라미터를 튜닝할 필요가 적습니다. 그리고 파라미터 튜닝에 들이는 공수 대비 성능 향상 효과가 높지 않는 경우가 대부분입니다.
§ XGBoost 자체적으로 교차 검증, 성능 평가, 피처 중요도 등의 시각화 기능을 가지고 있으며 수행 속도를 향상시키기 위한 조기 중단 기능이 있습니다. n_estimators에 지정한 부스팅 반복 횟수에 도달하지 않더라도 예측 오류가 더 이상 개선되지 않으면 반복을 중지해 수행 시간을 개선
◎ 파이썬 래퍼 XGBoost 적용 - 위스콘신 유방암 예측¶
- 생략
07. LightGBM¶
- LightGBM의 가장 큰 장점은 XGBoost보다 학습에 걸리는 시간이 훨씬 적다는 점입니다. 또한 메모리 사용량도 상대적으로 적습니다.
- LightGBM의 단점은 적은 데이터 세트(10,000 이하)에 적용할 경우 과적합이 발생하기 쉽다는 것입니다.
- LightGBM은 트리 분할 방법과 다르게 리프 중심 트리 분할(Leaf Wise) 방식을 사용합니다. 기존의 대부분 트리 기반 알고리즘은 균형 트리 분할 방식이 사용 이렇게 균형 잡힌 트릴르 생성하는 이유는 오버피팅에 보다 더 강한 구조를 가질 수 있다고 알려져 있기 때문입니다. 반대로 균형을 맞추기 위한 시간이 필요하다는 상대적인 단점이 잇지만 LightGBM의 리프 중심 트리 분할 방식은 트리 균형을 맞추지 않고, 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성됩니다. 이렇게 최대 손실값을 가지는 리프 노드를 지속적으로 분할해 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화 할 수 있다는 것이 LightGBM의 구현 사상입니다.
◎ LightGBM 하이퍼 파라미터¶
※ 주요 파라미터
- num_iterations : 반복 수행하려는 트리의 개수를 지정, n_estimators와 같은 의미
- learning_rate : 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값
- max_depth
- min_data_in_leaf : min_child_samples
- num_leaves : 하나의 트리가 가질 수 있는 최대 리프 개수
- boosting : 부스팅 트리를 생성하는 알고리즘 기술 (gbdt : 그래디언트 부스팅, rf : 랜덤 포레스트)
- bagging_fraction : 데이터를 샘플링하는 비율 (= subsample)
- feature_fraction : 개별 트리를 학습할 때마다 무작위로 선택하는 피처의 비율 (= colsample_bytree)
- lambda_l2 : 피처 개수 많을 경우 과적합 감소 효과 (=reg_lambda)
- lambda_l1 : (= reg_alpha)
◎ LightGBM 적용 - 위스콘신 유방암 예측¶
- 생략
08. 분류 실습 - 캐글 산탄데르 고객 만족 예측¶
- df[''].replace(-99999, 2, inplace=True) => 값을 변환하는 코드
※ 학습 시간이 많이 필요한 ML 모델인 경우 하이퍼 파라미터 튜닝을 수행하는 요령 중 첫 번째는 먼저 2~3개 정도의 파라미터를 결합해 최적 파라미터를 찾아낸 뒤에 이 최적 파라미터를 기반으로 다시 1~2개 파라미터를 결합해 파라미터 튜닝을 수행하는 것입니다.
※ 앙상블 계열 알고리즘은 과적합이나 잡음에 기본적으로 뛰어난 알고리즘이기에 하이퍼 파라미터 튜닝으로 성능 수치 개선이 급격하게 되는 경우는 많지 않습니다.
09. 분류 실습 - 캐글 신용카드 사기 검출¶
- 사기 검출이나 이상 검출과 같은 데이터 세트는 레이블 값이 극도로 불균형한 분포를 가집니다.
◎ 언더 샘플링과 오버 샘플리의 이해¶
- 지도학습에서 극도로 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해서는 적절한 학습 데이터를 확보하는 방안이 필요한데, 대표적으로 오버 샘플링(Oversampling)과 언더 샘플링(Undersampling) 방법이 있으며, 오버 샘플링 방식이 예측 성능상 더 유리한 경우가 많아 주로 사용됩니다.
- 언더 샘플링은 많은 데이터 세트를 적은 데이터 세트 수준으로 감소시키는 방식입니다. 정상 레이블 데이터를 이상 레이블 데이터 수준으로 줄여 버린 상태에서 학습을 수행하면 과도하게 정상 레이블로 학습/예측하는 부작용을 개선할 수 있지만, 너무 많은 정상 레이블 데이터를 감소시키기 때문에 정상 레이블의 경우 오히려 제대로 된 학습을 수행할 수 없다는 단점이 있어 잘 적용하지 않는 방법입니다.
- 오버 샘플링은 이상 데이터와 같은 적은 데이터 세트를 증식하여 학습을 위한 충분한 데이터를 확보하는 방법입니다. 동일한 데이터를 단순히 증식하는 방법은 과적합이 되기 때문에 의미가 없으므로 원본 데이터의 피처 값들을 아주 약간만 변경하여 증식합니다. 대표적으로 SMOTE(Synthetic Minority Over-sampling Technique) 방법이 있습니다. SMOTE는 적은 데이터 세트에 있는 개별 데이터들의 K 최근접 이웃(K Nearest Neighbor)을 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터들을 생성하는 방식입니다.
- SMOTE의 파이썬 패키지는 imbalanced-learn
- train_test_split( stratify=y_target)으로 Stratified 기반 분할 코드
- 극도로 불균형한 레이블 값 분포도를 가지고 있는 데이터 세트는 LGBMClassifier 객체 생성시 boost_from_average=False로 파라미터를 설정해야 합니다.
◎ 데이터 분포도 변환 후 모델 학습/예측/평가¶
- 로지스특 회귀 같은 선형 모델은 중요 피처들의 값이 정규 분포 형태를 유지하는 것을 선호합니다.(대부분 StandardScaler 클래스 사용)
- 로그 변환은 데이터 분포도가 심각하게 왜곡되어 있을 경우 적용하는 중요 기법 중에 하나입니다. 그 이유는 원래 값을 log 값으로 변환해 원래 값을 상대적으로 작은 값으로 변환하기 때문에 데이터 분포도의 왜곡을 상당 수준 개선해 줍니다.(넘파이의 log1p() 사용)
◎ 이상치 데이터 제거 후 모델 학습/예측/평가¶
- 이상치를 찾는 방법은 여러 가지가 있습니다. 그 중에서 IQR(Inter Quantile Range) 방식은 사분위 값의 편차를 이용하는 기법으로 흔히 박스 플롯 방식으로 시각화할 수 있습니다.
- 매우 많은 피처가 있을 경우 이들 중 결정값과 가장 상관성이 높은 피처들을 위주로 이상치를 검출하는 것이 좋습니다.
# IQR을 통한 이상치 제거 코드
def get_outlier(df=None, column=None, weight=1.5):
# fraud에 해당하는 column 데이터만 추출, 1/4 분위와 3/4 분위 지점을 np.percentile로 구함.
fraud = df[df['Class']==1][column]
quantile_25 = np.percentile(fraud.values, 25)
quantile_75 = np.percentile(fraud.values, 75)
# IQR을 구하고, IQR에 1.5를 곱하여 최대값과 최소값 지점 구함.
iqr = quantile_75 - quantile_25
iqr_weight = iqr * weight
lowest_val = quantile_25 - iqr_weight
highest_val = quantile_75 + iqr_weight
# 최대값 보다 크거나, 최소값 보다 작은 값을 아웃라이어로 설정하고 DataFrame index 반환.
outlier_index = fraud[(fraud < lowest_val) | (fraud > highest_val)].index
return outlier_index
outlier_index = get_outlier(df=df_copy, column='V14', weight=1.5)
df_copy.drop(outlier_index, axis=0, inplace=True)
◎ SMOTE 오버 샘플링 적용 후 모델 학습/예측/평가¶
- SMOTE를 적용할 때는 반드시 학습 데이터 세트만 오버 샘플링을 해야 합니다. 검증 데이터 세트나 테스트 데이터 세트를 오버 샘플링할 경우 결국은 원본 데이터 세트가 아닌 데이터 세트에서 검증 또는 테스트를 수행하기 때문에 올바른 검증/테스트가 될 수 없습니다.
- 좋은 SMOTE 패키지일수록 재현율 증가율은 높이고 정밀도 감소율은 낮출 수 있도록 효과적으로 데이터를 증식합니다.
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=0)
X_train_over, y_train_over = smote.fit_sample(X_train, y_train)
10. 스태킹 앙상블¶
- 스태킹(Stacking)은 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출하는 점에서 앞에 소개한 배깅(Bagging) 및 부스팅(Boosting)과 공통점을 가지고 있습니다.
- 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식입니다.
- 스태킹 모델은 두 종류의 모델이 필요합니다. 첫 번째는 개별적인 기반 모델이고, 두 번째 이 개별 기반 모델의 예측 데이터를 학습 데이터로 만들어서 학습하는 최종 메타 모델입니다.
- 스태킹 모델은 보통 조금이라도 성능 수치를 높히고자 할 경우 자주 사용됩니다,
◎ CV 세트 기반의 스태킹¶
- CV 세트 기반의 스태킹 모델은 과적합을 개선하기 위해 최종 메타 모델을 위한 데이터 세트를 만들 때 교차 검증 기반으로 예측된 결과 데이터 세트를 이용합니다.
11. 정리¶
- 대부분의 앙상블 기법은 결정 트리 기반의 다수의 약한 학습기(Weak Learner)를 결합해 변동성을 줄여 예측 오류를 줄이고 성능을 개선하고 있습니다.
- 결정 트리는 비교적 직관적인 장점과 균일한 최종 예측 결과를 도출하기 위해 결정 트리가 깊어지고 복잡해 지면서 과적합이 쉽게 발생한다는 단점이 있습니다.
- 앙상블 기법은 배깅과 부스팅으로 구분될 수 있으며, 배깅 방식은 학습 데이터 중복을 허용하면서 다수의 세트로 샘프링하여 이를 다수의 약한 하습기가 학습한 뒤 최종 결과를 결합해 예측하는 방식입니다.(랜덤 포레스트가 대표적 예)
- 부스팅은 학습기들이 순차적으로 학습을 진행하면서 예측이 틀린 데이터에 대해서는 가중치를 부여해 다음번 학습기가 학습할 때에는 이전에 예측이 틀린 데이터에 대해서는 보다 높은 정확도로 예측할 수 있도록 해줍니다.(GBM, XGBoost, LightGBM이 대표적 예)
- 스태킹은 여러 개의 개별 모델들이 생성한 예측 데이터를 기반으로 최종 메타 모델이 학습할 별도의 학습 데이터 세트와 예측할 테스트 데이터 세트를 재 생성하는 기법입니다.
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:80% !important;}</style>"))
'Book report > 파이썬 머신러닝 완벽가이드' 카테고리의 다른 글
[파이썬 머신러닝 완벽가이드] 06. 차원 축소 (0) | 2022.09.12 |
---|---|
[파이썬 머신러닝 완벽가이드] 05. 회귀 (0) | 2022.09.11 |
[파이썬 머신러닝 완벽가이드] 03. 평가 (0) | 2022.04.10 |
[파이썬 머신러닝 완벽가이드] 02. 사이킷런으로 시작하는 머신러닝 (0) | 2022.03.27 |
[파이썬 머신러닝 완벽가이드] 01. 파이썬 기반의 머신러닝과 생태계 이해 (0) | 2022.03.26 |