머신 러닝 교과서

x9791160507966

♥♥♥♥ 아마존 베스트셀러 라는 명성이 왜 생겼는지 알 수 있는 좋은 책임(mo**buggy 님)
★★★★★ 진정한 머신러닝 교과서! 그리고 파이썬-(coolcat 님)
★★★★★ 마치 한국어판이 원서인 것처럼 군더더기 없이 완벽한 번역서(yeonwo*** 님)

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

이 책은 넘파이를 사용하여 밑바닥부터 알고리즘을 만들어 봅니다. 또한 사이킷런 최신 버전(0.20)에서 변경된 내용을 포함하고 있습니다. 특히 딥러닝 파트는 텐서플로의 최신 버전(2.0.0a)의 변경사항과 특징을 설명할 수 있도록 바꾸었습니다. 640 페이지가 넘는 두꺼운 책을 풀 컬러 인쇄로 제작해주신 길벗 출판사에게 감사드립니다. 많은 수식과 부족한 번역 때문에 고생하신 교정자와 디자이너 분에게 정말 감사드립니다.

  • 온라인/오프라인 서점에서 판매중입니다. [Yes24], [교보문고]
  • 644페이지, 컬러: 33,000원 –> 29,700원, 전자책 26,400원
  • 이 책에 실린 코드는 깃허브에 있습니다.
  • 이 책의 번역 후기를 여기에서 보실 수 있습니다.
  • 이 책의 코드는 scikit-learn 0.20, 0.21.1, 0.22, 0.23 버전, 텐서플로 2.0.0a, 2.0.0b, 2.0.0, 2.1.0, 2.2.0, 2.3.0에서 테스트 되었습니다.

이 페이지에서 책의 에러타와 scikit-learn, TensorFlow의 버전 변경에 따른 바뀐 점들을 계속 업데이트 하겠습니다.

이 책에 대해 궁금한 점이나 오류가 있으면 이 페이지 맨 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹스 머신러닝/딥러닝 도서 Q&A에 글을 올려 주셔도 좋습니다.

감사합니다! 🙂


