이 책은 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)
- (p163) 첫 번째 식과 그 다음 줄, (p164) 네 개의 식과 3번째 4번째 줄, (p165) 두 번째, 세 번째 식에서
을
로 정정합니다.(조*우 님)
- (p134) 4.2.4절 아래 2번 항목의 문단에서 “마지막으로
learning_rate=3
으로 설정합니다”를 “마지막으로learning_rate=1.0
으로 설정합니다”로 정정합니다.(박*삭 님) - (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')
로 정정합니다.(심*철 님) - (p58) 첫 번째 코드 블럭에서
model = XGBRegressor
를model = XGBRegressor()
로 정정합니다.(심*철 님) - (노트: 2022년 5월 현재 코랩의 파이썬 버전은 3.7.x로 사이킷런 1.0.x만 설치됩니다. 코랩을 사용하는 경우 이 항목의 수정 사항을 무시하세요) 사이킷런 1.1 버전에 따른 변경 사항
- (p95, p96)
DecisionTreeClassifier
와DecisionTreeRegressor
,ExtraTreeClassifier
,ExtraTreeRegressor
,RandomForestClassifier
,RandomForestRegressor
,ExtraTreesClassifier
,ExtraTreesRegressor
의max_features
매개변수 중'auto'
가'sqrt'
와 동일합니다. 1.3 버전에서'auto'
가 삭제된다는 deprecated 경고가 발생하므로'auto'
를'sqrt'
로 변경합니다.
(p95) 위에서 9번째 줄, (p96) 위에서 3번째 줄, (p119) 아래에서 6번째 줄, (p120) 위에서 7번째 줄과 아래에서 9번째 줄, (p121) 위에서 4번째 줄과 아래에서 12번째 줄.
- (p95, p96)
- 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_test
와y_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].values
를df_train[df_train['LABEL']==1].values
로 수정합니다. 아래에서 1번째 줄에서pos_label=2
를 삭제합니다. - (p352) 1.6 버전에서 범주형 변수에 대한 지원이 추가되었습니다. 두 번째 문단 끝에 “1.6버전에서는
'approx'
와'hist'
에서도 범주형 변수를 지원합니다.”를 추가합니다.
- 1.6 버전에서
- (p42) 위에서 5번째 줄에서 “열의 평균 값으로 누락된 값을 바꿉니다”를 “열의 중간 값으로 누락된 값을 바꿉니다”로 정정합니다.(심*철 님)
- (p57) 주석 19번의 마지막 줄에서
cv_results['test_core']
를cv_results['test_score']
로 정정합니다.(심*철 님) - (p74) 그림 2-2에서
를
로 정정합니다.(이*재 님)
- (p96) 위에서 두 번째 줄에
[None, 6, 7]
을[None, 7, 9]
로 바꾸어 주세요.(이*재 님) - (p100) 위에서 첫 번째 줄에 ‘순서가 달라졌으며 특성 간의 중요도 비율도 다릅니다’를 ‘특성 간의 중요도 비율이 다릅니다’로 바꾸어 주세요.(이*재 님)
- (p127) 아래에서 3번째 줄에 “각 트리의 예측 값을 더해 더해 모델 평가에 사용합니다”를 “각 트리의 예측 값을 더해 모델 평가에 사용합니다”로 정정합니다.(이*재 님)
- (p171) 마지막 줄에 “크래스별 확률을”을 “클래스별 확률을”로 정정합니다.(이*재 님)
- (p175) 5.4.1절 마지막에서 2번째 줄에 “붕괴하는 것을 발겼습니다“를 “붕괴하는 것을 발견했습니다“로 정정합니다. 페이지 아래에서 3번째 줄에 “인지하기 시작습니다“를 “인지하기 시작했습니다“로 정정합니다.(이*재 님)
- (p180) 위에서 6번째 줄에 “원래 보다 더 많은 신호가”를 “원래보다 더 많은 신호가”로 수정합니다.(이*재 님)
- (p196) 맨 첫 줄에서 “가낭 높은 점수를 내는”을 “가장 높은 점수를 내는”으로 정정합니다.(이*재 님)
- (p198)
missing
매개변수의 노트/팁 열의 내용을 다음과 같이 정정합니다. “누락된 값으로 처리할 값을 지정합니다. 기본값은 None으로 np.nan을 누락된 값으로 처리합니다.”(이*재 님) - (p203) 6.3.1절 아래 2번째 줄에서 “n 번의 반복횟수 동안에”를 “n 번의 반복 횟수 동안에”로 수정합니다.(이*재 님)
- (p212) 위에서 2번째 줄에 “확률이 높아 집니다“를 “확률이 높아집니다“로, 6.5.1절 위 2번째 줄에 “흥미롭운 결과입니다”를 “흥미로운 결과입니다”로 정정합니다.(이*재 님)
- (p233) 마지막 코드 블럭 맨 아래에서 2번째 줄에서
xg_clf.predict(X_test)
를model.predict(X_test)
로 정정합니다.(이*재 님) - (p249) 첫 번째 코드 블럭 2번째 줄에서
colsample_by_node=0.5
를colsample_bynode=0.5
로 정정합니다.(이*재 님) - (p286) 아래에서 3번째 줄에
training.cvs
를training.csv
로 정정합니다.(이*재 님) - (p288) 위에서 4번째 줄에 ‘무색하게됩니다‘를 ‘무색하게 됩니다‘로 수정합니다. 위에서 12번째 줄에 ‘받기도하지만‘을 ‘받기도 하지만‘으로 수정합니다.(이*재 님)
- (p298) 9.3절 아래 6번째 줄에서 ‘랜덤 포레스트나 XGBoost 같은 부스팅이나 배깅 모델만’를 ‘랜덤 포레스트나 XGBoost 같은 배깅이나 부스팅 모델만’으로 수정합니다.(이*재 님)
- (p315) 아래에서 8번째 줄에서 ‘unkown‘을 ‘unknown‘으로 정정합니다.(이*재 님)
- (p326) 아래에서 11번째 줄에서 ‘a)’를 ‘d)’로 정정합니다.(이*재 님)
- (p330) 위에서 3번째 줄에 ‘희소 행렬을’을 ‘밀집 행렬을’로 정정합니다.(이*재 님)
- (p364) 아래에서 8번째 줄에서 ‘results 딕셔너리에는’을 ‘result 딕셔너리에는’으로 수정합니다.(이*재 님)
- (p366) 코드 블록 위 2번째 줄에서 ‘값으로 바꾸로‘를 ‘값으로 바꾸고‘로 수정합니다.(이*재 님)
- (p369) 11번 주석에서 ‘ranomzied_search’를 ‘randomized_search’로 수정합니다.(이*재 님)
- (p57) 아래에서 7번째 줄에 ‘980.38보다 조금 더’를 ‘898.21보다 조금 더’로 수정합니다.(박*근 님)
- (p59)
pd_read_csv(...)
코드 아래df_census.head()
를 추가합니다.(박*근 님) - (p117) 아래에서 9번째 줄에 ‘oob_scores를 그래프로’를 ‘rmse_scores를 그래프로’로 수정합니다.(박*근 님)
- (p132) 아래에서 8번째 줄에 ‘경사 하강법로 두 함수를’을 ‘경사 하강법으로 두 함수를’로 수정합니다.(박*근 님)
- (p292) 마지막 코드 블록의 첫 번째 줄에서
import datetime as dt
를 삭제합니다.(박*근 님) - (p304) 페이지 중간의 NOTE_에서 “경고를 방지하고“를 “경고를 방지하기 위해“로 수정합니다.(박*근 님)
Your Inputs