머신 러닝 교과서 3판

‘머신 러닝 교과서 with 파이썬, 사이킷런, 텐서플로(개정 3판)’는 세바스찬 라시카Sebastian Raschka와 바히드 미자리리Vahid Mirjalili가 쓴 아마존 베스트셀러 <Python Machine Learning 3rd Edition>의 번역서입니다.

아마존 베스트 셀러 Python Machine Learning이 3판으로 돌아왔습니다! 넘파이로 밑바닥부터 알고리즘을 만들어 보는 것으로 시작하여 사이킷런텐서플로를 사용해 머신러닝과 딥러닝의 주요 알고리즘을 총 망라하고 있습니다. 이론은 물론 다양한 예제를 통해 실전 문제를 해결하는 방법을 배울 수 있습니다! 모든 코드는 깃허브에서 주피터 노트북으로 제공하며 코랩을 사용해 실행해 볼 수 있습니다. 이 책을 혼자 공부하시는 독자들을 위해 유튜브 강좌도 진행합니다!

3판에서는 사이킷런과 텐서플로 최신 버전에서 변경된 내용을 많이 포함하고 있습니다. 특히 딥러닝 파트는 합성곱 신경망, 순환 신경망 이외에도 GAN강화 학습 장이 추가되어 내용이 크게 보강되었습니다. 자그만치 868 페이지의 두꺼운 책을 풀 컬러로 인쇄해주신 길벗 출판사에게 감사드립니다. 많은 수식과 부족한 번역 때문에 고생하신 편집자, 교정자, 디자이너에게 정말 감사드립니다.

  • 온라인/오프라인 서점에서 판매중입니다. [Yes24], [교보문고], [알라딘]
  • 868페이지, 컬러: 44,000원 –> 39,600원, 전자책 35,200원
  • 이 책에 실린 코드는 깃허브에 있습니다.
  • 동영상 강의를 유튜브로 제공합니다.
  • 이 책의 코드는 사이킷런 0.24, 1.0 버전, 텐서플로 2.4.0, 2.5.0, 2.6.0, 2.8.2에서 테스트 되었습니다.

이 페이지에서 수집된 에러타를 정리하여 제공합니다. 또 사이킷런이나 텐서플로의 새로운 버전에 맞춰 바뀐 점들을 계속 업데이트 하겠습니다. 이 책에 대해 궁금한 점이나 오류가 있으면 이 페이지 맨 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹스 머신러닝/딥러닝 도서 Q&A에 글을 올려 주셔도 좋습니다. 또 카카오톡 오픈 채팅(참여코드: tensor)에 오셔서 문의해 주셔도 좋습니다.

세바스찬이 번역서 표지가 마음에 드는 모양입니다! ㅎ

감사합니다! 🙂


