카테고리 보관물: 핸즈온 머신러닝

“머신러닝, 딥러닝 어떻게 공부할 것인가!”

개발자들의 아지트 튜링의 사과에서 진행한 <머신러닝, 딥러닝 어떻게 공부할 것인가?>의 강의 영상이 유튜브에 업로드되었습니다! 시간이 여의치 않아 참석하지 못하신 분들에게도 온라인을 통해서나마 이야기를 전달해 드릴 수 있어서 기쁘네요. 재미있게 보시고 의견이나 궁금한 점 있으시면 댓글 남겨 주세요. 감사합니다!

“머신러닝, 딥러닝 어떻게 공부할 것인가?” 무료 강의 안내

<핸즈온 머신러닝 3판> 출간 기념으로 10월 18일 오후 7시 성수동 개발자 아지트 “튜링의 사과“에서 “머신러닝, 딥러닝 어떻게 공부할 것인가?“라는 주제로 강의를 합니다. 강의가 끝나고 사인회(!)도 합니다. 제가 쓰거나 번역한 책을 들고 놀러 오세요! 😀

이 강의는 무료이지만 노쇼(no-show)를 방지하기 위해 신청시 만원을 내시면 현장에서 돌려 받을 수 있습니다. 자리가 많지 않으니 서두르세요! 이벤트 안내 페이지: https://bit.ly/3ZLMyDn

튜링의 사과에 대한 소개는 여기를 참고하세요.

Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition 번역 완료!

<핸즈온 머신러닝 3판>의 번역을 완료했습니다. 2판과 3판의 주요 차이점은 다음 그림을 참고하세요.
(3판 번역서는 9월 출간 예정이라고 합니다)

