[개정판] 파이썬 라이브러리를 활용한 머신러닝

x9791162241646

★★★★★ 검증된 내용, 훌륭한 번역자, 그리고 좋은 편집(hawkm*** 님)
★★★★ 개정판은 인기없는 책은 나올 이유가 없다(ghcjs*** 님)
♥♥♥♥ 올 컬러로 깔끔한 해설(bi**cle2 님)

‘[개정판] 파이썬 라이브러리를 활용한 머신러닝’은 scikit-learn의 코어 개발자이자 배포 관리자인 안드레아스 뮐러Andreas Mueller와 매쉬어블의 데이터 과학자인 세라 가이도Sarah Guido가 쓴 ‘Introduction to Machine Learning with Python‘ 번역서입니다.

사이킷런의 최신 버전에 맞추어 저자들이 새롭게 릴리스한 4판을 기준으로 개정판이 출간되었습니다. 주요한 변경 사항은 다음과 같습니다.

  • OneHotEncoder와 ColumnTransformer, make_column_transformer
  • KBinsDiscretizer
  • cross_validate
  • Pipeline 캐싱
  • 그외 사이킷런 0.19, 0.20에서 추가, 변경된 내용 반영
  • (한국어판 부록) 배깅, 엑스트라 트리, 에이다부스트
  • (한국어판 부록) QuantileTransformer와 PowerTransformer
  • (한국어판 부록) 반복 교차 검증

특별히 개정판에서는 그래프를 손쉽게 구분할 수 있도록 풀 컬러 인쇄를 하였습니다! 흔쾌히 컬러 인쇄를 결정해 주신 한빛미디어 출판사에 감사드립니다.

  • 온라인/오프라인 서점에서 판매중입니다. [YES24], [교보문고], [한빛미디어]
  • 480 페이지, 종이책: 32,000원—>28,800원, 전자책 25,600원
  • 이 책에 실린 코드는 깃허브에서 주피터 노트북으로 볼 수 있습니다. [github], [nbviewer]
  • 이 책의 코드는 scikit-learn 0.20.2, 0.21.1, 0.22, 0.23.1 버전에서 테스트 되었습니다.
  • 저자 안드레아스 뮐러와의 인터뷰는 한빛미디어 홈페이지에서 볼 수 있습니다.
  • 1판의 1장과 2장을 ‘파이썬 머신러닝‘ 페이지에서 읽을 수 있습니다.
  • 교보문고 Dev READIT 2018에 선택되어 이 책에 대한 칼럼을 썼습니다.

이 페이지에서 책의 에러타와 scikit-learn 버전 변경에 따른 바뀐 점들을 계속 업데이트 하겠습니다. 구글 그룹스 파이썬 머신러닝 메일링 리스트에 가입하시면 책의 에러타나 수정사항을 자동으로 수신할 수 있습니다.

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

적바림(미처 책에 넣지 못한 내용을 추가하고 있습니다)

감사합니다! 🙂


