혼자 공부하는 머신러닝+딥러닝

Yes24, 교보문고 평점 평균 10점 만점! 감사합니다!

★★★★★ 박해선님 도서는 항상 기대함. 그러나 항상 기대이상. 이번엔 심지어 재미있음. (a******t 님)
★★★★★ 박해선님이 제대로 된 초보자서를 출간하셨네요. 초보 여러분 믿고 사세요. (c******o 님)
★★★★★ 정말 혼자 공부하기 너무 좋은 머신러닝 독학 책 (pc**831 님)
♥♥♥♥ 혼자 공부하기 좋아요! 설명도 잘되어있어요:) (an**s0603 님)

모두연의 인공지능 혁신학교 아이펠의 공식 교재로 채택되었습니다!

교보문고 AI/ML 분야 2021 올해의 책에 선정되었습니다!

<혼자 공부하는 머신러닝+딥러닝>은 머신러닝, 딥러닝을 입문하려는 전국민을 위한 책입니다! 🙂

수학 때문에 머신러닝, 딥러닝 공부를 차일피일 미루고 있었다면 더 이상 그럴 필요가 없습니다. 이 책으로 누구나 머신러닝과 딥러닝에 입문할 수 있습니다. 수학을 최대한 배제하고 그림과 이야기를 따라 이론을 쉽게 배울 수 있도록 만들었습니다. 많은 삽화를 곁들여서 읽는 내내 지루하지 않게 했고 각 절이 끝날 때마다 간단한 퀴즈로 학습을 돕고 있습니다. 이 책의 모든 코드는 구글 코랩(Colab)엘리스(elice.io) 아카데미에서 실습할 수 있습니다. 별도의 프로그램을 컴퓨터에 설치할 필요가 없고 웹 브라우저만으로 머신러닝과 딥러닝을 배울 수 있습니다!

텐서 ≈ 스터디 페이스북 그룹에 오시면 동영상 강의와 스터디에 대한 정보와 빠르게 받을 수 있습니다. 스타디가 끝난 후 녹화 영상은 한빛미디어 유튜브 채널과 제 개인 유튜브 채널에서 볼 수 있습니다.

이 페이지에서 책의 에러타와 라이브러리 버전 변경에 따른 바뀐 점들을 계속 업데이트 하겠습니다. 이 책에 대해 궁금한 점이나 오류가 있으면 이 페이지 맨 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹스 머신러닝/딥러닝 도서 Q&A에 글을 올려 주셔도 좋습니다. 또 카카오톡 오픈 채팅(참여코드: flow)에 오셔서 문의해 주셔도 좋습니다.

감사합니다! 🙂