Outputs (aka. errata)

  • 1~20: 2쇄에 반영되었습니다.
  • ~33: 3쇄에 반영되었습니다.
  • ~34: 4쇄에 반영되었습니다.
  • ~42: 5쇄에 반영되었습니다.
  • ~61: 6쇄에 반영되었습니다.
  1. (p8) 마지막 문단에서 “정오표는 블로그(https://bit.ly/2Hn88ZM)에 등록해 놓겠습니다”를 “정오표는 블로그(https://bit.ly/ml-textbook)에 등록해 놓겠습니다”로 수정합니다.
  2. (p9) 마지막 문단의 첫 문장에서 “‘machine learning’을 검색하면 180만 건이라는”을 “‘machine learning’을 검색하면 440만 건이라는”으로 수정합니다.
  3. (p12) 두 번째 문단에서 “14장은 계산 그래프와 세션의 핵심 개념을”을 “14장은 계산 그래프와 텐서의 핵심 개념을”으로 수정합니다.
  4. (p57) 7번 주석에서 “η(y(1)Ф(0) x(1))=η(y(1)-1)x(1)과 같습니다”를 “η(y(1)Ф(0))x(1))=η(y(1)-1)x(1)과 같습니다”로 정정합니다.(최*진 님)
  5. (p201) 페이지 중간에서 “변수 \gamma=\frac{1}{2\sigma}을 도입하여”를 “변수 \gamma=\frac{1}{2\sigma^2}을 도입하여”로 정정합니다.(정*현 님)
  6. (p220) 첫 문장에서 “악성(benign) 종양은 클래스 1로 표현되고 양성(malignant) 종양은 클래스 0으로”를 “악성(malignant) 종양은 클래스 1로 표현되고 양성(benign) 종양은 클래스 0으로”로 정정합니다.(정*현 님)
  7. (p230) 첫 문장에서 “왼쪽 위 그래프는 분산이 높은”을 “왼쪽 위 그래프는 편향이 높은”으로 정정합니다.(정*현 님)
  8. (p241) 위에서 세 번째 줄에서 “악성 종양인 하나의 샘플을 양성 종양(FP)으로”를 “양성 종양인 하나의 샘플을 악성 종양(FP)으로”로 정정합니다.(정*현 님)
  9. (p247) 아래에서 다섯 번째 줄에서 “212개의 양성 종양(클래스 1)과 357개의 음성 종양(클래스 0)”을 “212개의 악성 종양(클래스 1)과 357개의 양성 종양(클래스 0)”으로 정정합니다. 마지막 문단에서 “357개의 음성 종양 샘플 전체와 40개의 양성 종양 샘플을 … 무조건 다수 클래스(음성 종양의 클래스 0)를 예측하는”을 “357개의 양성 종양 샘플 전체와 40개의 악성 종양 샘플을 … 무조건 다수 클래스(양성 종양의 클래스 0)를 예측하는”로 정정합니다.(정*현 님)
  10. (p364) 두 번째 문단에서 “이 알고리즘은 정상치(inliner)라는 일부 데이터로”를 “이 알고리즘은 정상치(inlier)라는 일부 데이터로”로 정정합니다.(정*현 님)
  11. (p420) 페이지 중간 수식에서 \Delta \bold{w}=-\eta \nabla (\bold{w}) 를 \Delta \bold{w}=-\eta \nabla J(\bold{w}) 로 정정합니다.(정*현 님)
  12. (p422) 아래에서 세 번째 줄에 “a_i^{(b)}는 은닉층의 i번째 유닛이고”를 “a_i^{(h)}는 은닉층의 i번째 유닛이고”로 정정합니다.(정*현 님)
  13. (p423) 위세서 세 번째 줄에 “가중치 행렬을 \bold{W}^{(b)} 로 표시할 수 있습니다”를 “가중치 행렬을 \bold{W}^{(h)} 로 표시할 수 있습니다”로 정정합니다.(정*현 님)
  14. (p426) 페이지 중간에서 수식 A^{(h)}=\phi(Z^{(h)}) 의 A와 Z를 \bold{A}^{(h)}=\phi(\bold{Z}^{(h)}) 와 같이 굵은 글씨체로 바꿉니다.(정*현 님)
  15. (p445) 역주 17번에서 “NeuralNetMCP”를 “NeuralNetMLP”로 정정합니다.(정*현 님)
  16. (p481) 페이지 중간의 수식에서 분모 \sum_{i=1}^{M} e^{z_j}\sum_{j=1}^{M} e^{z_j} 로 정정합니다.(정*현 님)
  17. (p503) 페이지 마지막 줄의 출력 결과에서 “<tf.Variable 'w:0' shape=(2, 4) dtype=int64>“를 “<tf.Variable 'w1:0' shape=(2, 4) dtype=int64>“로 정정합니다.(정*현 님)
  18. (p506) 페이지 맨 처음 출력 결과 “[[4 5 6 7] [8 9 10 11]]“을 “[[2 3 4 5] [6 7 8 9]]로 정정합니다.(정*현 님)
  19. (p422) 노트 아래 첫 번째 문장에서 “활성화 출력을 a_i^{(r)} 이라고 하겠습니다”를 “활성화 출력을 a_i^{(l)} 이라고 하겠습니다”로 정정합니다.
  20. (p97) 페이지 아래쪽 코드 블럭 중간에서 lrgd.fit(X_train_01_subset, y_train_01_subset)Thelrgd.fit(X_train_01_subset, y_train_01_subset)로 정정합니다.(최*진 님)
  21. (p319) 페이지 중간의 코드 label = {0:'양성', 1:'음성'}label = {0:'음성', 1:'양성'}으로 정정합니다.(최*진 님)
  22. (p361) 페이지 중간의 코드 num_rooms_std = sc_x.transform([5.0])num_rooms_std = sc_x.transform([[5.0]])로 정정합니다.(최*진 님)
  23. (p49) 마지막 문장에서 z = w_1 + x_1 + \cdots + w_m x_mz = w_1 x_1 + \cdots + w_m x_m 로 정정합니다.(정*훈 님)
  24. (p581) 페이지 하단 노트에서 from collection import Counter 를 from collections import Counter 로 정정합니다.(정*복 님)
  25. (p86) 사이킷런 0.21 버전에서 수정된 SGD 알고리즘의 버그(#9043)로 인해 바뀐 출력 결과를 반영합니다. 첫 번째 코드 블록의 출력 결과 “잘못 분류된 샘플 개수: 14“를 “잘못 분류된 샘플 개수: 1“로 수정합니다. 그 다음 문장에서 “14개를 잘못 분류합니다”를 “1개를 잘못 분류합니다”로 수정하고 “약 0.31 또는 31%입니다(14/45 ≈ 0.067)”을 “약 0.022 또는 2.2%입니다(1/45 ≈ 0.022)”로 수정합니다. 그다음 노트에서 “0.69 또는 69%“를 “0.98 또는 98%“로 수정합니다. 두 번째와 세 번째 코드 블럭의 출력에서 “정확도: 0.69“를 “정확도: 0.98“로 수정합니다. 그림 3-1을 다음 그림으로 바꿉니다. (류*윤 님)
    3-1
  26. (p52) 두 번째 식 아래 첫 번째 문장에서 “일반적으로 0.0에서 1.0 사이 정수입니다”를 “일반적으로 0.0에서 1.0 사이 실수입니다”로 정정합니다.(C 님)
  27. (p45) 위에서 세 번째 항목에 “TensorFlow 2.0.0-alpha0“을 “TensorFlow 2.0.0“으로 바꿉니다.
  28. (p461) 주석 6번에서 “2.0 알파 버전은”을 “2.0 버전은”로 “2.0.0-alpha0“을 “2.0.0“으로 바꿉니다.
  29. (p458) 페이지 중간 Note에서 “2019년 초에 텐서플로 2.0 알파 버전이”를 “2019년 10월에 텐서플로 2.0 버전이”로, “13장부터 텐서플로 2.0 알파 버전을”를 “13장부터 텐서플로 2.0 버전을”로, “텐서플로 2.0 알파 버전 이후에도”를 “텐서플로 2.0 버전 이후에도”로 바꿉니다.
  30. (p462) 두 번째 문단에서 “텐서플로 버전은 2.0.0-alpha0입니다”를 “텐서플로 버전은 2.0.0입니다”로 바꿉니다.
  31. (p620) A.2 아래 두 번째 문단에서 “텐서플로 2.0 알파 버전을”를 “텐서플로 2.0 버전을”로 바꿉니다. 그 아래 설치 명령에서 “2.0.0-alpha0“를 “2.0.0“으로 바꿉니다.
  32. (p621) 첫 번째 코드의 실행 결과 “2.0.0-alpha0“를 “2.0.0“으로 바꿉니다.
  33. (p627) 페이지 중간에서 “텐서플로 2.0.0-alpha0 버전을”을 “텐서플로 2.0.0 버전을”로, “1.13.1 버전입니다”를 “1.15.0 버전입니다”로, “2.0.0-alpha0 버전을 설치해 주세요”를 “2.0.0 버전을 설치해 주세요”로 바꿉니다.
  34. (p348) 마지막 문단에서 “단변량 선형 회귀(univariate linear regression)”을 “단순 선형 회귀(simple linear regression)”으로, “다변량 선형 회귀(multivariate linear regression)”을 “다중 선형 회귀(multiple linear regression)”으로 정정합니다.
    (p349) “10.1.1 단변량 선형 회귀”를 “10.1.1 단순 선형 회귀”로 정정합니다. 첫 번째 줄에서 “단변량 선형 회귀”를 “단순 선형 회귀”로 정정합니다.
    (p350) “10.1.2 다변량 선형 회귀”를 “10.1.2 다중 선형 회귀”로 정정합니다. 첫 번째 줄에서 “단변량 선형 회귀”를 “단순 선형 회귀”로 정정합니다. 세 번째 줄에서 “다변량 선형 회귀”를 “다중 선형 회귀”로 정정합니다.
    (p372) 네 번째 줄에서 “다변량 선형 회귀”를 “다중 선형 회귀”로 정정합니다.
    (p639) “다변량 선형 회귀”를 “다중 선형 회귀”로, “단변량 선형 회귀”를 “단순 선형 회귀”로 정정합니다.(이*오 님)
  35. (p110) 3.5.1절 첫 문장에서 logical_orlogical_xor로 정정합니다.(이*석 님)
  36. (p50) Note에 있는 첫 번째 공식에 있는 \sum_{j=0}^m x_j w_j에서 xw를 볼드체로 쓰지 않습니다.(gr***an 님)
  37. (p67) Note에 있는 수식 3번째 줄에서 두 번째 시그마(\sum) 기호를 삭제합니다.(Y**Cha 님)
  38. (p88) 맷플롯립 향후 버전에서 한글자 컬러 표현(rgb)이 삭제될 예정입니다. 위에서 4번째 줄 코드에서 c=''facecolors='none'으로 바꿉니다.
  39. (p203) scipy.exp 함수는 싸이파이 2.0.0에서 삭제될 예정입니다. 5.3.2절 2번째 줄 코드 from scipy import expfrom numpy import exp로 바꿉니다. 동일하게 (p211) 2번째 줄 코드 from scipy import expfrom numpy import exp로 바꿉니다.
  40. (p226) StratifiedKFold 클래스에서 shuffle=False 기본값에서 random_state를 지정하면 경고가 발생합니다. 0.24버전부터는 에러가 발생됩니다. 위에서 3번째 줄 코드에 shuffle=True 매개변수를 추가합니다. 동일하게 (p244) 위에서 5번째 줄 코드에 shuffle=True 매개변수를 추가합니다.
  41. (p243) scipy.interp 함수는 싸이파이 2.0.0에서 삭제될 예정입니다. 아래에서 4번째 줄 코드에서 from scipy import interpfrom numpy import interp로 바꿉니다.
  42. (p259) 사이킷런 0.23버전에서 sklearn.externals가 삭제되었습니다. 위에서 15번째 줄 코드에서 from sklearn.externals import siximport six로 바꿉니다.
  43. (p183) 그림 5-4 바로 아래 문장에서 “PCA 구현을 비교하면 두 그래프는 거울에 비친 것처럼 뒤집혀 있습니다”를 “PCA 구현을 비교했을 때 두 그래프가 거울에 비친 것처럼 뒤집힌 경우가 있습니다”로 수정합니다.(김*훈 님)
  44. (p188~p189) 188페이지 첫 번째 식과 마지막 식, 189페이지 첫 번째 식에서 \sum 기호 위에 적인 c 를 삭제합니다.(김*훈 님)
  45. (p202) Note 맨 아래에서 5번째 수식에서 -\frac{1}{n}\sum^{n}_{s=1} \phi(x^{(s)})^T \phi(x^{(j)})-\frac{1}{n}\sum^{n}_{s=1} \phi(x^{(s)}) \phi(x^{(i)})^T로 정정합니다.(김*훈 님)
  46. (p254) 첫 번째 수식에서 \sum_i C_j (x) \ge 0\sum_j C_j (x) \ge 0로 정정합니다.(김*훈 님)
  47. (p338~p339) 338페이지 아래에서 18번째 줄과 7번째 줄, 그리고 339페이지 아래에서 4번째 줄에서 “<div id=’button’>”을 “<div class=’button’>”으로 정정합니다.(김*훈 님)
  48. (p364) 위에서 1번째 줄에서 “선형 회귀 모델은 이상치(outliner)에”를 “선형 회귀 모델은 이상치(outlier)에”로 정정합니다.(김*훈 님)
  49. (p365) 위에서 2번째 줄에서 “loss 매개변수의 매개변수로“를  “loss 매개변수의 값으로“로 정정합니다.(김*훈 님)
  50. (p371) 주석 15번에서 “\lambda_1=\text{alpha} \times \text{l1\_ratio}이고 \lambda_2=\text{alpha} \times (1-\text{l1\_ratio})/2입니다”를 “\lambda_1=\text{alpha} \times (1-\text{l1\_ratio})/2이고 \lambda_2=\text{alpha} \times \text{l1\_ratio}입니다”로 정정합니다.(김*훈 님)
  51. (p392) 5번 항목에서 “단계 2와 3을 반복합니다”를 “단계 3과 4를 반복합니다”로 정정합니다.(김*훈 님)
  52. (p516) 위에서 9번째 줄에서 “500/500″을 “170/500″으로 정정하고, 10번째 줄에서 “loss: 0.7881 – val_loss: 0.8229“를 “loss: 0.9212 – val_loss: 0.7768“로 정정합니다.(김*훈 님)
  53. (p532) 그림 15-4의 가장 오른쪽 밸리드 패딩으로 만든 출력 크기는 2×2가 아니라 3×3입니다.(김*훈 님)
  54. (p125) 그림 3-23 위 마지막 문장 끝에 다음 역주를 추가합니다. “역주 사이킷런 0.21 버전에서 추가된 plot_tree() 함수를 사용하면 dot 파일을 만들지 않고 그림 3-23과 비슷한 트리를 바로 그릴 수 있습 니다. 이 함수는 export_graphviz() 함수에서 사용한 class_names, feature_names, impurity, filled 매개변수를 모두 지원합니다.”
  55. (p140) 노트 마지막 문장에 끝에 다음 문장을 추가합니다. “0.22 버전에서는 최근접 이웃 방식으로 대체하는 KNNImputer 클래스가 추가되었습니다.”
  56. (p221) 역주  2번 끝에 다음 문단을 추가합니다. “사이킷런 0.23버전에서 추정기 객체를 주피터 노 트북에서 시각화해주는 기능이 추가되었습니다. 특히 파이프라인 구조를 시각적으로 잘 요약해주며 다음과 같이 사용합니다.
    >>> from sklearn import set_config 
    >>> set_config(display='diagram') 
    >>> pipe
  57. (p240) 두 번째 코드 블럭 위 문장의 끝에 다음 주석을 추가합니다. “역주 사이킷런 0.22 버전에서 오차 행렬을 그려주는 plot_confusion_matrix() 함수가 추가되었습니다.”
  58. (p245) 마지막 문장 끝에 다음 주석을 추가합니다. “사이킷런 0.22 버전에서 ROC 곡선을 그려주는 plot_roc_curve() 함수와 정밀도-재현율 곡선을 그려주는 plot_precision_recall_curve() 함수가 추가되었습니다.”
  59. (p287) 노트 끝에 다음 문단을 추가합니다. “사이킷런 0.21 버전에서 히스토그램 기반 부스팅 알고리즘인 HistGradientBoostingClassifier가 추가되었습니다. 이 클래스는 아직 실험적이기 때문에 사용하기 전에 먼저 활성화해야 합니다.
    >>> from sklearn.experimental import enable_hist_gradient_boosting 
    >>> from sklearn.ensemble import HistGradientBoostingClassifier
  60. (p620) pip 명령 위 문장 끝에 다음 주석을 추가합니다. “역주 최신 버전의 텐서플로를 설치하려면 ‘==2.0.0’을 삭제하고 설치하세요.”
  61. (p627) 그림 A-23 위 문장 끝에 다음 주석을 추가합니다. “역주 현재는 코랩에 텐서플로 최신 버전이 설치되어 있으므로 이 과정이 필요없습니다.”
  62. (p53) 위에서 7번째 줄에 x_j^{(i)} \times w_j^{(i)}x_j^{(i)} \times w_j로 정정합니다.
  63. (5쇄) (p67) 노트에 있는 식의 4번째 줄에서 \sum_k (w_j^{(i)} x_j^{(i)})\sum_k (w_k x_k^{(i)})로 정정합니다.
  64. (p103) 두 번째 수식에서 \frac{\lambda}{2} ||w||에 있는 w를 볼드체로 정정합니다.
  65. (p105) 12번 주석에서 “w_2 축과 만나는 절편을”을 “x_2 축과 만나는 절편을”로 정정합니다.
  66. (p481) 13.3.2절 아래 3번째 줄에서 “다중 로지스틱 회귀”를 “다항 로지스틱 회귀”로 정정합니다.
  67. (p120) 1번째 줄과 9번째 줄에서 0.1\bar{\bar{6}}0.1\bar{6}로 정정합니다.
  68. (p126) 25주석 끝에 “사이킷런 0.22 버전에서 비용 복잡도 기반의 사후 가지치기를 위한 ccp_alpha 매개변수가 추가되었습니다.“를 추가합니다.
  69. (p162) 첫 번째 노트 아래 3번째 줄에서 “최소화할 기준 함수”를 “최대화할 기준 함수”로 정정합니다. 6번째 줄에서 “성능 손실이 최대가 되는”을 “성능 손실이 최소가 되는”으로 정정합니다.
  70. (p196) 사이킷런 0.20 버전에서 LDA에서 고유 벡터를 계산할 때 정규화를 적용하는 버그가 수정되었습니다. 이에 맞추어 아래에서 13번째 줄에 “고유 벡터를 정렬한 후 L2 노름으로 나누어 정규화하여“를 “고유 벡터를 정렬하여“로 수정합니다. 아래에서 8번째 줄의 코드 ei_vec /= np.linalg.norm(ei_vec, axis=0)를 삭제합니다.
  71. (p323, p331) 노트에 있는 플라스크 문서 주소를 http://flask.pocoo.org/docs 에서 https://flask.palletsprojects.com 으로 수정합니다.
  72. (p329) 위에서 두 번째 줄에 진자 문서 주소를 http://jinja.pocoo.org 에서 https://jinja.palletsprojects.com 으로 수정합니다.
  73. (p344, p352, p353) 깃허브 주소 github.com/rasbt 를 github.com/rickiepark 으로, raw.githubusercontent.com/rasbt 를 raw.githubusercontent.com/rickiepark 으로 수정합니다.
  74. (p57) 7번 주석에서 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)} 방향이 바뀔 수 있습니다.”(정*한 님)
  75. (p518) 아래에서 두 번째 줄에 %load_ext tensorboard.notebook%load_ext tensorboard 으로 수정합니다.

Your Inputs

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.