조금 더 자세하게 각 장의 내용을 요약하면 다음과 같습니다!

  • 1장은 큰 변화가 없습니다. 지도 학습, 비지도 학습, 준지도 학습 외에 자기 지도 학습 설명이 추가되었습니다. 삶의 만족도 예제를 위한 데이터를 최신으로 업데이트했습니다. 홀드아웃 검증에 대한 그림과 훈련-개발 세트를 설명하는 그림이 추가되었습니다.
  • 2장은 그간 사이킷런이 많이 업데이트되었기 때문에 소소한 부분이 많이 바뀌었습니다. 먼저 주피터 노트북 대신 코랩에 대한 간략한 설명으로 시작합니다. 코랩의 편리함과 주의 사항도 언급합니다. 캘리포니아 주택 데이터셋을 사용하는 예제는 전반적으로 깔끔하게 코드를 정리했습니다. SimpleImputer외에 KNNImputerIterativeImputer로 언급합니다. 원-핫 인코딩 부분에서는 판다스의 get_dummies 함수를 추가로 소개하고 왜 사용하지 않는지 설명합니다. 최근 사이킷런에서 지원하는 데이터프레임 입력-데이터프레임 출력 기능을 잘 반영했습니다. 무엇보다도 새로운 ColumnTransformer를 적극 활용합니다. 사용자 정의 변환기는 TransformerMixin을 상속하는 방식에서 FunctionTransformer를 사용하는 예제로 바꾸었습니다. 마지막으로 하이퍼파라미터 튜닝 부분에서 HalvingGridSearchCV, HalvingRandomSearchCV 클래스도 잠깐 언급해 줍니다.
  • 3장은 큰 변화는 없고 자잘한 수정이 많습니다. 편향된 데이터셋에 대한 문제점을 보이기 위해 만든 자작 클래스를 사이킷런의 DummyClassifier로 바꾸었습니다. 다중 분류에 대한 설명과 예제가 보강되었습니다. 오차 행렬에 대한 그래프가 대폭 변경, 추가되었고 설명도 상세해졌습니다. ClassifierChain에 대한 내용이 추가되었습니다. 코드는 전반적으로 새로 작성되었습니다.
  • 4장도 큰 변화가 없습니다. partial_fit()warm_start에 대한 설명이 추가되었고 규제항에 대한 공식을 변경했습니다. 조기 종료에 대한 코드와 설명이 보강되었습니다. 코드는 전반적으로 새로 작성되었습니다.
  • 5장은 LinearSVCSGDClassifier에 대한 설명이 보강되었고 힌지 손실과 제곱 힌지 손실에 대한 설명이 자세해졌습니다. 대신 콰드라틱 프로그래밍 절이 삭제되었습니다.
  • 6장은 거의 변화가 없고 결정 트리가 축 회전에 대한 민감하다는 것과 분산이 높다는 것을 설명하기 위한 절이 추가되었습니다.
  • 7장은 그레이디언트 부스팅의 조기 종료를 위해 n_iter_no_change를 사용하는 설명이 추가되었습니다. (드디어!) 히스토그램 부스팅 절이 추가되었습니다(하지만 XGBoost에 대해 자세히 다루지는 못했습니다). StackingClassifier를 사용하는 방식으로 스태킹 절이 대폭 수정되었습니다.
  • 8장에서 PCA로 차원을 줄인후 하이퍼파라미터 튜닝을 하는 예제와 memmap 파일과 IPCA를 사용하는 예제가 추가되었습니다. 커널 PCA 절이 삭제되고 대신 랜덤 투영 절이 추가되었습니다.
  • 9장에서 가우스 혼합 모델의 이론 부분이 삭제되었습니다. 사이킷런의 준지도 학습 클래스에 대한 소개가 추가되었습니다. 유사도 전파에 대한 설명이 보강되었습니다.
  • 10장은 케라스를 사용한 인공 신경망을 소개합니다. 그간 편향 뉴런을 따로 표기했는데 3판에서 드디어 이를 뺐습니다. MLPRegressor 예제가 추가되었습니다. 케라스의 역사(?)에 대한 소개가 간략해졌고 설치 절이 삭제되었습니다. 전체적으로 케라스 API를 사용한 코드가 갱신되었습니다. 특히 캘리포니아 주택 데이터셋을 사용한 예제, 모델 저장과 복원, 콜백, 텐서보드 설명 등이 크게 바뀌었습니다. 그리고 드디어 하이퍼파라미터 튜닝을 위해 케라스 튜너를 다루는 절이 들어갔습니다! 꽤 상세히 설명하기 때문에 만족하실 것 같네요.
  • 11장은 신경망 훈련을 위한 다양한 기술을 다룹니다. 기존 활성화 함수 설명외에 추가로 GELU, Swish, Mish가 포함되었습니다. 옵티마이저에서는 AdamW가 추가되었습니다. 배치 정규화, 전이 학습, 학습률 스케줄링, 몬테 카를로 드롭아웃 등 주요 코드와 설명이 업데이트되었습니다. 특히 실용 가이드라인이 최신 기술에 맞게 바뀌었습니다.
  • 12장은 텐서플로로 사용자 정의 모델을 만들고 훈련하는 내용을 다룹니다. 더이상 사용되지 않는 케라스 백엔드 관련 내용이 업데이트되었습니다. 사용자 정의 지표, 층, 모델, 훈련을 위한 코드와 설명이 최신 케라스 버전에 맞추어 모두 업데이트 되었습니다. 텐서플로 그래프 섹션에 XLA 설명이 추가되었습니다.
  • 13장은 데이터 전처리에 대한 소개하며 이전 판에 비해 많은 수정이 있습니다. tf.Transform을 삭제하고 케라스 전처리 층에 대한 내용을 크게 확대했습니다. tf.data API를 사용한 코드가 개선되었고 케라스와 함께 사용하는 예시도 대폭 변경되었습니다. 케라스 전처리 층으로 Normalization, Discretization, CategoryEncoding, StringLookup, Hashing 층을 각각각의 절에서 자세히 설명합니다. 임베딩 소개 부분에서 StringLookup 층과 함께 사용하는 예시를 들어 보이며 텐서플로 허브에서 사전 훈련된 모델을 로드하는 방법을 소개합니다. 허깅 페이스를 사용한 예시는 16장으로 미룹니다. 또한 이미지를 위한 전처리 층도 간략히 소개합니다. 더 자세한 내용은 합성곱 신경망을 다루는 14장에서 설명할 예정입니다.
  • 14장에서 텐서플로 저수준 연산을 사용하는 합성곱 신경망의 예제가 케라스 코드와 설명으로 바뀌었습니다. 깊이 방향 풀링을 구현하는 예시를 텐서플로 저수준 연산과 람다 층을 사용한 코드에서 케라스 사용자 정의 층으로 바꾸었습니다. 대표적인 CNN 구조 소개에서 SENet이 추가되었습니다. 또한 마지막에 간략하지만 Xception, ResNeXt, DenseNet, MobileNet, CSPNet, EfficientNet도 소개하고 CNN 구조 선택 가이드라인을 제시합니다. 객체 탐지에 대한 설명이 보강되고 객체 추적이 추가되었습니다.
  • 15장은 큰 폭으로 바뀌었습니다. 인공 데이터셋을 사용하지 않고 시카고 교통 데이터를 사용하도록 전체 예제를 바꾸었습니다. 기준 모델로 선형 모델 외에 ARIMA 모델이 추가되었습니다. 이를 위해 statsmodels 라이브러리를 사용하고 몇가지 ARIMA 변종에 대해 살펴 볼 수 있습니다. 다변량 시계열 예측하기 절이 추가 되었고 여러 타임 스텝을 예측하는 절이 크게 바뀌었습니다. 시퀀스-투-시퀀스 방식을 사용하여 예측하는 방식이 추가되었습니다. 핍홀에 대한 설명이 삭제되었습니다.
  • 16장은 NLP를 다루며 책 전체에서 가장 많이 바뀐 장이 아닐까 합니다. 그만큼 NLP 분야의 변화가 크다는 의미 같습니다. 셰익스피어 텍스트를 생성하는 예제는 15장에서 윈도 데이터셋을 상당히 다룬 덕분에 코드와 설명이 간소화되었습니다. 대신 텍스트 전처리 층을 최종 모델에 포함하는 예시가 추가되었습니다. IMDb 감성 분석 예제는 케라스 전처리 층을 사용하도록 코드와 설명이 모두 바뀌었습니다. 케라스에서 마스킹 처리에 대한 설명이 업데이트되었습니다. 사전 훈련된 단어 임베딩의 설명을 업데이트하고 언어 모델에 대한 소개가 추가되었습니다. 영어-프랑스어 번역 예제를 영어-스페인어 번역 예제로 바꾸고 전체 코드와 설명이 업데이트되었습니다. 텐서플로 애드온을 사용했던 어텐션 예제를 케라스 어텐션 층으로 바꾸었습니다. 트랜스포머에 대한 설명이 업데이트되었고 인코더와 디코더 구조를 직접 구현하는 예시가 포함되었습니다. 최근에 등장한 다양한 언어 모델에 대한 소개가 많이 추가되었고 마지막에 허깅 페이스 트랜스포머스 라이브러리를 사용하는 예시가 포함되었습니다!
  • 17장은 기존 컨텐츠를 거의 그대로 유지하고 확산 모델만 추가되었습니다. 확산 모델의 개념과 이론을 설명하고 정방향 과정과 역방향 과정을 직접 구현하여 패션 MNIST와 유사한 이미지를 생성하는 예제를 다룹니다.
  • 18장은 강화 학습을 다룹니다. 2판의 내용을 그대로 승계하고 주로 코드를 최신으로 업데이트했습니다. 부족한 지면 때문에 TF-Agents 절이 삭제되었습니다.
  • 19장은 분산 훈련과 배포에 관한 주제를 다룹니다. 텐서플로 서빙에 대한 설명과 코드가 많이 변경되었습니다. GCP AI 플랫폼에 대한 부분을 모두 버텍스 AI로 업데이트했습니다(거의 새로 작성 했네요). 웹 페이지에서 모델 실행을 위한 TFJS 설명이 보강되었고 예제도 추가되었습니다. 병렬화 기술 소개에 PipeDream과 Pathways가 추가되었습니다. 마지막으로 버텍스 AI의 하이퍼파라미터 튜닝 방법과 케라스 튜너를 사용한 하이퍼파라미터 튜닝 방법이 추가되었습니다.

