XGBoost와 사이킷런으로 배우는 그레이디언트 부스팅

이 책은 Packt 출판사에서 나온 <Hands-On Gradient Boosting with XGBoost and scikit-learn>의 번역서입니다.

여러 가지 다양한 문제에서 가장 뛰어난 성능을 내는 머신러닝 알고리즘이 있다면 무엇일까요? 바로 그레이디언트 부스팅(Gradient Boosting) 알고리즘입니다. 이는 여러 캐글 대회의 입상자 솔루션에서도 알 수 있고 XGBoost, LightGBM, CatBoost 같은 그레이디언트 부스팅 라이브러리들이 계속 등장하는 것으로도 짐작할 수 있습니다. 이 책은 그레이디언트 부스팅 알고리즘을 소개하고 XGBoost와 사이킷런 구현을 사용해 그레이디언트 부스팅 모델을 만드는 방법을 안내합니다. 또한 번역서 부록으로 LightGBM과 CatBoost, 사이킷런의 히스토그램 기반 그레이디언트 부스팅을 소개합니다. <XGBoost와 사이킷런을 활용한 그레이디언트 부스팅>으로 그레이디언트 부스팅 모델을 배우고 캐글 대회에도 도전해 보시죠! 🙂

  • 온라인/오프라인 서점에서 판매중입니다. [Yes24], [교보문고], [한빛미디어]
  • 380페이지, 풀컬러: 34,000원 –> 30,600원, 전자책 27,200원
  • 이 책에 실린 코드는 깃허브에 있습니다.
  • 이 책의 코드는 사이킷런 1.0, 1.1과 XGBoost 1.5, 1.6에서 테스트되었습니다.

이 페이지에서 수집된 에러타를 정리하여 제공합니다. 이 책에 대해 궁금한 점이나 오류가 있으면 이 페이지 맨 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹스 머신러닝/딥러닝 도서 Q&A에 글을 올려 주셔도 좋습니다. 또 카카오톡 오픈 채팅에 오셔서 문의해 주셔도 좋습니다.

감사합니다! 😀