Outputs (aka. errata)

  • ~29: 2쇄에 반영되었습니다.
  • ~31: 3쇄에 반영되었습니다.
  • ~43: 4쇄에 반영되었습니다.
  1. (p104) 그림 2-24와 2-25가 잘못 되었습니다. 다음 그림으로 바꾸어야 합니다.(현*웅 님)
    2-24

    그림 2-24

    2-25

    그림 2-25

  2. (p124) 아래에서 두 번째 줄의 주석 번호를 48에서 51로 바꿉니다.(현*웅 님)
  3. (p36) Note 박스의 첫 번째 줄 끝에서 ‘ 라이브러리’를 ‘다섯 라이브러리’로 정정합니다.(현*웅 님)
  4. (p156) 마지막 줄 끝의 주석 번호를 64에서 68로 바꿉니다.(현*웅 님)
  5. (p161) NOTE 박스 끝의 주석 번호를 78에서 79로 바꿉니다.(현*웅 님)
  6. (p345) CAUTION 박스 끝의 주석 번호를 11에서 12로 바꿉니다.(현*웅 님)
  7. (p375) 마지막 줄의 주석 번호를 33에서 34로 바꿉니다.(현*웅 님)
  8. (p425) 페이지 중간에 있는 주석 번호를 12에서 14로 바꿉니다.(현*웅 님)
  9. (p447) 마지막 줄에 “컴퓨터에 장착된 CPU 코어를 최대한 활용하기 위해 n_jobs=-1로 지정했습니다”를 “Mecab은 Pickle 오류가 발생하기 때문에 n_jobs=1로 지정했습니다”로 정정합니다.(현*웅 님)
  10. (p108) 주석 40에서 “graphviz 모듈은 pip install graphviz 명령으로”를 “graphviz 모듈은 conda install graphviz 또는 pip install graphviz 명령으로”로 수정합니다.(현*웅 님)
  11. (p281) Out [12]의 출력을 다음과 같이 변경합니다.
    [[1. 0. 0. 0. 1. 0.]
    [0. 1. 0. 0. 0. 1.]
    [0. 0. 1. 0. 1. 0.]
    [0. 1. 0. 1. 0. 0.]]
  12. (p71) 주석 6번의 R^2 공식에서 두 번째 항의 분자가 \sum (y-y)^2이 아니고 \sum (y-\hat{y})^2입니다.(서* 님)
  13. (p86) 주석 20번의 두 번째 줄에서 “로스틱 회귀”를 “로스틱”로 정정합니다.(서* 님)
  14. (p103~104) 103 페이지 마지막 문단과 104 페이지 첫 문단에서 0.05960.06으로 정정합니다.(서* 님)
  15. (p157) In[104]의 두 번째 print 함수에서 “훈련 세트 정확도”를 “테스트 세트 정확도”로 정정합니다.(서* 님)
  16. (p291) 첫 번째 줄에서 “학습된 기울기는 음수이고”를 “학습된 기울기는 양수이고”로 정정합니다.(서* 님)
  17. (p295) 마지막 줄에서 “아무런 변환도 거치 않은”을 “아무런 변환도 거치 않은”으로 정정합니다.(서* 님)
  18. (p303) 주석 24번에서 “정보 누설에 대한 자세한 내용은 376쪽”을 “정보 누설에 대한 자세한 내용은 398쪽”으로 정정합니다.(서* 님)
  19. (p123) Out[75]의 두 번째 줄에서 “훈련 세트 정확도”를 “테스트 세트 정확도”로 정정합니다.
  20. (p328) 주석 3번에서 “cross_val_predct(logreg, iris.data, iris.target, cv=5)”를 “cross_val_predict(logreg, iris.data, iris.target, cv=5)”로 정정합니다.(서* 님)
  21. (p344) 페이지 중간에 “In[22] 코드의 결과와 대등합니다”를 “In[24] 코드의 결과와 대등합니다”로 정정합니다.(서* 님)
  22. (p368) 맨 위 세 번째 줄에서 “f_1-점수가 0.14이지만, … ‘9아님’ 클래스는 각각 0.90과 0.99라서”를 “f_1-점수가 0.12이지만, … ‘9아님’ 클래스는 각각 0.89과 0.99라서”로 정정합니다.(서* 님)
  23. (p371) 첫 번째 문단 마지막에 제시된 “https://goo.gl/RaDS8Z“를 “https://bit.ly/2IfMILV“로 바꿉니다.(서* 님)
  24. (p387) In[75]와 In[76] 코드에서 “roc_auc_score(y_test, grid.decision_function(X_test))”를 “average_precision_score(y_test, grid.decision_function(X_test))”로 정정합니다. In[76] 코드에서 GridSearchCV의 scoring 매개변수 값을 “roc_auc”에서 “average_precision“으로 정정합니다. 또한 Out[76]에서 “테스트 세트 AUC: 1.000“을 “테스트 세트 평균 정밀도: 0.996“으로, “테스트 세트 정확도: 1.000“을 “테스트 세트 정확도: 0.890“으로 정정합니다.(서* 님)
  25. (p397, p399) 397페이지 첫 번째 문단과 399페이지 주석 7번에서 “검증 폴더“를 “검증 폴드“로 정정합니다.(서* 님)
  26. (p427) 주석 15번에서 “Out[22]의 출력 결과가”를 “Out[23]의 출력 결과가”로 정정합니다.(서* 님)
  27. (p444) 첫 번째 문단 마지막 부분에서 “keep_default_na=True로 지정하여”를 “keep_default_na=False로 지정하여”로 정정합니다.(서* 님)
  28. (p441) In[45] 코드를 다음과 같이 수정합니다.
    # 요구사항: spacy에서 표제어 추출 기능과 CountVectorizer의 토큰 분할기를 사용합니다.
    
    # spacy의 언어 모델을 로드합니다
    en_nlp = spacy.load('en', disable=['parser', 'ner'])
    
    # spacy 문서 처리 파이프라인을 사용해 자작 토큰 분할기를 만듭니다
    # (우리만의 토큰 분할기를 사용합니다)
    def custom_tokenizer(document):
        doc_spacy = en_nlp(document)
        return [token.lemma_ for token in doc_spacy]
    
    # 자작 토큰 분할기를 사용해 CountVectorizer 객체를 만듭니다
    lemma_vect = CountVectorizer(tokenizer=custom_tokenizer, min_df=5)
  29. (p366, 367, 369, 370, 384) 사이킷런 0.21 버전에서 classification_report 함수의 labels 매개변수가 지정되지 않거나 labels 매개변수로 전달된 클래스 레이블이 타깃값에 모두 포함되어 있다면 micro avg 대신에 같은 의미인 accuracy가 출력됩니다. 따라서 classification_report 함수 출력에서 “micro avg    aa, bb, cc, dd“를 “accuracy    cc, dd“로 바꾸어 주세요.
  30. (p30) scipy.misc.imread 함수가 scipy 1.3.0 버전에서 삭제되었습니다. 대신 imageio.imread 함수를 사용하기 위해 imageio를 설치해야 합니다. pip 명령 맨 뒤에 imageio를 추가해 주세요.
    $ pip install numpy scipy matplotlib ipython scikit-learn pandas pillow imageio
    
  31. (p92) 사이킷런 0.22버전부터 LogisticRegression 클래스의 solver의 기본값이 lbfgs로 바뀌었습니다. 이 알고리즘은 L1 규제를 지원하지 않기 때문에 LogisticRegression 클래스에 L1 규제를 적용하려면 다른 solver를 지정해야 합니다. 따라서 In[47] 코드에서 LogisticRegression 클래스 매개변수에 solver='liblinear'를 추가합니다.
  32. 모델을 훈련할 때 반복 횟수를 늘리라는 경고가 출력되는 것을 막기 위해 max_iter 매개변수 값을 늘립니다.
    1. p87의 In[41], p137의 In[80]: LinearSVCmax_iter=5000 매개변수 추가
    2. p135의 In[78]: LinearSVCmax_iter=5000, tol=1e-3 매개변수 추가
    3. p89의 In[43], p90의 In[44]와 In[45], p306의 In[51], p308의 In[55], p310의 In[57], p424의 In[18], p426의 In[22], p428의 In[25], p430의 In[29], p436의 In[39], p442의 In[47]: LogisticRegression에 max_iter=5000 매개변수 추가
    4. p92의 In[47], p278의 In[8], p284의 In[17], p325의 In[5], p336의 In[2], p360의 In[46], p404의 In[23], p424의 In[17]: LogisticRegression에 max_iter=1000 매개변수 추가
    5. p151의 In[95], p152의 In[97], p153의 In[98]: MLPClassifiermax_iter=1000 매개변수 추가
    6. p215의 In[38], p218의 In[42], p234의 In[59]: NMFmax_iter=1000, tol=1e-2 매개변수 추가
  33. 사이키런 0.21 버전에서 사분위수보다 샘플 개수가 작을 때 적절히 처리하지 못하는 버그가 수정되었습니다. 샘플 개수가 1,000개보다 작을 때 경고 메시지를 출력하지 않기 위해 QuantileTransformer 클래스에 n_quantiles 매개변수를 지정합니다.
    1. p183의 In[4], p185의 In[9], p186의 In[10]: QuantileTransformern_quantiles=50 매개변수 추가
    2. p185의 In[8]: QuantileTransformern_quantiles=5 매개변수 추가
  34. (p360) 사이킷런 0.24 버전에서 DummyClassifierstrategy 매개변수 기본값이 stratified에서 prior로 변경된다는 경고를 피하기 위해 strategy='stratified' 매개변수를 추가합니다.
  35. (p388) metrics.scorer 모듈이 사이킷런 0.24 버전에서 삭제됩니다. 맨 위 첫 줄의 “metrics.scorer 모듈의 SCORERS 딕셔너리를 봐도 됩니다” 문장과 In[77], Out[77]을 삭제합니다.
  36. (p41) In[15] 바로 위 문장 끝에 다음 주석을 추가합니다. “옮긴이_ 사이킷런 0.23 버전부터 dataset 모듈의 함수에서 as_frame=True와 같이 지정하면 데이터프레임으로 반환됩니다.”
  37. (p108) 41번 주석을 다음과 같이 변경합니다.
    옮긴이_ graphviz 모듈은 conda install graphviz 또는 pip install graphviz 명령으로 설치할 수 있습니다. 주피터 노트북이 아닐 경우 graphviz.Source의 결과를 변수로 저장하여 pdf, png 등의 파일로 저장할 수 있습니다.

    dot=graphviz.Source(dot_graph)
    dot.format='png'
    dot.render(filename='tree.png')

    사이킷런 0.21 버전에서 추가된 plot_tree() 함수를 사용하면 .dot 파일을 만들지 않고 바로 트리를 그릴 수 있습니다. 이 함수는 export_graphviz() 함수에서 사용한 class_names, feature_names, impurity, filled 매개변수를 모두 지원합니다.

  38. (p125) 주석 52번을 다음과 같이 변경합니다. “옮긴이_ xgboost(https://xgboost.readthedocs.io/)는 대용량 분산 처리를 위한 그레이디언트 부스팅 오픈 소스 라이브러리로 C++, 파이썬, R, 자바 등 여러 인터페이스를 지원합니다. 히스토그램 기반 부스팅 알고리즘을 사용하는 또 다른 인기 라이브러리는 마이크로소프트에서 만든 LightGBM(https://lightgbm.readthedocs.io/)입니다. 사이킷런 0.21 버전에서도 이와 비슷한 HistGradientBoostingClassifierHistGradientBoostingRegressor 클래스가 추가되었습니다.”
  39. (p193) Out[13] 바로 아래 첫 번째 문장 끝에 다음 주석을 추가합니다. “옮긴이_ 중요한 전처리 작업 중 하나는 누락된 값의 처리입니다. 사이킷런에서는 특성의 평균이나 최빈값으로 대체하는 SimpleImputer 클래스(0.20 버전에서 추가)와 최근접 이웃 방식으로 대체하는 KNNImputer 클래스(0.22 버전에서 추가) 등을 제공합니다.”
  40. (p372) 첫 번째 문장 끝에 다음 주석을 추가합니다.
    옮긴이_ 사이킷런 0.22 버전에서 정밀도-재현율 곡선을 그려주는 함수가 추가되었습니다. 예를 들어 다음 코드는 In [61]에 있는 svc 추정기를 사용해 [그림 5-13]과 유사한 그래프를 그립니다.

    from sklearn.metrics import plot_precision_recall_curve
    plot_precision_recall_curve(svc, X_test, y_test)
    plt.show()
  41. (p377) 첫 번째 문장 끝에 다음 주석을 추가합니다.
    옮긴이_ 사이킷런 0.22 버전에서 ROC 곡선을 그려주는 함수가 추가되었습니다. 예를 들면 다음과 같이 사용합니다.

    from sklearn.metrics import plot_roc_curve
    plot_roc_curve(svc, X_test, y_test)
    plt.show()
  42. (p382) In[70] 바로 위 문장 끝에 다음 주석을 추가합니다.
    옮긴이_ 사이킷런 0.22 버전에서 오차 행렬을 그래프로 그려주는 함수가 추가되었습니다. 예를 들면 다음과 같이 사용합니다.

    from sklearn.metrics import plot_confusion_matrix
    plot_confusion_matrix(lr, X_test, y_test)
    plt.show()
  43. (p401) 11번 주석 끝에 다음 내용을 추가합니다.
    사이킷런 0.23 버전에서는 추정기 객체를 주피터 노트북에서 시각화해주는 기능이 추가되었습니다. 특히 이 기능은 파이프라인 구조를 잘 요약해주기 때문에 유용합니다. 예를 들어 다음 코드는 [그림 6-3]의 pipe 객체의 구조를 출력합니다.

    from sklearn import set_config
    set_config(display='diagram')
    pipe
  44. (4쇄 p108) 주석 41에서 dot=graphviz.Source(dot_graph); dot.format='png'; dot.render(filename='tree.png'). 라인을 삭제합니다.
  45. (p346) 주석 14번에 “Out[32]에서는”을 “Out[34]에서는”으로 정정합니다.(정*균 님)
  46. (p378) 코드 블럭 아래에서 3번째 줄에 tpr[close_default_rf]tpr_rf[close_default_rf]로 정정합니다.(정*균 님)

Your Inputs

답글 남기기

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

WordPress.com 로고

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

Google photo

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

Twitter 사진

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

Facebook 사진

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

%s에 연결하는 중

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