“핸즈온 머신러닝 2판”, “Do It! 딥러닝 입문” 주피터 노트북 업데이트 안내

<핸즈온 머신러닝 2판>과 <Do It! 딥러닝 입문>의 주피터 노트북을 사이킷런 0.24와 텐서플로 2.4 버전에 맞추어 모두 다시 실행하여 깃허브(핸즈온 머신러닝 2 깃허브, Do It! 딥러닝 입문 깃허브)에 업데이트했습니다.

특히 <핸즈온 머신러닝 2판>의 노트북에는 원서 노트북의 변경 사항과 사이킷런, 텐서플로의 변경 사항이 다수 포함되어 있습니다. 알려진 버그를 회피하기 위한 코드 업데이트도 있습니다. 17장의 연습문제 9번의 솔루션이 이번에 추가되었습니다.

감사합니다! 🙂

핸즈온 머신러닝 2 에러타 안내

안녕하세요. 핸즈온 머신러닝 2에 새롭게 에러타가 많이 추가되었습니다. 이번 에러타는 원서에 누적된 오류 보고를 포함하였고 사이킷런과 텐서플로 최신 버전에서 변경된 내용을 반영하였습니다. 다음 에러타 항목을 참고해 주세요. 핸즈온 머신러닝 2의 전체 에러타는 여기를 참고해 주세요. 감사합니다!

  1. (p100) 두 번째 문단 끝에 다음처럼 주석을 추가합니다. “… SimpleImputer의 객체를 생성합니다.<주석>옮긴이_ 사이킷런 0.22버전에서 최근접 이웃 방식으로 누락된 값을 대체하는 KNNImputer 클래스가 추가되었습니다.</주석>”
  2. (p109) 첫 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 변환을 적용해보겠습니다.<주석>옮긴이_ 사이킷런 0.22버전에서 열 이름이나 데이터 타입을 기반으로 열을 선택할 수 있는 make_column_selector() 함수가 추가되었습니다.</주석>”
  3. (p118) 54번 주석 끝에 다음 문장을 추가합니다. “사이킷런 0.24버전에서 파라미터 탐색 범위를 좁혀가면서 컴퓨팅 자원을 늘려가는 HalvingGridSearchCV와 HalvingRandomSearchCV가 추가됩니다. 이 예제는 https://bit.ly/halving-grid-search를 참고하세요.”
  4. (p128) 첫 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 구조를 가지고 있습니다.<주석>옮긴이_ 사이킷런 0.22버전에서 fetch_openml() 함수에 as_frame 매개변수가 추가되었습니다. 이 매개변수를 True로 설정하면 판다스 데이터프레임을 반환합니다.</주석>”
  5. (p140) 6번 주석 끝에 다음 문장을 추가합니다. “사이킷런 0.22버전에서 정밀도/재현율 곡선을 그려주는 plot_precision_recall_curve() 함수가 추가되었습니다.”
  6. (p142) 첫 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 그래프를 그립니다.<주석>옮긴이_ 사이킷런 0.22버전에서 ROC 곡선을 그려주는 plot_roc_curve() 함수가 추가되었습니다.</주석>”
  7. (p149) 첫 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 편리할 때가 많습니다.<주석>옮긴이_ 사이킷런 0.22버전에서 오차 행렬을 그래프로 그려주는 plot_confusion_matrix() 함수가 추가되었습니다.</주석>”
  8. (p188) 첫 번째 문단 2번째 줄에서 “2차방정식처럼 보이며 거의 선형적입니다“를 “3차방정식처럼 보입니다“로 정정합니다.
  9. (p230) 1번 주석 끝에 다음 문장을 추가합니다. “사이킷런 0.21버전에서 dot 파일을 만들지 않고 바로 트리를 그릴 수 있는 plot_tree() 함수도 추가되었습니다.”
  10. (p236) 5번 주석을 다음과 같이 바꿉니다. “옮긴이_ 사이킷런 0.21버전에서 히스토그램 기반 그레이디언트 부스팅이 추가되었고 presort 매개변수로 얻을 수 있는 성능 향상이 크지 않기 때문에 사이킷런 0.24버전에서 결정 트리와 그레이디언트 부스팅 클래스의 presort 매개변수가 삭제됩니다.”
  11. (p238) 9번 주석에서 “… min_impurity_decrease 분할 대상이 되기 위해 … min_impurity_split가 추가되었습니다“를 “… min_impurity_decrease가 추가되었습니다. 분할 대상이 되기 위해 … min_impurity_split는 0.25버전에서 삭제됩니다“로 수정합니다. 또 10번 주석 끝에서 “… 지원합니다“를 “… 지원했지만 0.22버전에서 비용 복잡도 기반의 사후 가지치기를 위한 ccp_alpha 매개변수가 결정 트리와 트리 기반의 앙상블 모델에 추가되었습니다“로 수정합니다.
  12. (p254) 7.4절 아래 두 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 크기로 지정합니다.<주석>옮긴이_ 사이킷런 0.22버전에서 랜덤 포레스트 클래스에 부트스트랩 샘플 크기를 지정할 수 있는 max_samples 매개변수가 추가되었습니다. 샘플 크기를 정수로 입력하거나 비율을 실수로 지정할 수 있습니다. 기본값은 훈련 세트 전체 크기입니다.<주석>”
  13. (p262) 7.5.2절에서 두 번째 문단, 첫 번째 줄에서 “그레이디언트 부스팅은 회귀 문제에도 아주 잘 작동합니다”를 “그레이디언트 부스팅은 분류 문제에도 아주 잘 작동합니다”로 정정합니다.
  14. (p266) 첫 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 훈련을 멈춥니다.<주석>옮긴이_ 사이킷런 0.20버전에서 그래디언트 부스팅에 조기 종료 기능이 추가되었습니다. 훈련 데이터에서 validation_fraction 비율(기본값 0.1)만큼 떼어 내어 측정한 손실이 n_iter_no_change 반복 동안에 tol 값(기본값 1e-4) 이상 향상되지 않으면 훈련이 멈춥니다.</주석>”
  15. (p267) 두 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 매우 비슷합니다.<주석>옮긴이_ 이외에도 히스토그램 기반 그레이디언트 부스팅을 구현한 LightGBM(https://lightgbm.readthedocs.io)이 있습니다. 사이킷런 0.21버전에서 히스토그램 기반 그레이디언트 부스팅을 구현한 HistGradientBoostingClassifier와 HistGradientBoostingRegressor가 추가되었습니다.</주석>”
  16. (p271) 첫 번째 문장 끝에서 다음처럼 주석을 추가합니다. “… 지원하지 않습니다.<주석>옮긴이_ 사이킷런 0.22버전에서 StackingClassifier와 StackingRegressor가 추가되었습니다.</주석>”
  17. (p319) 9.1.5절 아래 첫 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 훈련해보겠습니다.<주석>옮긴이_ 사이킷런 0.24버전에서 준지도 학습을 위한 SelfTrainingClassifier가 추가됩니다.</주석>”
  18. (p358) 첫 번째 문단 끝에서 “… 다중 출력 분류기multioutput classifier입니다.”를 “… 다중 레이블 분류기multilabel classifier입니다.”로 정정합니다.
  19. (p380) 아래에서 두 번째 문단 끝에서 “(89% 검증 정확도에 가까이 도달할 것입니다)”를 “(89.4% 검증 정확도에 가까이 도달할 것입니다)”로 수정합니다.
  20. (p405) 페이지 끝에 다음처럼 주석을 추가합니다. “… 배치 크기를 사용해보세요.<주석>옮긴이_ 텐서플로 2.4버전에서 케라스 모델의 compile() 메서드에 있는 steps_per_execution 매개변수를 1이상으로 설정하면 계산 그래프를 한 번 실행할 때 여러 배치를 처리할 수 있기 때문에 GPU를 최대로 활용하고 배치 크기를 바꾸지 않고 훈련 속도를 높일 수 있습니다.</주석>”
  21. (p408) 6번 문제 두 번째와 세 번째 항목에서 “가중치 벡터“를 “가중치 행렬“로 정정합니다.
  22. (p465) 12.2절 아래 첫 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 방법을 알아봅니다.<주석>옮긴이_ 텐서플로 2.4버전에서 넘파이 호환 API인 tf.experimental.numpy가 추가되었습니다.</주석>”
  23. (p475) 첫 번째 코드 블럭에서 my_softplus 함수 옆의 주석을 “# tf.nn.softplus(z)와 반환값이 같습니다.“에서 “# tf.nn.softplus(z)가 큰 입력을 더 잘 다룹니다.“로 수정합니다.
  24. (p492) 22번 주석 끝에 다음 문장을 추가합니다. “이 예는 번역서 깃허브에 있는 custom_model_in_keras.ipynb 주피터 노트북을 참고하세요.”
  25. (p531) 13.3.3절 아래 첫 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 노력하고 있습니다.<주석>옮긴이_ tf.keras.layers.experimental.preprocessing 아래 이미지 처리, 이미지 증식, 범주형 데이터에 관련된 전처리 층이 추가되었습니다.</주석>”
  26. (p633) 첫 번째 문단 마지막 부분에 “타깃(마지막 글자)를 분리하겠습니다”를 “타깃(마지막 100개의글자)를 분리하겠습니다”로 정정합니다.
  27. (p662) [식 16-2] 위 두 번째 줄에서 “아래쪽에 (전치되어) 표현되어 있습니다”를 “위쪽에 (전치되어) 표현되어 있습니다”로 정정합니다.
  28. (p663) 위에서 네 번째 줄에서 “왼쪽 아래 수직 점선으로”를 “왼쪽  수직 점선으로”로 정정합니다.
  29. (p711) [그림 17-19] 위의 “예를 들어 생성자의 출력을 ~ 풀링 층이 뒤따릅니다).” 문단을 다음 문단으로 교체합니다.
    “예를 들어 생성자의 출력을 4 × 4에서 8 × 8로 크게하려면(그림 17-19) 기존 합성곱 층(“합성곱 층 1”)에 (최근접 이웃 필터링을 사용한27) 업샘플링 층을 추가하여 8 × 8 크기 특성 맵을 출력합니다. 이 특성 맵이 새로운 합성곱 층(“합성곱 층 2”)으로 주입되고 다시 새로운 출력 합성곱 층으로 주입됩니다. “합성곱 층 1”의 훈련된 가중치를 잃지 않기 위해 ([그림 17-19]에 점선으로 표시된) 두 개의 새로운 합성곱 층을 점진적으로 페이드-인fade-in하고 원래 출력층을 페이드-아웃fade-out합니다. 이렇게 하기위해 새로운 출력(가중치 α)과 원래 출력(가중치 1 – α)의 가중치 합으로 최종 출력을 만듭니다. 비슷한 페이드-인fade-in/페이드-아웃fade-out 기법이 판별자에 새로운 합성곱 층을 추가할 때 사용됩니다(다운샘플링을 위해 평균 풀링 층이 뒤따릅니다). 모든 합성곱 층은 “same” 스트라이드 1을 사용하므로 입력의 높이와 너비를 보존합니다. 원래 합성곱 층도 마찬가지입니다. 따라서 (입력이 8 × 8이기 때문에) 8 × 8 출력을 만듭니다. 마지막으로 출력층의 커널 크기는 1입니다. 이를 사용해 입력을 필요한 컬러 채널 수 (일반적으로 3)로 투영합니다.”
  30. (p756) 위에서 3번째 줄에 “오차는 전이 (s, r, s’)가 매우 놀랍다는”를 오차는 전이 (s, a, s’)가 매우 놀랍다는”로 정정합니다.
  31. (p811) 주석 16번 끝에 다음 문장을 추가합니다. “텐서플로 2.4에서 GPU 메모리 사용량을 반환하는 tf.config.experimental.get_memory_usage() 함수가 추가되었습니다.”
  32. (p834) 첫 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 훈련 코드를 실행합니다.<주석>옮긴이_MultiWorkerMirroredStrategy는 텐서플로 2.4에서 experimental을 벗어나 안정 API가 됩니다.</주석>” 또한 마지막 문단, 마지막 문장 끝에 다음처럼 주석을 추가합니다. “… 생성자에 전달하세요.<주석>옮긴이_ 텐서플로 2.4에서 CollectiveCommunication 클래스의 이름이 CommunicationImplementation로 바뀝니다.</주석>
  33. (p835) 두 번째 문단 끝에 다음처럼 주석을 추가합니다. “… 전략과 동일합니다).<주석>옮긴이_TPUStrategy는 텐서플로 2.3에서 experimental을 벗어나 안정 API가 되었습니다.</주석>
  34. (p849) 7번 문제 답의 마지막 항목에서 “\textbf{A}는 \textbf{A}'의 오른쪽에서 m \times n 단위 행렬 \textbf{I}_m이 추가되고 … 채워진 행렬입니다.”를 “\textbf{A}는 \textbf{A}'의 오른쪽에서 -\textbf{I}_m이 추가되고 … 채워진 행렬입니다(\textbf{I}_m은 m \times n단위 행렬).”로 정정합니다. 또한 바로 아래 A 행렬의 첫 번째 행 [\textbf{A}' \;\; \textbf{I}_m]을 [\textbf{A}' \,\, -\textbf{I}_m]으로 정정합니다.
  35. (p857) 6번 문제 답에서 2번째, 3번째 항목에 “가중치 벡터“를 “가중치 행렬“로 정정합니다.
  36. (p889) [식 C-4]의 우변의 두 항의 순서를 다음과 같이 바꿉니다.
    \sum_{i=1}^m \alpha^{(i)} - \dfrac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha^{(i)} \alpha^{(j)} t^{(i)} t^{(j)} \textbf{x}^{(i)^T} \textbf{x}^{(j)}
    그리고 [식 C-4] 아래 “여기서 \alpha^{(i)} \ge 0 \;\;\; i=1,2,\cdots,m 일 때”를 “여기서 \alpha^{(i)} \ge 0 \;\;\; i=1,2,\cdots,m 이고 \sum_{i=1}^m \alpha^{(i)} t^{(i)}=0 일 때”로 정정합니다.
    [식 C-4] 다음 문장에서 “이 함수를 최소화하고 … \hat{\alpha}^{(i)} \ge 0 벡터 …”를 “이 함수를 최대화하고 … \hat{\alpha}^{(i)} \ge 0이고 \sum_{i=1}^m \hat{\alpha}^{(i)} t^{(i)}=0 벡터 …”로 정정합니다.
    또한 [식 C-5] 아래에 “여기에서 n_s는 서포트 벡터의 개수입니다” 문장을 추가합니다.
  37. (p917) 첫 번째 문장 끝에 다음처럼 주석을 추가합니다. “… 그래프를 살펴보겠습니다.<주석>옮긴이_이 부록의 코드는 12장의 주피터 노트북에 포함되어 있습니다.</주석>”

