품질관리(QAQC) 데이터 부트캠프(본캠프)

본캠프_8주차(수)_TIL(랜덤 포레스트, XGBoost 정리)

Wat_zy 2025. 11. 5. 08:52

✅ 오늘 한 것

머신러닝의 이해와 라이브러리 활용 심화, 머신러닝 특강


✏️ 오늘 배운 점

머신러닝의 이해와 라이브러리 활용 심화

딥러닝: 자연어처리와 이미지 처리에 뛰어난 발전

- 딥러닝과 머신러닝

  • 공통점: 데이터로부터 가중치를 학습하여 패턴을 인식하고 결정을 내리는 알고리즘 개발과 관련된 인공지능(AI)의 하위 분야
  • 차이점
    • 머신러닝: 데이터 안의 통계적 관계를 찾아내며 예측이나 부류를 하는 방법
    • 딥러닝: 머신러닝의 한 분야로 신경세포 구조를 모방한 인공 신경망을 사용함.

경사 하강법(Gradient Descent): 모델의 손실 함수를 최소화하기 위해 모델의 가중치를 반복적으로 조정하는 최적화 알고리즘

  • 인공 신경망의 학습
    • 입력 데이터가 신경망의 각 층을 통과하면서 최종 출력까지 생성되는 과정을 순전파(Propagation)
    • 신경망의 오류를 역방향으로 전파하여 각 층의 가중치를 조절하는 과정을 역전파(Backpropagation)
  • epoch: 전체 데이터가 신경망을 통과하는 한 번의 사이클
    • 1000 epoch: 데이터 전체를 1000번 학습
  • batch: 전체 훈련 데이터 셋을 일정한 크기의 소 그룹으로 나눈 것
  • iteration: 전체 훈련 데이터 셋을 여러 개(=batch)로 나누었을 때 배치가 학습되는 횟수

머신러닝 특강

랜덤 포레스트: "한 사람의 판단보다 여러 사람의 판단이 더 정확하다"는 아이디어를 머신러닝에 적용한 것

핵심 아이디어:

  • 배깅(Bagging): 부트스트랩 샘플링으로 다양한 훈련 데이터 생성
  • 특성 무작위성: 각 분할에서 일부 특성만 고려
  • 투표 방식: 여러 트리의 예측을 종합 (분류: 다수결, 회귀: 평균)

1단계: 부트스트랩 샘플링(원본 데이터에서 복원 추출로 새로운 데이터셋을 만드는 방법)

2단계: 특성 무작위성(Random Feature Selection, 각 노드 분할 시 전체 특성 중 일부만 랜덤하게 선택하여 고려하는 방법)

3단계: 투표 방식 (Votiong Mechanism)

1단계: 랜덤 포레스트 모델 생성
# RandomForestClassifier import
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 랜덤 포레스트 모델 생성
rf_model = RandomForestClassifier(
    n_estimators=100,        # 트리 개수
    max_depth=10,           # 최대 깊이
    min_samples_split=20,   # 분할 최소 샘플
    min_samples_leaf=10,    # 리프 최소 샘플
    max_features='sqrt',    # 특성 무작위성 루트
    bootstrap=True,         # 부트스트랩 사용
    random_state=42,
)


2단계: 모델 학습 과정
# 학습 시간 측정
import time
start_time = time.time()

rf_model.fit(X_train, y_train)

end_time = time.time()
training_time = end_time - start_time

3단계: 기본 성능 평가
rf_train_pred = rf_model.predict(X_train)
rf_test_pred = rf_model.predict(X_test)

# 정확도 계산
rf_train_acc = accuracy_score(y_train, rf_train_pred)
rf_test_acc = accuracy_score(y_test, rf_test_pred)
rf_overfit = rf_train_acc - rf_test_acc

# 특성 중요도 추출
feature_importance = pd.DataFrame({
    'feature': X.columns,
    'importance': rf_model.feature_importances_
}).sort_values('importance', ascending=False)