Outputs (aka. errata)

  • ~16: 2쇄에 반영되었습니다.
  • ~31: 3쇄에 반영되었습니다.
  • ~38: 4쇄에 반영되었습니다.
  • ~38, 49~58: 5쇄에 반영되었습니다.
  1. (p54) 위에서 4번째 줄, 7번째 줄에서 w_ow_0으로 정정합니다.
  2. (p61) 6번 주석에서 xy에 있는 위첨자는 샘플의 인덱스를 나타냅니다. w의 위첨자는 경사 하강법 단계를 나타냅니다. 혼돈을 피하기 위해 xy에 있는 위첨자를 빼고 벡터 표현(굵은 글씨)으로 바꿉니다. 또한 첫 번째 줄 끝에 누락된 괄호도 추가하여 다음과 같이 수정합니다. “퍼셉트론 학습 규칙에서 초기 가중치를 0으로 놓으면 \boldsymbol{w}^{(1)}=\boldsymbol{w}^{(0)}+\mathit{\Delta}\boldsymbol{w}^{(1)}=\boldsymbol{w}^{(0)}+\eta(\boldsymbol{y}-\boldsymbol{\hat{y}})\boldsymbol{x}=\boldsymbol{w}^{(0)}+\eta(\boldsymbol{y}-\Phi(\boldsymbol{w}^{(0)}\boldsymbol{x}))\boldsymbol{x}=\eta(\boldsymbol{y}-\Phi(0))\boldsymbol{x}=\eta(\boldsymbol{y}-1)\boldsymbol{x}
    와 같습니다. 이렇게 \eta가 가중치 벡터의 크기에만 영향을 미칩니다. \boldsymbol{w}^{(0)}가 0이 아니라면 \eta 값의 크기에 따라 \boldsymbol{w}^{(1)} 방향이 바뀔 수 있습니다.”
  3. (p71) Note에 있는 수식 3번째 줄에서 두 번째 시그마(\sum) 기호를 삭제합니다.
  4. (p40 주석5번, p112 주석 20번) “<핸즈온 머신러닝>(한빛미디어, 2018)”을 “<핸즈온 머신러닝 2판>(한빛미디어, 2020)”으로 수정합니다.
  5. (p19) 3장 목차에서 “3.3.2 다중 클래스를 위한 로지스틱 회귀 094″를 삭제합니다. 그 아래 목차 번호를 ‘3.3.3’–>’3.3.2′, ‘3.3.4’–>’3.3.3′, ‘3.3.5’–>’3.3.4′, ‘3.3.6’–>’3.3.5′ 로 수정합니다. (p94) “3.3.2 다중 클래스를 위한 로지스틱 회귀 ~ 앞서 언급한 OvR 기법입니다”를 노트로 바꿉니다. (p97) 3.3.3 목차 번호를 3.3.2로 수정합니다. (p100) 3.3.4 목차 번호를 3.3.3으로 수정합니다. (p104) 3.3.5 목차 번호를 3.3.4로 수정합니다. (p106) 3.3.6 목차 번호를 3.3.5로 수정합니다.
  6. (p97) 2장의 식과 일관성을 유지하기 위해 페이지 맨 아래 제곱 오차합 비용 함수 식을 J(\boldsymbol{w})=\sum_i \dfrac{1}{2}\left(\phi(z^{(i)})-y^{(i)}\right)^2에서 J(\boldsymbol{w})=\dfrac{1}{2}\sum_i \left(y^{(i)}-\phi(z^{(i)})\right)^2로 수정합니다.
  7. (p64) 주석 10번에서 https://github.com/gilbutITbook/080223/tree/master/code/ch02https://github.com/gilbutITbook/080223/tree/master/ch02로 정정하고, https://github.com/rickiepark/python-machine-learning-book-3rd-edition/tree/master/code/ch02https://github.com/rickiepark/python-machine-learning-book-3rd-edition/tree/master/ch02로 정정합니다.
  8. (p568) 첫 번째 문단 아래 코드에서 tf.keras.activation.tanh(z)tf.keras.activation.relu(z)로 정정합니다.(지*현 님)
  9. (p167) Note의 첫 번째 코드 블럭의 4번째 줄 X_test_robust = rbs.fit_transform(X_test)X_test_robust = rbs.transform(X_test)로 정정합니다. 세 번째 코드 블럭 4번째 줄 X_test_maxabs = mas.fit_transform(X_test)X_test_maxabs = mas.transform(X_test)로 정정합니다.
  10. (p168) 마지막 코드 블럭 바로 윗줄에서 ‘열을 하나 더 추가하고’를 ‘행을 하나 더 추가하고’로 정정합니다.
  11. (p169) 위에서 2번째 줄에서 print(ex_2f)print(l2_norm)로 정정합니다.
  12. (p154) 페이지 맨 위 “판다스를 사용한 범주형 데이터 인코딩”을 “4.2.1 판다스를 사용한 범주형 데이터 인코딩”로 정정합니다. 페이지 중간에 “4.2.1 순서가 있는 특성 매핑”을 “4.2.2 순서가 있는 특성 매핑”으로 정정합니다. (p155) 페이지 중간에 “4.2.2 클래스 레이블 인코딩”을 “4.2.3 클래스 레이블 인코딩”으로 정정합니다. (p157) 페이지 맨 위 “4.2.3 순서가 없는 특성에 원-핫 인코딩 적용”을 “4.2.4 순서가 없는 특성에 원-핫 인코딩 적용”으로 정정합니다.
  13. (p179) 2번째 문단 첫 번째 줄에서 itertools.combinationitertools.combinations로 정정합니다.
  14. (p191) 2번째 문단 첫 번째 줄에서 “데이터에 있는 특성을 잡아낼 수 있습니다”를 “데이터에 있는 어떤 패턴을 찾을 수 있습니다”로 수정합니다.
  15. (p195) 4번 주석의 첫 번째 문장 “13개 고윳값의 합은 1입니다”를 삭제합니다.
  16. (p526) 노트 중간 코드 블럭에서 >>>import tensorflow.experimental.numpy as tnp 라인 아래 >>>tnp.experimental_enable_numpy_behavior() 를 추가합니다.
  17. (p214, 215) <그림 5-9>의 앞뒤 문장을 다음처럼 변경합니다. “결과 그래프를 보면 클래스 2의 샘플 하나가 로지스틱 회귀 모델의 결정 경계에 가까이 놓여 있습니다.
    <그림 5-9>
    규제 강도를 낮추어 로지스틱 회귀 모델이 훈련 데이터셋의 모든 샘플을 더 확실하게 분류하도록 결정 경계를 옮길 수 있습니다.”
  18. (p637) 주석 13번의 마지막 줄에서 https://keras-ko.krhttps://keras.io로 수정합니다.
  19. (p157) 넘파이 1.20버전부터 np.int가 deprecated 되었기 때문에 아래에서 7번째 줄에 OrdinalEncoder(dtype=np.int)OrdinalEncoder(dtype=int)로 수정합니다. (p158) 위에서 12번째 줄에 “np.int로 지정했습니다”를 “int로 지정했습니다”로 수정합니다. (p159) 위에서 14번째 줄에 OrdinalEncoder()OrdinalEncoder(dtype=int)로 수정합니다.
  20. (p236) 아래에서 5번째 줄 끝에 다음 주석을 추가합니다. “구현되어 있습니다.<주석>역주 사이킷런 1.2 버전에서 TSNE 클래스의 init 매개변수의 기본값이 'random'에서 'pca'로 바뀔 예정입니다.”
  21. (p271) 사이킷런 1.0 버전에서 plot_confusion_matrix()가 deprecated 되었고 1.2 버전에서는 삭제될 예정입니다. 위에서 4번째 줄에서 from sklearn.metrics import plot_confusion_matrixfrom sklearn.metrics import ConfusionMatrixDisplay로 수정합니다. 위에서 5번째 줄과 아래에서 4번째 줄에서 plot_confusion_matrix(pipe_svc, ...)ConfusionMatrixDisplay.from_estimator(pipe_svc, ...)로 수정합니다.
  22. (p278) 사이킷런 1.0 버전에서 plot_roc_curve()가 deprecated 되었고 1.2 버전에서는 삭제될 예정입니다. 위에서 6번째 줄에서 from sklearn.metrics import plot_roc_curvefrom sklearn.metrics import RocCurveDisplay로 수정합니다. 위에서 12번째 줄에서 plot_roc_curve(pipe_lr, ...)RocCurveDisplay.from_estimator(pipe_lr, ...)로 수정합니다.
  23. (p279) 사이킷런 1.0 버전에서 plot_precision_recall_curve()가 deprecated 되었고 1.2 버전에서는 삭제될 예정입니다. 위에서 5번째 줄에서 from sklearn.metrics import plot_precision_recall_curvefrom sklearn.metrics import PrecisionRecallDisplay로 수정합니다. 위에서 11번째 줄에서 plot_precision_recall_curve(pipe_lr, ...)PrecisionRecallDisplay.from_estimator(pipe_lr, ...)로 수정합니다.
  24. (p328) 사이킷런 1.0에서 히스토그램 기반 부스팅이 experimental 모듈 아래에서 벗어났습니다. 따라서 위에서 7번째 줄에서 시작하는 문장부터 9번째 줄까지 다음 내용을 삭제합니다. “이 클래스는 아직 실험적이기 때문에 사용하기 전에 먼저 활성화해야 합니다.
    from sklearn.experimental import enable_hist_gradient_boosting
  25. (p329) XGBoost 1.3.0에서 이진 분류 기본 평가 지표가 'error'에서 'logloss'로 변경되었습니다. 또한 향후 레이블 인코딩을 수행하지 않는다는 경고가 발생합니다. 경고를 없애기 위해 위에서 6번째 줄에 XGBClassifier(tree_method='hist', random_state=1)XGBClassifier(tree_method='hist', eval_metric='logloss', use_label_encoding=False, random_state=1)로 수정합니다.
  26. (p415) 아래에서 6번째 줄에 price_std 배열을 2차원으로 바꾸기 위해 inverse_transform(price_std)inverse_transform(price_std.reshape(-1,1))로 수정합니다.
  27. (p419) 사이킷런 1.0에서 'absolute_loss'가 deprecated 되었고 1.2 버전에서 삭제될 예정이기 때문에 대신 'absolute_error'를 사용합니다. 아래에서 4번째 줄에 loss='absolute_loss'loss='absolute_error'로 수정합니다.
  28. (p428) 사이킷런 1.0에서 get_feature_names() 메서드를 가진 변환기에 get_feature_names_out() 메서드가 추가되었고 get_feature_names()는 deprecated 되어 1.2 버전에서 삭제될 예정입니다. 주석의 끝에서 2번째 줄에 get_feature_names()get_feature_names_out()으로 수정합니다.
  29. (p436) 사이킷런 1.0에서 'mse'가 deprecated 되었고 1.2 버전에서 삭제될 예정이기 때문에 대신 'squared_error'를 사용합니다. 위에서 11번째 줄에 criterion='mse'criterion='squared_error'로 수정합니다.
  30. (p308) 아래에서 두 번째 줄에서 ‘여기서 볼 수 있듯이 규제 강도가 가장 낮을 때(C=0.001)’을 ‘여기서 볼 수 있듯이 규제 매개변수가 가장 낮을 때(C=0.001)’로 수정합니다.(이*민 님)
  31. (p265) 위에서 18번째 줄에 “기본값은 'exhaust'입니다”를 “기본값은 'smallest'입니다”로 정정합니다.
  32. (p327) 사이킷런 1.0 변경 사항에 맞춰 위에서 7번째 줄에 있는 ‘mse’, ‘mae’를 ‘squared_error’, ‘absolute_error’로 바꿉니다. 8번째 줄에 있는 ‘mse’를 ‘squared_error’로 바꿉니다. 9번째 줄에서 ‘(기본값)를 사용합니다’를 ‘(기본값) 등을 사용합니다’로 바꿉니다. 10번째 줄에서 ‘사이킷런 0.26 버전에서’를 ‘사이킷런 1.1 버전에서’로 바꿉니다.
  33. (p111) 위에서 5번째 줄에 ‘정규할 수 있습니다’를 ‘정규화할 수 있습니다’로 정정합니다.(최*혁 님)
  34. (p211) 위에서 1번째 줄에 ‘클래스 산포행렬’을 ‘클래스 간의 산포행렬’로 정정합니다.(최*혁 님)
  35. (p154) 위에서 6번째, 8번째, 12번째, 14번째 줄의 class1을 class2로 바꿉니다. 같은 페이지 위에서 7번째, 13번째 줄의 class2를 class1으로 바꿉니다. (p155) 위에서 4번째, 6번째 줄의 class1을 class2로 바꿉니다. 같은 페이지 위에서 5번째 줄의 class2를 class1으로 바꿉니다.
  36. (p115) 사이킷런 1.3버전부터 SGDClassifierloss 매개변수 중 로지스틱 손실을 의미하는 'log''log_loss'로 바뀔 예정이므로 주석 24번 끝에 다음 문장을 추가합니다. “사이킷런 1.3버전에서 loss 매개변수 중 'log''log_loss'로 바뀔 예정입니다.
    (만약 사이킷런 1.3버전을 사용한다면 p115 위에서 6번째 줄, p350 아래에서 2번째 줄, p355 아래에서 2번째 줄, p356 위에서 2번째 줄의 'log''log_loss'로 바꾸어 사용하세요)
  37. (p135) RandomForestClassifier의 max_features 매개변수 기본값이 'auto'에서 'sqrt'로 바뀔 예정이므로 주석 31번의 첫 번째 문장 끝에 다음을 추가합니다. “(사이킷런 1.3버전에서 기본값이 'auto'에서 'sqrt'로 바뀝니다)
  38. (p327) GradientBoostingClassifier의 loss 매개변수 기본값이 1.3 버전에서 'deviance'에서 'log_loss'로 바뀔 예정이므로 그림 7-12 아래 4번째 줄에서 “로지스틱 회귀를 의미하는 'deviance',”를 “로지스틱 회귀를 의미하는 'deviance'(사이킷런 1.3버전에서 'deviance''log_loss'로 바뀝니다),”로 바꿉니다.
  39. (p624) 그림 15-2 아래 공식에서 \boldsymbol{x}^p[i+m-k]\boldsymbol{x}^p[i+(m-1)-k] 로 수정합니다.(이*엽 님)
  40. (p128) 위에서 2번째 줄, 5번째 줄, 10번째 줄에서 treetree_model로 정정합니다. (p131) 중앙의 코드 블록에서 3번째 줄에 treetree_model로 정정합니다.(l***i 님)
  41. (p564) 위에서부터 두 번째 수식에서 가장 오른쪽 식의 분자에 있는 두 번째 항 e^{z_j}\dfrac{\partial}{\partial z_k}(\sum_{j=1}^M e^{z_j})e^{z_i}\dfrac{\partial}{\partial z_k}(\sum_{j=1}^M e^{z_j})로 정정합니다.
  42. (p102) 위에서 4번째 줄에 X_train[(y_train == 0) | (y_train == 1)]X_train_std[(y_train == 0) | (y_train == 1)]로 수정합니다.(김* 님)
  43. (p606) auto-mpg.data를 다운로드할 때 get_file() 함수에서 진행 막대를 출력하지 못해 오류를 발생시키는 버그가 있습니다. 이를 피하기 위해 아래 코드를
    >>> dataset_path = tf.keras.utils.get_file(
    ... "auto-mpg.data"
    ... "http://archive.ics.uci.edu/ml/machine-learning"
    ... "-database/auto-mpg/auto-mpg.data"))

    다음과 같이 수정해 주세요.
    >>> dataset_path = tf.keras.utils.get_file(
    ... origin="https://archive.ics.uci.edu/static/public/9/auto+mpg.zip",
    ... extract=True)
    >>> dataset_path = dataset_path.replace("auto+mpg.zip", "auto-mpg.data")
  44. (p159) 위에서 14번째 줄에 OrdinalEncoderOneHotEncoder로 수정합니다.
  45. (p780) “가치 함수” 절의 공식에서 \gamma^{k+1}\gamma^{k}로 정정합니다.(조*우 님)
  46. (p273) 첫 줄에서 “정확도(PRE)”를 “정밀도(PRE)”로 수정합니다.
  47. (p308) 페이지 중간 부분의 코드 블록에서 socres.std() / 2scores.std() 로 수정합니다.
  48. (p417) 노트에 있는 코드 중 >>> w = np.zeros(X.shape[1])가 불필요하므로 삭제합니다.(김* 님)
  49. (p115) 24번 역주의 첫 번째 줄에서 “max_iter(에포크 횟수, 기본값 5)”를 “max_iter(에포크 횟수, 기본값 1000)”로 수정합니다.
  50. (p133) 역주 노트에서 min_impurity_split 항목을 삭제하고 대신 다음을 추가합니다. “min_weight_fraction_leaf: 리프 노드가 되기 위한 모든 입력 샘플의 가중치 합에 대한 최소 비율을 지정합니다. 기본값은 0입니다. 만약 fit() 메서드에서 sample_weight 매개변수를 지정하지 않으면 모든 샘플의 가중치는 같습니다.”
  51. (p146) 3번 역주의 두 번째 줄에서 “주어진 데이터프레임 자체를 바꿉니다”를 “df 변수에 다시 매핑합니다”로 수정합니다.
  52. (p259) 9번 역주의 끝에 다음을 추가합니다. “사이킷런 1.3버전에서 LearningCurveDisplay 클래스와 비슷한 ValidationCurveDisplay 클래스가 추가되었습니다. 자세한 내용은 사이킷런 온라인 문서(https://bit.ly/3PPjW7w)를 참고하세요.”
  53. (p271) 역주 노트 1번째 줄에서 “사이킷런 0.22 버전에서 추가된 plot_confusion_matrix() 함수를“을 “ConfusionMatrixDisplay 클래스를“로 수정합니다. 2번째 줄에서 “첫 번째 매개변수로”를 “from_estimator 메서드의 첫 번째 매개변수로”로 수정합니다. 그림 6-11의 제목에서 “plot_confusion_matrix() 함수로“를 “ConfusionMatrixDisplay 클래스로“로 수정합니다. 그림 6-11 아래 첫 번째 문장에서 “plot_confusion_matrix() 함수는“를 “ConfusionMatrixDisplay 클래스는“로 수정합니다.
  54. (p278) 역주 노트 1번째 줄에서 “사이킷런 0.22 버전에서 plot_roc_curve() 함수와 plot_precision_recall_curve() 함수“를 “RocCurveDisplay 클래스와 PrecisionRecallDisplay 클래스“로 수정합니다. 3번째 줄에서 “plot_roc_curve() 함수에 모델과 테스트 데이터를 전달하면 RocCurveDisplay 객체를 반환합니다. 이 객체에는“을 “RocCurveDisplay 객체에는“으로 수정합니다.
  55. (p279) 그림 6-14의 제목에서 “plot_roc_curve() 함수로“를 “RocCurveDisplay 클래스로“로 수정합니다. 그림 6-14 아래 1번째 줄에서 “plot_roc_curve() 함수를 plot_precision_recall_curve()“를 “RocCurveDisplay 클래스를 PrecisionRecallDisplay 클래스로“로 수정합니다.
  56. (p280) 그림 6-15의 제목에서 “plot_precision_recall_curve() 함수로“를 “PrecisionRecallDisplay 클래스로“로 수정합니다.
  57. (p314) 위에서 8번째 줄, 15번 역주의 1번째 줄 (p317) 위에서 4번째 줄, 7번째 줄, (p323) 4번째 줄, 10번째 줄, 22번 역주의 1번째 줄, 2번째 줄에서 base_estimatorestimator로 수정합니다.
  58. (p612) 페이지 아래쪽 노트 바로 위의 문장 끝에 주석을 추가합니다. “<역주> BoostedTreesRegressor 클래스를 사용하려면 텐서플로 2.8.x 버전을 사용해야 합니다.”
  59. (p105) 아래에서 6번째 줄에 “당연하지만 열을 모두 더하면”을 “당연하지만 각 행의 열을 모두 더하면”으로 수정합니다.(김*식 님)
  60. (p271) 위에서 5 번째 줄에 X_textX_test로, y_texty_test로 수정합니다. 그림 6-12 위 3번째 줄에 X_textX_test로 수정합니다.(김*식 님)

Your Inputs

머신 러닝 교과서 3판”에 대한 4개의 생각

  1. 김신

    P102에서
    X_train을 사용하는데
    label이 petal length [standardized]가 맞나요?
    X_train_std를 사용해야 하는것이 아닌지 합니다.

    좋아요

    응답

댓글 남기기

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