Outputs (aka. errata)

  1. (p163) 첫 번째 식과 그 다음 줄, (p164) 네 개의 식과 3번째 4번째 줄, (p165) 두 번째, 세 번째 식에서 \hat{y}_l\hat{y}_i 로 정정합니다.(조*우 님)
  2. (p134) 4.2.4절 아래 2번 항목의 문단에서 “마지막으로 learning_rate=3으로 설정합니다”를 “마지막으로 learning_rate=1.0으로 설정합니다”로 정정합니다.(박*삭 님)
  3. (p45) 마지막 코드 블럭에서 df_bikes['dteday'].apply(pd.to_datetime, infer_datetime_format=True, errors='coerce')df_bikes['dteday'] = df_bikes['dteday'].apply(pd.to_datetime, infer_datetime_format=True, errors='coerce')로 정정합니다.(심*철 님)
  4. (p58) 첫 번째 코드 블럭에서 model = XGBRegressormodel = XGBRegressor()로 정정합니다.(심*철 님)
  5. (노트: 2022년 5월 현재 코랩의 파이썬 버전은 3.7.x로 사이킷런 1.0.x만 설치됩니다. 코랩을 사용하는 경우 이 항목의 수정 사항을 무시하세요) 사이킷런 1.1 버전에 따른 변경 사항
    • (p95, p96) DecisionTreeClassifierDecisionTreeRegressor, ExtraTreeClassifier, ExtraTreeRegressor, RandomForestClassifier, RandomForestRegressor, ExtraTreesClassifier, ExtraTreesRegressormax_features 매개변수 중 'auto''sqrt'와 동일합니다. 1.3 버전에서 'auto'가 삭제된다는 deprecated 경고가 발생하므로 'auto''sqrt'로 변경합니다.
      (p95) 위에서 9번째 줄, (p96) 위에서 3번째 줄, (p119) 아래에서 6번째 줄, (p120) 위에서 7번째 줄과 아래에서 9번째 줄, (p121) 위에서 4번째 줄과 아래에서 12번째 줄.
  6. XGBoost 1.6버전에 따른 변경 사항
    • 1.6 버전에서 use_label_encoder 매개변수 기본값이 True에서 False로 변경되었습니다. 따라서 타깃 레이블을 0부터 인코딩해야 합니다.
      (p149) 위에서 13번째 줄에서 y = df.iloc[:,0]y = df.iloc[:,0] - 1로 수정합니다.
      (p221) 위에서 3번째 줄에서 y = df.iloc[:,0]y = df.iloc[:,0] - 1로 수정합니다.
      (p232) 위에서 8번째 줄에서 “recall_score() 함수를 호출하려면 y_test, y_pred와 함께 pos_label=2로 지정해야 합니다”를 “recall_score() 함수를 호출하려면 y_testy_pred를 전달해야 합니다”로 수정합니다. 그 아래 recall_score() 함수 호출에서 pos_label=2를 삭제합니다.
      (p233) 아래에서 7번째 줄에서 y = df.iloc[:,0]y = df.iloc[:,0] - 1로 수정합니다. 아래에서 1번째 줄에서 pos_label=2를 삭제합니다.
      (p237) 위에서 2번째 줄에서 df_train[df_train['LABEL']==2].valuesdf_train[df_train['LABEL']==1].values로 수정합니다. 아래에서 1번째 줄에서 pos_label=2를 삭제합니다.
    • (p352) 1.6 버전에서 범주형 변수에 대한 지원이 추가되었습니다. 두 번째 문단 끝에 “1.6버전에서는 'approx''hist'에서도 범주형 변수를 지원합니다.”를 추가합니다.
  7. (p42) 위에서 5번째 줄에서 “열의 평균 값으로 누락된 값을 바꿉니다”를 “열의 중간 값으로 누락된 값을 바꿉니다”로 정정합니다.(심*철 님)
  8. (p57) 주석 19번의 마지막 줄에서 cv_results['test_core']cv_results['test_score']로 정정합니다.(심*철 님)
  9. (p74) 그림 2-2에서 (pi)^2(p_i)^2로 정정합니다.(이*재 님)
  10. (p96) 위에서 두 번째 줄에 [None, 6, 7][None, 7, 8, 9]로 바꾸어 주세요.(이*재 님, 조*철 님)
  11. (p100) 위에서 첫 번째 줄에 ‘순서가 달라졌으며 특성 간의 중요도 비율도 다릅니다’를 ‘특성 간의 중요도 비율이 다릅니다’로 바꾸어 주세요.(이*재 님)
  12. (p127) 아래에서 3번째 줄에 “각 트리의 예측 값을 더해 더해 모델 평가에 사용합니다”를 “각 트리의 예측 값을 더해 모델 평가에 사용합니다”로 정정합니다.(이*재 님)
  13. (p171) 마지막 줄에 “크래스별 확률을”을 “클래스별 확률을”로 정정합니다.(이*재 님)
  14. (p175) 5.4.1절 마지막에서 2번째 줄에 “붕괴하는 것을 발겼습니다“를 “붕괴하는 것을 발견했습니다“로 정정합니다. 페이지 아래에서 3번째 줄에 “인지하기 시작습니다“를 “인지하기 시작했습니다“로 정정합니다.(이*재 님)
  15. (p180) 위에서 6번째 줄에 “원래 보다 더 많은 신호가”를 “원래보다 더 많은 신호가”로 수정합니다.(이*재 님)
  16. (p196) 맨 첫 줄에서 “가낭 높은 점수를 내는”을 “가장 높은 점수를 내는”으로 정정합니다.(이*재 님)
  17. (p198) missing 매개변수의 노트/팁 열의 내용을 다음과 같이 정정합니다. “누락된 값으로 처리할 값을 지정합니다. 기본값은 None으로 np.nan을 누락된 값으로 처리합니다.”(이*재 님)
  18. (p203) 6.3.1절 아래 2번째 줄에서 “n 번의 반복횟수 동안에”를 “n 번의 반복 횟수 동안에”로 수정합니다.(이*재 님)
  19. (p212) 위에서 2번째 줄에 “확률이 높아 집니다“를 “확률이 높아집니다“로, 6.5.1절 위 2번째 줄에 “흥미롭운 결과입니다”를 “흥미로운 결과입니다”로 정정합니다.(이*재 님)
  20. (p233) 마지막 코드 블럭 맨 아래에서 2번째 줄에서 xg_clf.predict(X_test)model.predict(X_test)로 정정합니다.(이*재 님)
  21. (p249) 첫 번째 코드 블럭 2번째 줄에서 colsample_by_node=0.5colsample_bynode=0.5로 정정합니다.(이*재 님)
  22. (p286) 아래에서 3번째 줄에 training.cvstraining.csv로 정정합니다.(이*재 님)
  23. (p288) 위에서 4번째 줄에 ‘무색하게됩니다‘를 ‘무색하게 됩니다‘로 수정합니다. 위에서 12번째 줄에 ‘받기도하지만‘을 ‘받기도 하지만‘으로 수정합니다.(이*재 님)
  24. (p298) 9.3절 아래 6번째 줄에서 ‘랜덤 포레스트나 XGBoost 같은 부스팅이나 배깅 모델만’를 ‘랜덤 포레스트나 XGBoost 같은 배깅이나 부스팅 모델만’으로 수정합니다.(이*재 님)
  25. (p315) 아래에서 8번째 줄에서 ‘unkown‘을 ‘unknown‘으로 정정합니다.(이*재 님)
  26. (p326) 아래에서 11번째 줄에서 ‘a)’를 ‘d)’로 정정합니다.(이*재 님)
  27. (p330) 위에서 3번째 줄에 ‘희소 행렬을’을 ‘밀집 행렬을’로 정정합니다.(이*재 님)
  28. (p364) 아래에서 8번째 줄에서 ‘results 딕셔너리에는’을 ‘result 딕셔너리에는’으로 수정합니다.(이*재 님)
  29. (p366) 코드 블록 위 2번째 줄에서 ‘값으로 바꾸로‘를 ‘값으로 바꾸고‘로 수정합니다.(이*재 님)
  30. (p369) 11번 주석에서 ‘ranomzied_search’를 ‘randomized_search’로 수정합니다.(이*재 님)
  31. (p57) 아래에서 7번째 줄에 ‘980.38보다 조금 더’를 ‘898.21보다 조금 더’로 수정합니다.(박*근 님)
  32. (p59) pd_read_csv(...) 코드 아래 df_census.head()를 추가합니다.(박*근 님)
  33. (p117) 아래에서 9번째 줄에 ‘oob_scores를 그래프로’를 ‘rmse_scores를 그래프로’로 수정합니다.(박*근 님)
  34. (p132) 아래에서 8번째 줄에 ‘경사 하강법로 두 함수를’을 ‘경사 하강법으로 두 함수를’로 수정합니다.(박*근 님)
  35. (p292) 마지막 코드 블록의 첫 번째 줄에서 import datetime as dt를 삭제합니다.(박*근 님)
  36. (p304) 페이지 중간의 NOTE_에서 “경고를 방지하고“를 “경고를 방지하기 위해“로 수정합니다.(박*근 님)
  37. (p182) AMS 공식에서 -s 앞에 괄호를 추가하여 다음과 같이 수정합니다.(권*헌 님)
    \sqrt{2((s+b+b_{reg})ln(1+\dfrac{s}{b+b_{reg}})-s)}
  38. (p89) 13번 주석에서 ‘전체 특성 개수의’를 ‘전체 샘플 개수의’로 정정합니다.(권*헌 님)
  39. (p164) 위에서 첫 번째 주식에서 두 번째 항 \sum_{i=1}^t \Omega(f_t)\Omega(f_t)로 정정합니다.(조*철 님)
  40. (p164) 마지막 수식의 우변 항에서 2(y_i - \hat{y}^{t-1}_i)2(\hat{y}^{t-1}_i - y_i)로 정정합니다.(조*철 님)
  41. (p164) 아래에서 5번째 줄에서 “C는 t의 함수가 아닌”을 “C는 f_t의 함수가 아닌”으로 정정합니다.(조*철 님)

Your Inputs

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.