for idx, row in feature_importance.iterrows():
    print(f"{row['feature']:15}: {row['importance']:.3f}")
트리 시각화
first_tree = rf_model.estimators_[0] # 첫 번째 트리를 가져옴

for i in range(0, 100):
	first_tree = rf_model.estimators_[i]
	
# 첫 번째 트리 시각화
plt.figure(figsize=(20, 12))
plot_tree(first_tree,
          feature_names=X.columns,
          class_names=['사망', '생존'],
          filled=True,
          rounded=True,
          fontsize=10)
plt.title('랜덤 포레스트 내 첫 번째 디시전 트리', fontsize=16)
plt.show()

 

XGBoost: 그래디언트 부스팅을 극한으로 최적화한 알고리즘

1단계: 첫 번째 기본 트리 만들기(약한 분류기)

첫 번째 모델의 시도 + 결과 분석

2단계: 첫 번째 모델의 오차 분석하기

오차패턴 찾기 + 가중치 부여 메커니즘

3단계: 두 번째 약한 분류기 만들기 (실수 보완에 집중)

두 번째 모델의 학습 + 결과

4단계: 세 번째 약한 분류기 만들기 (남은 실수 더 보완)

앞선 모델들에서 계속해서 틀리는 요소들에 집중하여(가중치를 부여하여) 분류기 생성

무한정 모델을 추가하면 훈련 데이터(train)에만 과적합되기에 별도 검증 데이터(test)를 활용하여 검증 성능이 하락하면 조기 종료를 한다.

5단계: 최종 예측 - 모든 모델의 지혜 결합

1단계: XGBoost 라이브러리 import
import xgboost as xgb
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score, roc_auc_score
import time

2단계: XGBoost 모델 생성 및 하이퍼파라미터 설정
xgb_model = XGBClassifier(
    n_estimators=100,        # 부스팅 라운드 수 (트리 개수)
    max_depth=6,            # 트리 최대 깊이
    learning_rate=0.1,      # 학습률 (각 트리의 기여도)
    subsample=0.8,          # 샘플 서브샘플링 비율
    colsample_bytree=0.8,   # 특성 서브샘플링 비율
    random_state=42,
    eval_metric='logloss',  # 평가 지표
)

3단계: 조기 종료를 위한 검증 세트 준비
X_train, y_train, X_test, Y_text =>
8:2
100
x_train 80
20%
60% 20% 20% => 100%
X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(
    X_train, y_train, 
    test_size=0.2,           # 훈련 데이터의 20%를 검증용으로
    random_state=42, 
    stratify=y_train         # 클래스 비율 유지
)

4단계: XGBoost 모델 학습
# 학습 시간 측정
start_time = time.time()

# 학습
xgb_model.fit(
    X_train_split, y_train_split,
    eval_set=[(X_val_split, y_val_split)],  # 검증 세트 지정
)

end_time = time.time()
training_time = end_time - start_time

5단계: XGBoost 기본 성능 평가
xgb_train_pred = xgb_model.predict(X_train)
xgb_test_pred = xgb_model.predict(X_test)

# 정확도 계산
xgb_train_acc = accuracy_score(y_train, xgb_train_pred)
xgb_test_acc = accuracy_score(y_test, xgb_test_pred)
xgb_overfit = xgb_train_acc - xgb_test_acc

6단계: 특성 중요도 평가
feature_importance = pd.DataFrame({
    'feature': X.columns,
    'importance': xgb_model.feature_importances_
}).sort_values('importance', ascending=False)

✏️ 오늘의 핵심

오늘은 머신러닝의 핵심 알고리즘(랜덤 포레스트·XGBoost)과 딥러닝의 기본 원리, 그리고 모델 성능 향상을 위한 하이퍼파라미터 조정과 평가 기법(ROC 커브)를 배웠습니다.


📌추가로 해야할 점

프로젝트, 졸업 시험