https://www.kaggle.com/code/satyaprakashshukl/mushroom-classification-analysis/notebook
이제 전처리가 끝났으니 모델 만들고 훈련을 시킵시다!
(신기한 점은 전처리 과정에서 별다른 거 하지 않고 단순하게 결측치만 KNN 처리했는데도 점수가 잘 나온다는 점이다!)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.2, random_state =42,stratify=y)
test는 따로 있기 때문에 여기서 test는 validation이라고 보면 된다.
이진 분류 성능을 평가하기 위한 metric으로 MCC(Matthews Correlation Coefficient)를 가져온다.
특히 "불균형한 데이터셋"에서 좋은 평가 지표로 사용된다.
DMatrix는 XGBoost 같은 라이브러리를 사용할 때, 데이터를 효율적으로 관리하기 위한 데이터 구조다.
이런 식으로 사용한다고 보면 된다.
MCC 공식은 다음과 같다.
이제 XGBClassifier를 만들자.
from sklearn.metrics import matthews_corrcoef
from xgboost import XGBClassifier
model = XGBClassifier(
alpha=0.1,
subsample=0.8,
colsample_bytree=0.6,
objective='binary:logistic',
max_depth=14,
min_child_weight=7,
gamma=1e-6,
#random_state=42,
n_estimators=100
)
alpha는 L1 정규화(라쏘 정규화)를 위한 파라미터다. 불필요한 특성의 weight를 0으로 만든다.
값이 클수록 강한 정규화를 적용하는데 여기서는 0.1로 약하게만 적용했다.
subsample은 부트스트랩 샘플링 비율을 위한 파라미터다. 이 비율을 낮추면 과적합을 방지할 수 있으나 너무 낮추면 성능이 낮아진다.
XGBoost는 여러 개의 트리를 사용하는 앙상블 기법 중 하나인데, Gradient Boosting이라는 알고리즘을 기반으로 하기 때문에 여러 개의 Weak Learners들을 순차적으로 학습하여 Strong Learners를 만든다.
colsample_bytree는 decision tree를 학습할 때 사용할 특성의 비율을 설정한다. 여기서는 60%만 택했는데 역시 과적합을 막기 위해 사용했다.
objective='binary:logistic'은 이진 분류 문제에 적합한 목적 함수로, 결과를 로지스틱 회귀로 계산하기 위해 지정하는 값이다.
max_depth는 생략.
min_child_weight는 leaf node가 분할되기 위해 필요한 최소 가중치의 합을 설정한다. min_samples_split는 단순히 데이터의 숫자로 나누는 반면, min_child_weight는 "가중치의 합"이 중요하다. 주로 Gradient Boosting 기반 모델에서 사용된다.
랜덤 포레스트와 XGBoost의 가장 큰 차이는 바로 이것이다.
그러니까 가중치가 적은 데이터와 높은 데이터는 엄연히 중요도가 다르기 때문에 단순히 데이터의 개수가 아니라 데이터의 가중치의 합으로 분할 기준을 두는 것이다.
gamma는 tree가 분할될 때 최소 손실 감소량을 정한다. 이 값이 1e^-6으로 아주 작게 설정되어 있는데, 즉, 손실이 조금이라도 줄어든다면 분할을 허용한다는 것이다.
n_estimators는 decision tree의 개수를 설정한다.
XGB = model.fit(
train_X,
train_y,
eval_set=[(test_X, test_y)],
eval_metric=mcc_metric)
이제 모델을 학습시키고 test를 통해 성능을 평가하자.
앞서 말했지만 애초에 test 데이터는 따로 있기 때문에 여기 있는 test는 validation으로 보는 것이 더 낫다.
'분명 전산학부 졸업 했는데 코딩 개못하는 조준호 > AI, ML, DL' 카테고리의 다른 글
한국은행 들어갈 때까지만 합니다
조만간 티비에서 봅시다