“핸즈온 머신러닝” 사이킷런 0.20 업데이트

사이킷런 0.20 버전에 맞추어 <핸즈온 머신러닝> 도서에 반영될 내용을 정리하였습니다. 깃허브 주피터 노트북에는 더 많은 내용이 반영되어 있습니다! 🙂

  • sklearn.preprocessing.Imputer 클래스는 사이킷런 0.22 버전에서 삭제될 예정입니다. 대신 0.20 버전에서 추가된 sklearn.impute.SimpleImputer 클래스로 변경합니다.
    • (p100) 두 번째 문단 시작 부분에 “사이킷런의 Imputer는 누락된 … 지정하여 Imputer의 객체를 생성합니다.”를 “사이킷런의 SimpleImputer는 누락된 … 지정하여 SimpleImputer의 객체를 생성합니다.”로 변경합니다. 첫 번째 코드 블럭에서
      from sklearn.preprocessing import Imputer
      imputer = Imputer(strategy=”median”)

      from sklearn.impute import SimpleImputer
      imputer = SimpleImputer(strategy=”median”)
      로 변경합니다.
    • (p101) 주석 34의 첫 문장에서 ‘(예를 들면 Imputer(strategy=”median”) )’를 ‘(예를 들면 SimpleImputer(strategy=”median”) )’로 변경합니다.
    • (p108, 109) 파이프라인 정의 코드에서 ‘Imputer(strategy=”median”)’을 ‘SimpleImputer(strategy=”median”)’로 변경합니다.
  • OneHotEncoder 클래스가 종전에는 훈련 데이터에 나타난 0~최댓값 사이 범위를 카테고리로 인식하여 원-핫 인코딩하지만 앞으로는 고유한 정수 값 또는 문자열을 원-핫 인코딩할 수 있습니다. 정수 특성과 문자열 특성이 함께 있는 경우에는 에러가 발생합니다. 경고 메세지를 피하고 고유한 값을 사용하는 방식을 선택하기 위해 categories 매개변수를 'auto'로 지정합니다.
    • (p103) 마지막 코드 블럭에서 encoder = OneHotEncoder()를 encoder = OneHotEncoder(categories='auto')로 변경합니다.
  • 0.22 버전에서 RandomForestClassifierRandomForestRegressor 모델의 n_estimators 기본값이 10에서 100으로 늘어납니다. 경고 메세지를 피하기 위해 명시적으로 트리 개수를 10으로 지정합니다.
    • (p114, p116) 코드 블럭에서 RandomForestRegressor()를 RandomForestRegressor(n_estimators=10)으로 변경합니다.
    • (p139, p244) 코드 블럭에서 RandomForestClassifier()를 RandomForestClassifier(n_estimators=10)으로 변경합니다.
  • 공개된 훈련 데이터를 다운로드 받는 fetch_mldata 함수가 mldata.org 사이트의 잦은 에러로 openml.org 를 사용하는 fetch_openml 함수로 변경되었습니다.
    • (p124) mnist = fetch_mldata('MNIST original')을 mnist = fetch_openml('mnist_784', version=1)로 변경합니다. openml.org의 MNIST 타깃 데이터는 문자열로 저장되어 있으므로 mnist.target = mnist.target.astype(np.int)와 같이 정수로 바꾸는 것이 좋습니다.
  • 사이킷런 0.22 버전에서 LogisticRegression 클래스의 solver 매개변수 기본값이 'liblinear'에서 'lbfgs'로 변경될 예정입니다. 경고 메세지를 피하고 출력 결과를 일관되게 유지하기 위하여 solver 매개변수를 'liblinear'로 설정합니다.
    • (p192, p244) LogisticRegression()을 LogisticRegression(solver='liblinear')로 변경합니다.
  • SVCSVR ​클래스의 gamma 매개변수 옵션에 'auto'외에 'scale'이 추가되었습니다. 'auto'는 1/n_features, 즉 특성 개수의 역수입니다. 'scale'은 1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 'auto'에서 'scale'로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 'scale'과 'auto'는 차이가 없습니다. 경고를 피하기 위해 명시적으로 'auto' 옵션을 지정합니다.
    • (p213) 맨 아래 코드 블럭에서 SVR(kernel="poly", degree=2, C=100, epsilon=0.1)SVR(kernel="poly", gamma='auto', degree=2, C=100, epsilon=0.1)로 변경합니다.
    • (p244) SVC()를 SVC(gamma='auto')로 변경합니다.
  • LinearSVC의 verbose 매개변수가 0이 아닐 때 max_iter 반복 횟수가 부족하면 경고 메세지가 출력됩니다. 사이킷런 0.20 버전부터는 verbose 매개변수에 상관없이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수 증가 경고가 나옵니다. 경고 메세지를 피하기 위해 max_iter 매개변수의 기본값을 1,000에서 2,000으로 증가시킵니다.
    • (p206) LinearSVC(C=10, loss="hinge")를 LinearSVC(C=10, loss="hinge", max_iter=2000)으로 변경합니다.