Outputs (aka. errata)

  • ~28: 2쇄에 반영되었습니다.
  • ~44: 3쇄에 반영되었습니다.
  • ~67: 4쇄에 반영되었습니다.
  • ~73: 5쇄에 반영되었습니다.
  • ~85: 6쇄에 반영되었습니다.
  • ~90: 7쇄에 반영되었습니다.
  1. (p57) 맨 아래 마지막 문장에서 “특징을 알아보습니다”를 “특징을 알아보습니다”로 수정합니다.
  2. (p121) 맨 위 식에서 “(타깃 – 예측)^2 / (타깃 – 평균)^2″을 “(타깃 – 예측)^2의 합 / (타깃 – 평균)^2의 합“으로 정정합니다. 그 아래 첫 번째 문장에서 “타깃과 예측한 값의 차이를 제곱합니다. 그다음 타깃과 타깃 평균의 차이를 제곱한 값으로 나눕니다”를 “각 샘플의 타깃과 예측한 값의 차이를 제곱하여 더합니다. 그다음 타깃과 타깃 평균의 차이를 제곱하여 더한 값으로 나눕니다”로 정정합니다.(임*경 님)
  3. (p78) 두 번째 손코딩 위에 다음과 같은 노트를 추가합니다. “(노트) 2차원 배열은 행과 열 인덱스를 콤마(,)로 나누어 지정합니다. 슬라이싱 연산자로 처음부터 마지막 원소까지 모두 선택하는 경우 시작과 종료 인덱스를 모두 생략할 수 있습니다.”
  4. (p87) “시작하기 전에” 절 아래 7번째 줄에서 “250g”을 “150g”으로 정정합니다.
  5. (p103) 페이지 아래 쪽 풍선말에서 “테스트 세트의 기준으로 훈련 세트를 변환해야”를 “훈련 세트의 기준으로 테스트 세트를 변환해야”로 정정합니다.(서*교 님)
  6. (p100) 마지막 문단 옆에 풍선말을 추가합니다. “브로드캐스팅은 넘파이 배열 사이에서 일어납니다. train_input, mean, std가 모두 넘파이 배열입니다.”
  7. (p115) 여기서 잠깐 섹션에서 “1980년대 통계학자이자”를 “19세기 통계학자이자”로 정정합니다.(서*교 님)
  8. (p121) 위에서 3번째 문장에서 “타깃예측에 아주 가까워지면 (분모가 0에 가까워지기 때문에)”를 “예측타깃에 아주 가까워지면 (분자가 0에 가까워지기 때문에)”로 정정합니다.(서*교 님)
  9. (p274) 첫 번째 손코딩과 그 아래 첫 번째 문단을 다음 내용으로 교체합니다.(서*교 님)

    히스토그램 기반 그레이디언트 부스팅의 특성 중요도를 계산하기 위해 permutation_importace() 함수를 사용하겠습니다. 이 함수는 특성을 하나씩 랜덤하게 섞어 모델의 성능이 변화하는지 관찰하는 식으로 어떤 특성이 중요한지 계산합니다. 또한 훈련 세트 뿐만 아니라 테스트 세트에도 적용할 수 있고 사이킷런에서 제공하는 추정기 모델에 모두 사용할 수 있습니다.

    먼저 히스토그램 기반 그레이디언트 부스팅 모델을 훈련하고 훈련 세트에서 특성 중요도를 계산해 보겠습니다. n_repeats 매개변수는 랜덤하게 섞을 횟수를 지정합니다. 여기서는 10으로 지정하겠습니다. 기본값은 5입니다.

    from sklearn.inspection import permutation_importance

    hgb.fit(train_input, train_target)
    result = permutation_importance(hgb, train_input, train_target, n_repeats=10, random_state=42, n_jobs=-1)
    print(result.importances_mean)

    [0.08876275 0.23438522 0.08027708]

    permutation_importance() 함수가 반환하는 객체는 반복하여 얻은 특성 중요도(importances), 평균(importances_mean), 표준 편차(importances_std)를 담고 있습니다. 평균을 출력해 보면 랜덤 포레스트와 비슷한 비율임을 알 수 있습니다. 이번에는 테스트 세트에서 특성 중요도를 계산해 보겠습니다.

    result = permutation_importance(hgb, test_input, test_target, n_repeats=10, random_state=42, n_jobs=-1)
    print(result.importances_mean)
    [0.05969231 0.20238462 0.049 ]


    테스트 세트의 결과를 보면 그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있다는 것을 알 수 있습니다. 이런 분석을 통해 모델을 실전에 투입했을 때 어떤 특성에 관심을 둘지 예상할 수 있습니다.
  10. (p182) 페이지 마지막 문장 “ 번째 클래스에 대한 확률은 1/3=0.3333이고 다섯 번째 클래스에 대한 확률은 2/3=0.6667이 됩니다”를 “다섯 번째 클래스에 대한 확률은 1/3=0.3333이고 번째 클래스에 대한 확률은 2/3=0.6667이 됩니다”로 정정합니다.(s*o 님)
  11. (p148) 아래에서 4번째 줄에 “fit_intercept 매개변수를 True로 지정하면 절편을 학습하지 않습니다”를 “fit_intercept 매개변수를 False로 지정하면 절편을 학습하지 않습니다”로 정정합니다.
  12. (p141) 아래쪽 손코딩 중 아래에서 2번째 줄에 plt.scatter([50], [1574], marker='^')plt.scatter(50, 1574, marker='^')로 수정합니다. 실행 결과는 동일하지만 코드를 읽기 쉽도록 바꾸었습니다.(서*교 님)
  13. (p243) <여기서 잠깐> 박스의 첫 번째 줄에 “테스트 세트와 훈련 세트로 떼어 놓습니다”를 “테스트 세트와 검증 세트로 떼어 놓습니다”로 정정합니다.(서*교 님)
  14. (p305) 맨 아래에서 3번째 줄 끝에 “labels_ 길이는 샘플 개수“를 “labels_ 배열의 길이는 샘플 개수와 같습니다. 이 배열은“로 수정합니다.(서*교 님)
  15. (p159) 맨 아래 노트 끝에 다음 문장을 추가합니다. “특성마다 계산하므로 55개의 평균과 표준 편차가 들어 있습니다.
  16. (p355) 맨 아래 2개의 리스트 항목에서 “binary_corssentropy”와 “categorical_corssentropy”를 “binary_crossentropy”와 “categorical_crossentropy”로 정정합니다.(고*진 님)
  17. (p356) 아래쪽 그림에서 오른쪽의 원-핫 인코딩 배열에서 첫 번째 원소를 0에서 1로, 두 번째 원소를 1에서 0으로 수정합니다.(고*진 님)
  18. (p560) 3-1절 1번 문제 답을 (1)번에서 다음과 같이 (2)번으로 정정합니다. “(2) k-최근접 이웃 회귀는 예측할 샘플에서 가장 가까운 k 개의 주변 샘플을 찾고 이 주변 샘플의 타깃값을 평균하여 예측값을 구합니다“(오*경 님)
  19. (p569) 8-1절 확인문제 2번 답에서 두 번째 열의 값이 8, 8, 10이 아니라 8, 12, 14입니다.(고*진 님)
  20. (p471) 맨 아래 코드에서 dense1(hidden)dense2(hidden)으로 수정합니다.(고*진 님)
  21. 코드와 설명을 맞추기 위해 (p472) 위에서 두 번째 줄에 있는 코드에서 Model(inputs, outputs)keras.Model(inputs, outputs)로 바꾸어 주세요. (p473) 두 번째 그림에서 conv_acti = Model(...)conv_acti = keras.Model(...)로 바꾸어 주세요.(고*진 님)
  22. 코드의 일관성을 위해 (p474) 첫 번째 코드에서 keras.models.Model(...)keras.Model(...)로 바꾸어 주세요. 마찬가지로 (p476) 첫 번째 손코딩, (p480) 마지막 줄, (p481) 아래에서 10번째 줄에서 keras.models.Model(...)keras.Model(...)로 바꾸어 주세요.
  23. (p417) 코드 끝에서 3번째 줄에 plt.save('7_3-07', dpi=300)을 삭제합니다.(채*석 님)
  24. (p474) 첫 번째 코드 블록에 <손코딩> 아이콘을 추가해 주세요.
  25. (p137) 아래쪽 손코딩 박스 위 두 번째 문장에서 (50, 15 \times 39 - 709)(50, 50 \times 39 - 709)로 정정합니다.(C*e 님)
  26. (p536) 손코딩 박스의 4번째 줄에서 best-dropout-model.h5를 best-2rnn-model.h5로 정정합니다.(고*진 님)
  27. (p326) 두 번째 손코딩의 plt.plot(pca.explained_variance_ratio_) 아래 plt.show()를 추가합니다. 마찬가지로 (p333) 아래에서 3번째 줄 plt.plot(pca.explained_variance_ratio_) 아래 plt.show()를 추가합니다.(서*교 님)
  28. (p406) 첫 번째 줄에서 “가장 큰 값을 골라”를 “가장 큰 값의 인덱스를 골라”로 수정합니다.(서*교 님)
  29. (p445) 마지막 줄인 “이제 train_scaled의 차원은 (50000, 28, 28)에서 (50000, 28, 28, 1)이 되었습니다”를 “이제 (48000, 28, 28) 크기인 train_input이 (48000, 28, 28, 1) 크기인 train_scaled가 되었습니다”로 정정합니다. 그림에 (두군데) 표시된 50,00048,000으로 바꾸어 주세요. 그림 아래 쓰인 (50000, 28, 28)을 (48000, 28, 28)로 바꾸고 (50000, 28, 28, 1)을 (48000, 28, 28, 1)로 바꾸어 주세요.(서*교 님)
  30. (p472) 첫 번째 문장에서 “그다음 inputs와 output“을 “그다음 inputs와 outputs“로 정정합니다.(서*교 님)
  31. (p501) 마지막 문단 위에서 3번째 줄에 “‘cat’을 13에 매핑하더라도 ‘ca‘이 ‘He’보다”를 “‘cat’을 13에 매핑하더라도 ‘cat‘이 ‘He’보다”로 정정합니다.(서*교 님)
  32. 코드 실행에는 이상이 없지만 표기 일관성을 위해 예제 데이터셋의 경로를 변경합니다. (p221) <여기서 잠깐> 바로 위와 4번째 줄과 첫 번째 손코딩, (p236) 손코딩 4번째 줄, (p243) 첫 번째 손코딩, (p256) 손코딩 4번째 줄, (p267) 첫 번째 손코딩, (1쇄:p277, 2쇄:p278) 손코딩6 번째 줄에서 https://bit.ly/wine-datehttps://bit.ly/wine_csv_data 로 수정합니다.
  33. 코드 실행에는 이상이 없지만 표기 일관성을 위해 예제 데이터셋의 경로를 변경합니다. (p178) 손코딩, (p193) 손코딩 5번째 줄, (p207) 첫 번째 손코딩, (p213) 손코딩 4번째 줄에서 https://bit.ly/fish_csvhttps://bit.ly/fish_csv_data 로 수정합니다.
  34. 코드 실행에는 이상이 없지만 표기 일관성을 위해 예제 데이터셋의 경로를 변경합니다. (p153) 첫 번째 손코딩, (p167) 손코딩 4번째 줄에서 https://bit.ly/perch_csvhttps://bit.ly/perch_csv_data 로 수정합니다.
  35. 코드 실행에는 이상이 없지만 표기 일관성을 위해 예제 데이터셋의 경로를 변경합니다. (p287) 첫 번째 손코딩, (p299) 손코딩 3번째 줄, (p305) 첫 번째 손코딩, (p314) 손코딩 3번째 줄, (p322) 첫 번째 손코딩, (p332) 손코딩 3번째 줄에서 https://bit.ly/fruits_300https://bit.ly/fruits_300_data 로 수정합니다.
  36. (p361) 위에서 4번째 줄에 sc.core(val_scaled, val_target)을 sc.score(val_scaled, val_target)로 정정합니다.(홍*창 님)
  37. (p454) 손코딩 바로 아래 줄에 ‘fit() 메서드 출력 중 여덟 번째 에포크의’를 ‘fit() 메서드 출력 중 아홉 번째 에포크의’로 정정합니다.(홍*창 님)
  38. (p492) 위에서 5번째 줄에 “타임스텝 3의 셀로 주입니다”를 “타임스텝 3의 셀로 주입됩니다”로 정정합니다.(홍*창 님)
  39. (p542) 손코딩 3번째 줄에서 rnn_model.evaluate(val_seq, val_target)rnn_model.evaluate(test_seq, test_target)로 정정합니다.(홍*창 님)
  40. (p233) 위에서 7번째 줄에 “-0.239보다 작고 또 -0.802보다도 작아야 합니다”를 “-0.239보다 작고 -0.802보다 커야 합니다”로 정정합니다. 8번째 줄에 “-0.802와 같거나 작은 와인”을 “-0.802보다 크고 -0.239보다 작은 와인”으로 정정합니다.
  41. (p234) 위에서 2번째 줄에 “1.625와 같거나 작은”을 “1.625보다 크고 4.325보다 작은”으로 정정합니다.
  42. (p246) 손코딩의 출력 결과에 있는 들여쓰기를 삭제해 주세요.
  43. (p128) 2번 문제와 코드 사이에 노트를 추가합니다 “note: 맷플롯립의 plot() 함수는 x 축과 y 축의 값을 받아 선 그래프를 그립니다.”
  44. (p207) SGDClassifier 절 바로 아래 줄에 “판단스 데이터프레임을 만들어”를 “판다스 데이터프레임을 만들어”로 정정합니다.(윤*철 님)
  45. (p320) 위에서 3번째 줄에 “분산이 큰 방향을 데이터로 잘 표현하는 벡터로 생각할 수 있습니다”를 “분산이 큰 방향이란 데이터를 잘 표현하는 어떤 벡터라고 생각할 수 있습니다”로 정정합니다.
  46. (p321) 두 번째 그림에서 “p(4, 5)”를 “p(4.5)”로 정정합니다.
  47. (p561) 3-3절 1번 문제의 답에서 “1, a, b, c, a2, b2, c2, ab, bc, ac, abc, ab2, ac2, bc2, ba2, ca2, cb2, a3, b3, c3“를 “1, a, b, c, a2, b2, c2, ab, bc, ac, abc, ab2, ac2, bc2, ba2, ca2, cb2, a3, b3, c3“로 정정합니다.(박*환 님)
  48. (p355) <여기서 잠깐> 박스 3번째 줄에서 “케라스 API에도“를 “케라스 API에서도“로 수정합니다.
  49. (p357) 위에서 10번째 줄에서 “2장에서 배웠던 넘파이 브로드캐스팅이 여기에도 적용됩니다.“를 “길이가 같은 넘파이 배열의 곱셈은 원소별 곱셈으로 수행됩니다. 즉,“으로 수정합니다.
  50. (p208) 2번째 손코딩 위에 다음과 같은 노트를 추가합니다. “노트 다중 분류일 경우 SGDClassifier에 loss=’log’로 지정하면 클래스마다 이진 분류 모델을 만듭니다. 즉 도미를 양성 클래스로 두고 나머지를 모두 음성 클래스로 두고 모델을 만드는 식입니다. 이런 방식을 OvR(One versus Rest)라고 부릅니다.”
  51. (p179) 마지막 손코딩 위에 다음 노트를 추가합니다. “노트 Species 열을 선택할 때 fish[['Species']]와 같이 두 개의 괄호를 사용하지 않도록 주의하세요. 이렇게 하면 fish_target이 2차원 배열이 됩니다.”
  52. (p436) 밑에서 7번째 줄의 코드에서 stidesstrides로 정정합니다.(신*상 님)
  53. (p450) 손코딩에서 plot_model(model, show_shapes=True, to_file='cnn-architecture.png', dpi=300)plot_model(model, show_shapes=True)로 수정합니다. 또한 출력 결과에서 input과 output 박스에 있는 ? 를 None 으로 모두 수정합니다.
  54. (p468) 손코딩 아래 3번째 줄과 4번째 줄에서 conv_weights[:,:,:0,0]conv_weights[:,:,0,0]으로 정정하고 conv_weights[:,:,:0,31]conv_weights[:,:,0,31]로 정정합니다.
  55. (p538, p540) GRU 셀 그림에서 ‘-1‘ 표시를 ‘1-‘로 정정합니다.
  56. (p408) ModelCheckpoint 콜백 객체를 만들 때 save_best_only=True 매개변수가 누락되었습니다. <콜백> 절 아래 3번째 문장에서 “ModelCheckpoint 콜백은 기본적으로 최상의 검증 점수를 만드는 모델을 저장합니다.“를 “ModelCheckpoint 콜백은 기본적으로 에포크마다 모델을 저장합니다. save_best_only=True 매개변수를 지정하여 가장 낮은 검증 점수를 만드는 모델을 저장할 수 있습니다.”로 정정합니다.
  57. (p419) ModelCheckpoint 항목 맨 아래에 다음 문장을 추가합니다. “save_best_only 매개변수를 True로 지정하면 가장 낮은 검증 점수를 만드는 모델을 저장합니다.”
  58. 다음 손코딩에서 ModelCheckpoint 객체를 생성할 때 save_best_only=True 매개변수를 추가합니다.(몽*이 님)
    • p408 첫 번째 손코딩 4번째 줄
    • p409 손코딩 4번째 줄
    • p416 7번째 줄과 17번째 줄
    • p452 손코딩 3번째 줄
    • p459 15번째 줄
    • p512 손코딩 4번째 줄
    • p516 두 번째 손코딩 4번째 줄
    • p521 7번째 줄
    • p522 3번째 줄
    • p531 손코딩 4번째 줄
    • p533 두 번째 손코딩 4번째 줄
    • p536 손코딩 4번째 줄
    • p540 손코딩 4번째 줄
    • p544 5번째 줄, 마지막 줄
    • p545 아래에서 6번째 줄
    • p546 아래에서 12번째 줄
  59. (p200) 위에서 3번째 줄에 “불평만 늘어 놀 시간이 없습니다”를 “불평할 시간조차 아깝습니다”로 수정합니다.(김*식 님)
  60. (p48) 손코딩 첫 번째 줄에 있는 주석에서 “pylot 함수를 plt로”를 “pyplot 함수를 plt로” 정정합니다.(이*연 님)
  61. (p419) ModelCheckpoint 항목 설명 중에서 “save_weights_only 매개변수의 기본값은 True로 모델의 가중치와 절편만 저장합니다. False로 지정하면 전체 모델을 저장합니다”를 “save_weights_only 매개변수의 기본값은 False로 전체 모델을 저장합니다. True로 지정하면 모델의 가중치와 절편만 저장합니다”로 정정합니다.(조*영 님)
  62. (p54) 첫 번째 손코딩 바로 아래에 ‘알고리즘을 훈련시킨 뒤 훈련합니다‘를 ‘알고리즘을 훈련합니다‘로 정정합니다.
  63. (p102) 아래에서 5번째 줄에 “샘플 [20, 150]을 동일한 비율로”를 “샘플 [25, 150]을 동일한 비율로”로 정정합니다.(이*석 님)
  64. (p554) 위에서 6번째 줄에 “<머신 러닝 교과서 with 파이썬, 사이킷런, 텐서플로>(길벗, 2019)”를 “<머신 러닝 교과서 with 파이썬, 사이킷런, 텐서플로 (개정 3판)>(길벗, 2021)”로 수정합니다.
  65. (p501) 아래쪽 <여기서 잠깐> 바로 윗줄에 “하나의 타임스탬프에 해당합니다”를 “하나의 타임스텝에 해당합니다”로 정정합니다.(박*식 님)
  66. (p276) ‘앙상블 학습 보고서’의 그레이디언트 부스팅 설명에서 ‘이진 트리의 손실을’을 ‘이전 트리의 손실을’로 정정합니다.(박*식 님)
  67. (p445) 손코딩 위의 4번째 줄에서 “7장 1절에서 언급했듯이”를 “8장 1절에서 언급했듯이”로 정정합니다.(박*식 님)
  68. (p241) 페이지 아래에서 3번째 줄에 plt.figure(figsize=(20,15), dpi=300)plt.figure(figsize=(20,15))로 수정합니다.
  69. (p555) <참고할 만한 사이트> 절에서 “특히 케라스 공식 문서를 번역하여~참고로 사용하세요.” 문장을 삭제합니다. 이어서 나오는 “케라스 외에도 머신러닝과 딥러닝에 관한”을 “또한 머신러닝과 딥러닝에 관한”으로 수정합니다. 그 아래 순서 없는 목록에서 두 번째 항목을 “* 머신러닝 문서 번역: http://ml-ko.kr“로 수정합니다.
  70. (p540) 위에서 7번째 줄에 “은닉 상태에 곱해지는 절편이 별도로 필요합니다”를 “은닉 상태에 곱해지는 가중치 외에 절편이 별도로 필요합니다”로 수정합니다.(박*호 님)
  71. (p285) 학습 목표 두 번째 항목에서 “k-평균과 DBSCAN을 배웁니다”를 “k-평균을 배웁니다”로 정정합니다.(박*호 님)
  72. (p273) 손코딩 바로 위 문단 끝에 주석을 추가합니다. “<주석>옮긴이_ 사이킷런 1.0에서 히스토그램 기반 부스팅이 experimental 모듈 아래에서 벗어났으므로 enable_hist_gradient_boosting 모듈을 임포트할 필요가 없습니다.”
  73. (p156) 사이킷런 1.0에서 get_feature_names() 메서드를 가진 변환기에 get_feature_names_out() 메서드가 추가되었고 get_feature_names()는 deprecated 되어 1.2 버전에서 삭제될 예정입니다. 따라서 위에서 2번째 줄과 첫 번째 손코딩에서 get_feaure_names()get_feature_names_out()으로 수정합니다. (p168) 위에서 8번째 줄에서 get_feaure_names()get_feature_names_out()으로 수정합니다.
  74. (p265) 아래에서 5번째 줄에서 “1,000개 가방에서 100개 샘플을”을 “1,000개의 샘플이 들어 있는 가방에서 100개 샘플을”로 수정합니다. 아래에서 2번째 줄에서 “1,000개 가방에서 중복하여 1,000개의 샘플을 뽑기 때문에 부트스트랩 샘플은 훈련 세트의 크기와 같습니다”를 “즉 1,000개의 샘플이 들어 있는 가방에서 중복하여 1,000개의 샘플을 뽑습니다“(P*G 님)
  75. (p438) 아래에서 5번째 줄에서 “이련 경우에는”을 “이런 경우에는”으로 수정합니다.(박*영 님)
  76. (p509) 손코딩 아래 두 번째 줄에서 “첫 번째 매개변수는 사용할 뉴런 개수로 input_shape에 입력 차원을”을 “첫 번째 매개변수에는 사용할 뉴런 개수를 지정하고 input_shape에는 입력 차원을”로 수정합니다.(박*영 님)
  77. (p71, p79, p82, p83) kn = kn.fit(...)kn.fit(...)으로 수정합니다.
  78. (p309) 아래에서 두 번째 줄에 “클러스터 중심이기 때문이 이미지로 출력하려면”을 “클러스터 중심이기 때문에 각 중심을 이미지로 출력하려면”으로 수정합니다.(O***l 님)
  79. (노트: 2022년 5월 현재 코랩의 파이썬 버전은 3.7.x로 사이킷런 1.0.x만 설치됩니다. 코랩을 사용하는 경우 이 항목의 수정 사항을 무시하세요) 사이킷런 1.0.x 버전만 지원됩니다) 사이킷런 1.1.0 버전에서 SGDClassifierloss 매개변수 중 로지스틱 손실을 의미하는 'log''log_loss'로 바뀐다는 경고가 발생합니다. 사이킷런 1.1.0 버전 이상을 사용하는 경우 경고를 피하기 위해 다음과 같이 변경해 주세요.
    • (p208) 두 번째 손코딩, (p210) 첫 번째 손코딩, (p211) 두 번째 손코딩에서 loss='log'loss='log_loss'로 바꿉니다.
    • (p214) 위에서 11번째 줄과 20번째 줄, (p215) 5번째 줄에서 loss='log'loss='log_loss'로 바꿉니다.
    • (p345) 세 번째 손코딩, (p362) 위에서 15번째 줄에서 loss='log'loss='log_loss'로 바꿉니다.
  80. (p445) 페이지 아래 그림에 있는 숫자 “50,000“을 “48,000“으로 수정합니다.(고*광 님)
  81. (p472) <여기서 잠깐> 코너에서 “InputLayer 객체를 포함한 _layers 리스트 속성을 따로 가지고 있습니다. Sequential 클래스 객체의 _layers 속성의 첫 번째 항목이…”를 “InputLayer 객체를 포함한 _self_tracked_trackables 리스트 속성을 따로 가지고 있습니다. Sequential 클래스 객체의 _self_tracked_trackables 속성의 첫 번째 항목이…”로 정정합니다.
  82. (p280) 페이지 중간의

    hgb.fit(train_input, train_target)
    print(rf.feature_importances_)



    from sklearn.inspection import permutation_importance

    hgb.fit(train_input, train_target)
    result = permutation_importance(hgb, train_input, train_target, n_repeats=10, random_state=42, n_jobs=-1)
    print(result.importances_mean)

    result = permutation_importance(hgb, test_input, test_target, n_repeats=10, random_state=42, n_jobs=-1)
    print(result.importances_mean)


    로 정정합니다.(김*나 님)
  83. (p37) 페이지 아래 풍선말에서 ‘현재는 미국과 캐나다에서만 서비스 가입이 가능합니다’를 삭제합니다. 그다음 ‘https://colab.research.google.com’을https://colab.research.google.com/signup’으로 수정합니다.
  84. (p41) ‘키워드로 끝내는 핵심 포인트’ 아래 ‘구글 드라이브’ 항목의 두 번째 줄에 ‘자동으로 구글 클라우드의’를 ‘자동으로 구글 드라이브의’로 수정합니다.
  85. (p558) 1-2절 1번 문제의 4번 설명을 ‘다양한 운영체제를 지원하고 패키지 관리자를 제공하는 파이썬 배포판입니다’로 수정합니다.
  86. (p111) 1번 문제 첫 문장과 (p559) 아래에서 4번째 줄에서 ‘데이터가 0에서 몇 표준편차만큼’을 ‘데이터가 평균에서 몇 표준편차만큼’으로 정정합니다.
  87. (p516) 첫 번째 문장에서 “이 모델은 (100, ) 크기의”를 “임베딩 층은 (100, ) 크기의”로 수정합니다.
  88. (p377) 아래에서 2번째 줄에서 ‘reshpae() 메서드를 사용해’를 ‘reshape() 메서드를 사용해’로 정정합니다.(박*근 님)
  89. (p288) 두 번째 손코딩 아래 ‘furits_300.npy 파일에 들어 있는’을 ‘fruits_300.npy 파일에 들어 있는’로 정정합니다.(변*우 님)
  90. 구글 코랩의 메모리 부족 에러를 피하기 위해 9-02절에서 IMDB 리뷰의 단어 개수를 500개에서 300개로 줄입니다.
    (p502) 첫 번째 손코딩 위의 1번째 줄, 2번째 줄, 손코딩 3번째 줄에서 500300으로 바꿉니다.
    (p504) 위에서 2번째 줄에서 num_words=500num_words=300으로, ‘500개의 단어만’을 ‘300개의 단어만’으로, <여기서 잠깐>에서 두 군데 ‘500개의 단어를’을 ‘300개의 단어를’로 바꿉니다.
    (p509) 손코딩 3번째 줄, 손코딩 아래 3번째, 4번째, 8번째 줄에서 500300으로 바꿉니다.
    (p510) 위에서 2번째, 3번째, 4번째, 6번째 줄과 아래에서 2번째, 3번째, 4번째, 5번째, 6번째 줄에서 500300으로 바꿉니다. 위에서 3번째 줄에서 ‘499까지’를 ‘299까지’로 바꿉니다.
    (p511) 마지막 손코딩 출력에서 40722472로 바꿉니다.
    (p512) 위에서 1번째, 2번째 줄에서 ‘4,081‘을 ‘2,481‘로 바꿉니다. 위에서 4번째, 6번째, 7번째 줄에서 500을 300으로 바꿉니다. 위에서 7번째, 10번째 줄에서 ‘4,000‘을 ‘2,400‘으로 바꿉니다. 위에서 11번째 줄에서 ‘4,072‘를 ‘2,472‘로 바꿉니다.
    (p514) “단어 임베딩을 사용하기” 절 위의 3번째 줄에서 두 개의 500300으로 바꿉니다.
    (p515) 위에서 9번째 줄, 손코딩 2번째 줄, 아래에서 6번째, 7번째, 8번째 줄에서 500300으로 바꿉니다.
    (p516) 첫 번째 손코딩 출력에서 80004800으로, ‘8,209‘를 ‘5,009‘로 바꿉니다. 손코딩 아래 3번째 줄 두 개의 500300으로 바꿉니다. 손코딩 아래 4번째 줄 ‘8,000‘을 ‘4,800‘으로 바꿉니다.
    (p519) 손코딩 5번째 줄에서 500300으로 바꿉니다.
    (p520) 아래에서 6번째 줄에서 500300으로 바꿉니다.
    (p521) 아래에서 4번째 줄에서 500300으로 바꿉니다.
  91. 텐서플로 2.6.0 버전에서 _layers 속성이 삭제되고 _input_layers 속성이 추가되었습니다. 이에 따라 (p472) <여기서 잠깐>에서 ‘InputLayer 객체를 포함한 _layers 리스트 속성을 따로 가지고 있습니다. Sequential 클래스 객체의 _layers 속성의 첫 번째 항목이 바로 InputLayer 클래스의 객체입니다.’를 ‘InputLayer 객체를 담고 있는 _input_layers 리스트 속성을 가지고 있습니다. 입력이 하나인 경우 _input_layers 속성의 첫 번째 항목이 InputLayer 클래스의 객체에 해당합니다.’로 수정해 주세요. (p483) 3번 문제의 3번, 4번 보기를 각각 model._input_layers[0].inputmodel._input_layers[0].output으로 바꾸어 주세요. (p570) 8-3절 3번 문제 3, 4번 보기 해설에서 _layers[0]_input_layers[0]으로 바꾸어 주세요.
  92. (p492) 아래에서 9번째 줄에 “사용되는 가중치는 w_h 하나라는 점입니다”를 “사용되는 가중치 w_h 하나라는 점입니다”로 수정해 주세요.
  93. 79번 항목을 다시 반영합니다.
    • (p208) 두 번째 손코딩, (p210) 첫 번째 손코딩, (p211) 두 번째 손코딩에서 loss='log'를 loss='log_loss'로 바꿉니다.
    • (p214) 위에서 11번째 줄과 20번째 줄, (p215) 7번째 줄에서 loss='log'를 loss='log_loss'로 바꿉니다.
    • (p345) 세 번째 손코딩, (p362) 위에서 15번째 줄에서 loss='log'를 loss='log_loss'로 바꿉니다.
  94. (p408) 위에서 첫 번째 줄, 7번째 줄, (p409) 첫 번째 줄에서 ‘검증 점수‘를 ‘검증 손실‘로 수정합니다.(민*우 님)
  95. (p449, p450) 손코딩 출력의 첫 번째 박스에서 InutLayerInputLayer로 정정합니다.(송*원 님)
  96. (p475) 위에서 첫 번째 줄에 “그다음에 (784, ) 크기를”을 “그다음에 (28, 28) 크기를”로 정정합니다.(김*연 님)
  97. (p330) 첫 번째 손코딩 아래 1번째 줄에서 “사과와 조금 혼돈되는”을 “사과와 조금 혼동되는”으로 수정합니다.(d**o 님)
  98. (p383) <여기서 잠깐>의 2번째 줄, (p411) 아래에서 3번째 줄, (p554) 위에서 6번째 줄에서 “[핸즈온 머신러닝 2판](한빛미디어, 2020)”을 “[핸즈온 머신러닝 3판](한빛미디어, 2023)”로 수정합니다.(김*식 님)
  99. (p45) <여기서 잠깐> 코너에 나오는 생선 데이터의 캐글 주소를 다음 URL로 바꾸어 주세요. https://www.kaggle.com/datasets/vipullrathod/fish-market
  100. (p476) 위에서 6번째 줄에 “이 필터와 큰 양수가 곱해지면 더 큰 음수가 되고 배경처럼 0에 가까운 값과 곱해지면 작은 음수가 될 것입니다“를 “이 필터와 큰 양수가 곱해지면 더 큰 음수가 되고 배경처럼 0에 가까운 값과 곱한 후 절편을 더하면 양수가 될 수 있습니다“로 수정해 주세요.

Your Inputs

댓글 남기기

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