핸즈온 머신러닝’s 넘파이 튜토리얼

핸즈온 머신러닝 깃허브에 있는 부록 중 넘파이 튜토리얼을 번역하여 커밋하였습니다. 내용이 길어 생각보다 훨씬 오래 걸린 것 같습니다. 이 노트북을 막다운으로 변경하여 블로그의 핸즈온 머신러닝 1장, 2장 문서에도 포함했습니다. 재미있게 봐주세요! 🙂

핸즈온 머신러닝 주피터 노트북 업데이트 안내

핸즈온 머신러닝의 원서 주피터 노트북이 조금 업데이트되었습니다. 변경된 내용을 번역서의 깃허브에도 반영하였습니다. 다음은 변경된 상세 내용입니다.

  • 14_recurrent_neural_networks.ipynb
    • 레버(Reber) 문법 연습문제에서 my_reber_classifier의 경로를 변경하고 추정 확률을 퍼센트로 나타냅니다.
      with tf.Session() as sess:
      saver.restore(sess, "my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, y_proba_val[index][0]))

      을 다음으로 변경합니다.

      with tf.Session() as sess:
      saver.restore(sess, "./my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, 100 * y_proba_val[index][0]))
  • 02_end_to_end_machine_learning_project.ipynb
    • 사이킷런의 0.20 버전에 포함될 ColumnTransformer를 사용하면 책의 예제에서처럼 DataFrameSelectorFeatureUnion을 사용하지 않고 간단히 전체 파이프라인을 만들 수 있습니다. 아직 사이킷런 0.20 버전이 릴리스되기 전이므로 여기서는 future_encoders.pyColumnTransformer를 넣어 놓고 사용합니다.
      from future_encoders import ColumnTransformer
      
      num_attribs = list(housing_num)
      cat_attribs = ["ocean_proximity"]
      
      full_pipeline = ColumnTransformer([
      ("num", num_pipeline, num_attribs),
      ("cat", OneHotEncoder(), cat_attribs),
      ])
      
      housing_prepared = full_pipeline.fit_transform(housing)
      housing_prepared
  • 11_deep_learning.ipynb
    • 텐서플로 모델 재사용하기에서 노드 이름 수정
      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden4/Relu:0")

      을 다음으로 변경합니다.

      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden3/Relu:0")
  • 11_deep_learning_exercises.ipynb
    • 불필요한 변수 초기화 루틴 삭제
      for var in output_layer_vars: 
          var.initializer.run()
  • extra_tensorflow_reproducibility.ipynb 파일 추가

감사합니다! 🙂

“핸즈온 머신러닝” 주피터 노트북 업데이트 안내

핸즈온 머신러닝“의 3장, 11장 주피터 노트북이 조금 업데이트되었습니다.

  • 3장: 연습문제 3번의 답에 서포트 벡터 머신과 랜덤 포레스트의 결과를 박스 플롯(boxplot)으로 비교하는 셀이 추가되었습니다. 다음 스샷을 참고해 주세요.

  • 11장: SELU 활성화 함수에 대한 설명이 보강되었습니다. 다음 스샷을 참고해 주세요.


감사합니다! 🙂