파이썬 라이브러리를 활용한 머신러닝

b6119391002_l

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

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

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

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

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

감사합니다! 🙂


Outputs (aka. errata)

  • 3쇄 반영 : 5번까지
  • 4쇄 반영 : 33번까지
  • 5쇄 반영: 41번까지
  • 6쇄 반영: 44번까지
  • 7쇄 반영: 46번까지
    1. scikit-learn 0.19 버전으로 인해 변경된 사항
      • p209: TSNE 버그 수정으로 그림 3-22가 변경되었습니다(좌: 변경전, 우: 변경후). 클래스 구분히 훨씬 잘 되는 것을 확인할 수 있습니다.
      • p213: KMeans의 클러스터 레이블 할당이 무작위이기 때문에 Out[52], Out[53]과 그 이후 이미지의 클러스터 레이블이 바뀔 수 있습니다.
      • p220, p221: KMeans 버그 수정으로 인해 그림 3-30의 클러스터 중심과 그림 3-31의 재구성 이미지가 달라졌습니다(좌: 변경전, 우: 변경후).
      • p242: DBSCAN 버그 수정으로 인해 In[79]의 클러스터 크기가 조금 달라졌습니다.
        eps=9일 때 [1308 749 3 3] 에서 [1307 750 3 3] 로,
        eps=11일 때 [ 415 1648] 에서 [ 413 1650] 로 바뀝니다.
      • p245: KMeans 버그 수정으로 인해 Out[81]의 클러스터 크기가 [133 353 232 144 185 136 292 249 211 128] 에서 [155 175 238 75 358 257 91 219 323 172] 로 달라졌습니다.
      • p246, p247: KMeans 버그 수정으로 인해 그림 3-43, 그림 3-44의 이미지가 달라졌습니다(좌: 변경전, 우: 변경후). 클러스터 중심에서 가깝고 먼 이미지가 보다 잘 구분되는 것을 확인할 수 있습니다.
      • p248: Out[85]의 ARI 점수가 0.07에서 0.09로 달라졌습니다.
      • p314: Out[16]의 교차 검증 점수가 [ 0.933 0.96 0.92 0.96 0.947 0.907 0.88 0.933 0.92 0.933] 에서 [ 0.867 0.907 0.973 0.973 0.893 0.96 0.987 0.893 0.933 0.973] 로 바뀌었습니다.
      • p325: Out[31]에서 “decision_function_shape=None” –> “decision_function_shape=’ovr'” 로 변경되었습니다.
      • p340: Out[44]의 dummy 점수가 0.80으로 바뀌었습니다.
        “하지만 더미 분류기조차도 77%를 맞혔습니다” –> “하지만 더미 분류기조차도 80%를 맞혔습니다” 로 수정합니다.
      • p342: Out[48]에서 무작위 더미 모델의 오차 행렬이 [[360 43] [43 4]] 에서 [[360 43] [40 7]] 로 바뀌었습니다.
      • p345: Out[49]에서 무작위 더미 모델의 f1 score가 0.14로 변경되었습니다.
      • p346: Out[51]에서 ‘9 아님’의 precision, f1-score이 0.90으로, ‘9’의 precision, f1-score가 0.14로, ‘avg / total’은 모두 0.82로 변경되었습니다.
      • p347: Out[52] 아래 문단에서 “‘9’ 클래스의 f_1-점수가 0.10이지만 (로지스틱 회귀는 0.89), ‘9 아님’ 클래스는 각각 0.91과 0.99라서 양쪽 모두 수긍할 만한 결과입니다.” –> “‘9’ 클래스의 f_1-점수가 0.14이지만 (로지스틱 회귀는 0.89), ‘9 아님’ 클래스는 각각 0.90과 0.99라서 양쪽 모두 수긍할 만한 결과입니다.” 로 변경합니다.
      • p355: Out[62]에서 랜덤 포레스트와 svc의 평균 정밀도가 각각 0.660, 0.666으로 변경되었습니다. 바로 아래 문장에서 “랜덤 포레스트가 조금 낫지만, SVC와 거의 같은 성능입니다” –> “랜덤 포레스트가 조금 지만, SVC와 거의 같은 성능입니다” 로 변경합니다.
      • p366: Out[74]의 가능한 평가 방식이 다음과 같이 많이 늘어 났습니다.
        [‘accuracy’, ‘adjusted_mutual_info_score’, ‘adjusted_rand_score’, ‘average_precision’, ‘completeness_score’, ‘explained_variance’, ‘f1’, ‘f1_macro’, ‘f1_micro’, ‘f1_samples’, ‘f1_weighted’, ‘fowlkes_mallows_score’, ‘homogeneity_score’, ‘log_loss’, ‘mean_absolute_error’, ‘mean_squared_error’, ‘median_absolute_error’, ‘mutual_info_score’, ‘neg_log_loss’, ‘neg_mean_absolute_error’, ‘neg_mean_squared_error’, ‘neg_mean_squared_log_error’, ‘neg_median_absolute_error’, ‘normalized_mutual_info_score’, ‘precision’, ‘precision_macro’, ‘precision_micro’, ‘precision_samples’, ‘precision_weighted’, ‘r2’, ‘recall’, ‘recall_macro’, ‘recall_micro’, ‘recall_samples’, ‘recall_weighted’, ‘roc_auc’, ‘v_measure_score’]
      • p380: Out[20]에서 “decision_function_shape=None” –> “decision_function_shape=’ovr'” 로 변경되었습니다.
      • p382: Out[26]에서 Pipeline 캐싱 옵션인 memory 매개변수가 추가되었습니다.
        “Pipeline(step=[(‘standardscaler’…” –> “Pipeline(memory=None, steps=[(‘standardscaler’…”
      • p405: Out[22]의 불용어 리스트의 순서에 따라 출력 결과가 달라질 수 있습니다.
      • p427, p428: In[48], In[52]의 LatentDirichletAllocation의 n_topics 매개변수가 0.19버전에서 n_components로 바뀌었습니다.
    2. (p315) 첫 문장 “GroupKFold를 사용할 수 있습니다.” 끝에 주석 “옮긴이_ cross_val_score 함수로 넘겨진 groups 매개변수는 함수 내부에서 cv.splits() 메소드를 호출할 때 groups를 매개변수로 전달합니다.”을 추가합니다.
    3. (p323) 마지막 문단의 중간에 “이 절의 서두에 있는 In[23] 코드의 결과와 대등합니다.”를 “이 절의 서두에 있는 In[22] 코드의 결과와 대등합니다.”로 고칩니다.
    4. (p333) “param_grid의 매개변수 조합은 42개입니다. 이때 만들어지는 모델은 총 42 x 5 x 5 = 1,050개나 되므로..” 를 “param_grid의 매개변수 조합은 36개입니다. 이때 만들어지는 모델은 총 36 x 5 x 5 = 900개나 되므로..” 로 변경합니다. (원서의 2판에서 1판의 오류가 정정되었으므로 원서에 맞게 매개변수 조합을 36개로 고칩니다)
    5. (p343) 정확도의 공식에서 분모의 덧셈 항목 중 EP를 FP로 수정합니다.
    6. (p392) 첫 문단의 “5장에서 본 것처럼 문자열 특성은…”을 “4장에서 본 것처럼 문자열 특성은…”으로 수정합니다.
    7. (p152~153) ‘MLP를 사용할 때는 ‘adam’과 ‘lbfgs’를 추천합니다.<주석>옮긴이_ 최근에 나온 “The Marginal Value of Adaptive Gradient Methods in Machine Learning”, A. C. Wilson et al. (2017, https://goo.gl/NAkWIa) 논문에서 적응적인 최적화 방법인 Adam, RMSProp, AdaGrad가 일부 데이터셋에서 좋지 않은 성능을 내었습니다. 따라서 무조건 Adam 알고리즘을 기본으로 고정하지 말고 ‘sgd’+모멘텀 방식을 함께 테스트해 보는 것이 좋습니다.</주석>
    8. (p153) 주석 73번에서 ‘이럴 경우에는 fit 메서드 대신에’를 ‘전체 데이터를 메모리에 모두 적재할 수 없을 때에는 fit 메서드 대신에’로 변경합니다.
    9. (p35) mglearn 라이브러리를 임포트하면 문제가 없지만 조금 더 명확한 설명을 위해 In[7]에 ‘from IPython.display import display’를 맨 앞에 추가합니다.
    10. (p323, p330) In[26]과 In[36]의 GridSearchCV()의 객체를 생성할 때, 0.21버전에서 return_train_score의 기본값이 True에서 False로 변경될 것이란 경고를 제거하기 위해 명시적으로 return_train_score=True를 추가합니다.
    11. (p176) “단축메서드와 효율적인 방법” 박스의 마지막 문장에 주석 추가. “옮긴이_ 테스트 세트에 fit_transform()을 적용하면 훈련 세트에서 학습한 내용이 모두 지워집니다. 따라서 테스트 세트에는 반드시 transform() 메서드를 사용해야 합니다.”
    12. (p98) 29번 주석 끝에 다음 문장을 추가합니다. “scikit-learn 0.19 버전에서 sag의 성능을 향상시킨 saga 알고리즘이 추가되었습니다. 자세한 내용은 옮긴이의 블로그(https://goo.gl/TLyqdo)를 참고하세요.”
    13. (p386) 6.6절 바로 위 문장 끝에 주석 추가. “옮긴이_ 탐색해야할 매개변수 조합이 많을 경우 scikit-learn 0.19버전에서 추가된 파이프라인 캐싱 기능을 사용하면 그리드서치 속도를 향상시킬 수 있습니다. 자세한 내용은 옮긴이의 블로그(https://goo.gl/EnX5aj)를 참고하세요.”
    14. (p316) 5.2절 바로 위 문장 끝에 주석 추가. “옮긴이_ scikit-learn 0.19 버전에 교차 검증을 반복하여 실행할 수 있는 RepeatedKFold와 RepeatedStratifiedKFold가 추가되었습니다. 자세한 내용은 옮긴이의 블로그(https://goo.gl/Cx8RSr)를 참고하세요.”
    15. (p285) 4.5.1절 바로 위 문장 끝에 주석 추가. “옮긴이_ 이렇게 하는 이유는 테스트 세트의 정보가 누설되는 것을 막기 위해서 입니다. 정보 누설에 대한 자세한 내용은 6장 ‘정보 누설에 대한 예시’ 사이드 노트를 참고하세요.”
    16. (p300) 그림 4-17 밑의 문단에서 정확한 의미 전달을 위해 “요일에 대해 하나의 계수를 학습하고, 시간에 대해서도 하나의 계수를” 에서 “요일마다 하나의 계수를 학습하고, 시간마다도 하나의 계수를” 로 변경합니다.
    17. (p36) NOTE_ 바로 윗 문단 끝에 주석 추가. “옮긴이_ pip로 설치하는 mglearn 모듈은 번역서의 깃허브에 있는 것과 그래프 등이 조금 다릅니다. 번역서 깃허브에 있는 mglearn 패키지를 사용하려면 깃허브에서 클론(clone)하거나 다운로드받은 파일의 압축을 푼 폴더에서 IPython이나 주피터 노트북을 실행하고 import mglearn 을 하면 됩니다.”
    18. (p376) ‘정보 누설에 대한 예시’ 사이드 노트에 나온 예제는 회귀 문제이므로 “교차 검증 정확도“라고 표현된 곳을 모두 “교차 검증 점수“로 변경합니다.
    19. (p395) 두 번째 줄에서 ‘인덱스가 1인‘을 ‘인덱스가 6인‘으로 정정합니다.
    20. (p410) 두 번째 문단에서 “가장 큰 계수 25개와 가장 작은 계수 25개를“을 “가장 큰 계수 40개와 가장 작은 계수 40개를“로 정정합니다.
    21. (p386) 6.6절 아래 문단 4번째 줄에서 ‘iris 데이터셋에서‘를 ‘cancer 데이터셋에서‘로 정정합니다.
    22. (p125) ‘장단점과 매개변수’ 바로 아래 문단에서 “이진 특성이 연속적인 특성에서도“를 “이진 특성이나 연속적인 특성에서도“로 정정합니다.
    23. (p38) 12번 주석에서 “번역 시점에 scikit-learn의 최신 버전은 0.18.1입니다. 번역서의 깃허브 저장소에 있는 소스 코드는 0.18.1 버전에 맞춰 테스트했습니다“를 “초판 번역 시점에 scikit-learn의 최신 버전은 0.18.1이었지만, 번역서의 깃허브 저장소에 있는 소스 코드는 최신 버전에 맞춰 테스트했습니다. 버전 변경으로 달라진 부분은 역자 블로그(https://goo.gl/FYjbK3)의 Outputs 절을 참고하세요“로 정정합니다.
    24. (p103) 두 번째 줄에서 “클래스에 데이터 포인트가 75개씩 있고”를 “클래스에 데이터 포인트가 50개씩 있고”로 정정합니다.
    25. (p104) 첫 번째 줄에서 “노드는 클래스 0에 속한 포인트 75개와 클래스 1에 속한 포인트 75개를 모두 포함한”을 “노드는 클래스 0에 속한 포인트 50개와 클래스 1에 속한 포인트 50개를 모두 포함한”으로 정정합니다.
    26. (p106) 다섯 번째, 여섯 번째 줄에서 “클래스 1로 결정된 영역이 클래스 0에 속한 포인트들로”를 “클래스 0으로 결정된 영역이 클래스 1에 속한 포인트들로”로 정정합니다.
    27. (p135) 53번 주석 끝에 “데이터셋에 따라 StandardScaler도 사용할 수 있습니다.” 추가.
    28. (p152) 신경망의 가중치 개수를 계산할 때 편향을 고려하지 않았습니다. 편향을 고려한 값으로 바꾸면
      • 100 * 100 = 10,000“는 “편향을 포함하여 100 * 100 + 100 = 10,100“로
      • 100 * 1 = 100“은 “100 * 1 + 1 = 101“로
      • 10,100“은 “10,201“로
      • 100 * 100 = 10,000“는 “100 * 100 + 100 = 10,100“로
      • 20,100“은 “20,301“로
      • 100 * 1,000 = 100,000“은 “100 * 1,000 + 1,000 = 101,000“으로
      • 101,000“은 “102,001“로
      • 1,000 * 1,000 = 1,000,000“은 “1,000 * 1,000 + 1,000 = 1,001,000“으로
      • 1,101,000“은 “1,103,001“로
        바뀌어야 합니다.
    29. (p183) 맷플롯립 최신 버전에서 색상이 바뀌었으므로 세 번째 줄에서 “푸른색“은 “초록색“으로 “붉은색“은 “푸른색“으로 수정합니다.
    30. (p249) 아래에서 다섯 번째 줄에 “이는 모든 포인트를 클러스터로 모으려고 DBSCAN의 결과를 생각하면”을 “이는 모든 포인트를 클러스터로 모으려고 한 이전의 DBSCAN 결과를 생각하면”으로 수정합니다.
    31. (p365, p376) In[73]은 AUC를 사용하여 그리드 서치를 하므로 365페이지에 있는 마지막 문장 “print(“테스트 세트 AUC: ….)“을 삭제합니다. 366페이지에 있는 첫 번째 코드에서 “print(“테스트 세트 정확도: …)”를 “print(“테스트 세트 AUC: …)”로 변경합니다. Out[73]에서 “테스트 세트 AUC: 1.000“을 삭제하고 “테스트 세트 정확도: 1.000″을 “테스트 세트 AUC: 1.000″으로 수정합니다.
    32. (p43) 첫 번째 줄에서 iris[‘target_names’]를 iris_dataset[‘target_names’]로 정정합니다.
    33. (p124) 두 번째 줄에서 ‘그림 2-25’를 ‘그림 2-35’로 정정합니다.
    34. (p180) ‘PCA를 적용해 유방암 데이터셋 시각화하기’ 섹션 위 문단 첫 줄에서 ‘다시 평균을 더해서 반대로 회전시킵니다’를 좀 더 의미를 정확하게 하기 위해 ‘다시 평균을 더하고 반대로 회전시킵니다’로 변경합니다.
    35. (p202) 그림 3-17 아래 첫 줄에서 ‘성분 11에 대한 계수 값이 큰 얼굴들은’을 ‘성분 3에 대한 계수 값이 큰 얼굴들은’로 정정합니다.
    36. (p14) 페이지 중간에 잭나이프 회귀 모델에 대한 질문을 하신 분은 “최욱” 님이 아니고 “최욱” 님입니다. 실수로 이름이 잘 못 기재되어 죄송합니다.
    37. (p251) In[88] 코드의 for 문을 “for cluster in [10, 13, 19, 22, 36]:“에서 “for cluster in [13, 16, 23, 38, 39]:“로 정정합니다.(조*원 님)
    38. (p431) In[55] 코드의 두 번째 주석에서 “이 토픽의 비중이 가장 큰 문서 다섯 개를 출력합니다.”를 “이 토픽의 비중이 가장 큰 문서 개를 출력합니다.”로 수정합니다.
    39. (p417) 주석 26에서 “python -m spcay.en.download 명령으로 영어 모델을 내려받아야 합니다.”를 “python -m spacy download en 명령으로 영어 모델을 내려받아야 합니다. 윈도 환경이라면 관리자 권한으로 콘다(conda) 프롬프트를 실행해야 합니다.“으로 변경합니다.(5star181755905 님)
    40. (p118) 첫 번째 줄에서 “estimator_ 속성에”를 “estimators_ 속성에”로 정정합니다.
    41. (p418~420) spacy 패키지가 바뀌어 In[44]에 포함된 토큰 분할기 코드를 다음과 같이 변경합니다.(5star181755905 님)
      # spacy의 언어 모델을 로드하고 원본 토큰 분할기를 저장합니다
      en_nlp = spacy.load('en')
      old_tokenizer = en_nlp.tokenizer
      # 정규식을 사용한 토큰 분할기를 바꿉니다
      en_nlp.tokenizer = lambda string: old_tokenizer.tokens_from_list(
          regexp.findall(string))
      
      # spacy 문서 처리 파이프라인을 사용해 자작 토큰 분할기를 만듭니다
      # (우리만의 토큰 분할기를 사용합니다)
      def custom_tokenizer(document):
          doc_spacy = en_nlp(document, entity=False, parse=False)
          return [token.lemma_ for token in doc_spacy]

      # spacy의 언어 모델을 로드하고 원본 토큰 분할기를 저장합니다
      en_nlp = spacy.load('en')
      
      # spacy 문서 처리 파이프라인을 사용해 자작 토큰 분할기를 만듭니다
      # (우리만의 토큰 분할기를 사용합니다)
      def custom_tokenizer(document):
          from spacy.tokens import Doc
          doc = Doc(en_nlp.vocab, words=regexp.findall(document))
          return [token.lemma_ for token in doc]
      

      로 바꿉니다.

      변경된 코드에서 출력된 실행 결과도 함께 반영합니다. Out[45]의 X_train_lemma.shape: (25000, 21637)(25000, 20660)​으로 변경합니다. Out[45] 아래 본문에 “27,271개에서 21,637개로 줄여줍니다”를 “27,271개에서 20,660개로 줄여줍니다”로 변경합니다. Out[46]의 출력에서 “최상의 교차 검증 점수 (표제어): 0.731“를 “최상의 교차 검증 점수 (표제어): 0.729“로 변경합니다.

    42. 최신 라이브러리 반영
      • (p174) In[9] : matplotlib 3.0 버전에서는 scatter 함수에 색깔을 지정할 때 하나의 RGB 포맷 문자열이나 Colormap의 리스트를 지정해야 합니다. 경고를 피하기 위해 mglearn에서 만든 ListedColormap 객체의 colors 속성의 원소를 직접 선택하여 RGB 포맷 문자열을 지정합니다.
        • c=mglearn.cm2(0)c=mglearn.cm2.colors[0]으로 수정합니다(3곳).
        • c=mglearn.cm2(1)c=mglearn.cm2.colors[1]으로 수정합니다(3곳).
      •  (p421) In[5], In[6] : 판다스의 DataFrame을 넘파이 배열로 변환하는 as_matrix() 메서드는 삭제될 예정입니다. 대신 values 속성을 사용합니다.
        • df_train['document'].as_matrix()df_train['document'].values로 수정합니다(2곳).
        • df_train['label'].as_matrix()df_train['label'].values로 수정합니다(2곳).
      • (p422~423) : KoNLPy 0.4.5 버전부터 Twitter 클래스가 Okt 클래스로 바뀌었습니다. open-korean-text 프로젝트는 twitter-korean-text 프로젝트의 공식 포크입니다.
        • In[9] : Twitter 클래스를 Okt 클래스로 변경합니다. twitter_tag 변수명을 okt_tag로 변경합니다.
        • In[10] : twitter_tokenizer 함수명을 okt_tokenizer로 변경합니다. twitter_tag 변수명을 okt_tag로 변경합니다.
        • p422 밑에서 두 번째 줄에 twitter_tokenizer 함수명을 okt_tokenizer로 변경합니다.
        • In[11] : twit_param_grid 변수명을 okt_param_grid로 변경합니다(2곳). twit_pipe 변수명을 okt_pipe로 변경합니다(2곳). twit_grid 변수명을 okt_grid로 변경합니다(4곳). twitter_tokenizer 함수명을 okt_tokenizer로 변경합니다(1곳).
        • In[13] : X_test_konlpy 변수명을 X_test_okt로 변경합니다(2곳).
    43. (p394) In[3] 코드의 첫 번째 주석 끝에 다음 문장을 추가합니다. “윈도에서는 !tree data/aclImdb 와 같이 사용하세요.
    44. (p420) 트위터 한국어 처리기가 변경됨에 따라 페이지 마지막 문장에서 “KoNLPy 0.4.4는 5개의 형태소 분석기를 각각 하나의 태그 클래스로 지원합니다. 먼저 트위터에서 만든 한국어 처리기 twitter-korean-text (https://github.com/twitter/twitter-korean-text)를 사용해보겠습니다.”를 “KoNLPy는 5개의 형태소 분석기를 각각 하나의 태그 클래스로 지원합니다. 0.4.5 이상 버전을 기준으로, 트위터에서 만든 한국어 처리기 open-korean-text(https://github.com/open-korean-text/open-korean-text)를 사용해보겠습니다.”로 변경합니다.
    45. (p33) 주석 10번에서 “한편 CSR은 ‘Compressed Row Storage’의 약자로 행의 인덱스를 압축하여 저장합니다.”를 “한편 CSR은 ‘Compressed Sparse Row’의 약자로 행의 인덱스를 압축하여 저장합니다.”로 수정합니다.
    46. (p350) 실제 ROC 곡선의 설명은 다음 절에 나오기 때문에 소제목 ‘정밀도-재현율 곡선과 ROC 곡선‘을 ‘정밀도-재현율 곡선‘으로 변경합니다.
    47. (p86) 주석 20번의 두 번째 줄에서 “로스틱 회귀”를 “로스틱”로 정정합니다.(서* 님)
    48. (p277) 마지막 줄에서 “아무런 변환도 거치 않은”을 “아무런 변환도 거치 않은”으로 정정합니다.(서* 님)
    49. (p71) (5쇄 이후)주석 6번의 R^2 공식에서 두 번째 항의 분자가 \sum (y-y)^2이 아니고 \sum (y-\hat{y})^2입니다.(서* 님)
    50. (p123) In[75] 코드의 두 번째 print 함수에서 “훈련 세트 정확도”를 “테스트 세트 정확도”로 정정합니다. 마찬가지로 Out[75]의 두 번째 출력에서 “훈련 세트 정확도”를 “테스트 세트 정확도”로 정정합니다.
    51. (p328) 주석 1번에서 “cross_val_predct(logreg, iris.data, iris.target, cv=5)”를 “cross_val_predct(logreg, iris.data, iris.target, cv=5)”로 정정합니다.(서* 님)
    52. (p350) 첫 번째 문단 마지막에 제시된 “https://goo.gl/RaDS8Z“를 “https://bit.ly/2IfMILV“로 바꿉니다.(서* 님)
    53. (p375, p377) 375페이지 첫 번째 문단과 377페이지 주석 7번에서 “검증 폴더“를 “검증 폴드“로 정정합니다.(서* 님)
    54. (p421) 첫 번째 문단 마지막 부분에서 “keep_default_na=True로 지정하여”를 “keep_default_na=False로 지정하여”로 정정합니다.(서* 님)
    • scikit-learn 0.20에서 변경된 사항들
      • 사이킷런 0.19 버전 이하에서는 LinearSVCliblinear를 사용하는 LogisticRegressionverbose 매개변수가 0이 아니고 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수를 증가하라는 경고 메세지가 나옵니다. 사이킷런 0.20 버전부터는 verbose 매개변수에 상관없이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수 증가 경고가 나옵니다. 경고 메세지를 피하기 위해 max_iter 매개변수의 기본값을 증가시킵니다.
        • (p87) In[41], (p127) In[78], (p128) In[80]  : LinearSVC 클래스에 매개변수 max_iter=5000을 추가합니다.
        • (p92) In[47] : LogisticRegression 클래스에 매개변수 max_iter=10000을 추가합니다.
      • 향후 사이킷런 0.22 버전에서 LogisticRegression 클래스의 solver 매개변수 기본값이 liblinear에서 lbfgs로 변경될 예정입니다. 사이킷런 0.20 버전에서 solver 매개변수를 지정하지 않는 경우 이에 대한 경고 메세지를 출력합니다. 경고 메세지를 피하고 출력 결과를 일관되게 유지하기 위하여 solver 매개변수를 liblinear로 설정합니다.
        • (p87) In[41], (p89) In[43], (p90) In[45], (p92) In[47], (p162) In[122], (p264) In[8], (p288) In[42], (p290) In[46], (p292) In[48], (p305) In[3], (p307) In[5], (p340) In[44], (p361) In[67], (p382) In[23], (p402) In[16]/In[17], (p404) In[21], (p406) In[24], (p407) In[28], (p413) In[38], (p420) In[46], (p423) In[11], (p424) In[15] : LogisticRegression 클래스에 매개변수 solver='liblinear'를 추가합니다.
      • 사이킷런 0.20 버전에서 LogisticRegressionmulti_class 매개변수 옵션에 auto가 추가되었습니다. auto로 설정하면 이진 분류이거나 solverliblinear일 경우에는 ovr을 선택하고 그 외에는 multinomial을 선택합니다. 사이킷런 0.22 버전부터는 multi_class 매개변수의 기본값이 ovr에서 auto로 변경됩니다. 경고 메세지를 피하기 위해 명시적으로 ovr 옵션을 지정합니다.
        • (p162) In[122], (p305) In[3], (p307) In[5], (p361) In[67],  : LogisticRegression 클래스에 매개변수 multi_class='ovr'를 추가합니다.
      • 사이킷런 0.20 버전에서 SVC ​클래스의 gamma 매개변수 옵션에 auto외에 scale이 추가되었습니다. auto1/n_features, 즉 특성 개수의 역수입니다. scale1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 auto에서 scale로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 scaleauto는 차이가 없습니다. 경고를 피하기 위해 명시적으로 auto 옵션을 지정합니다.
        • (p134) In[84], (p136) In[88]/In[89], (p176) In[11], (p364) In[71], (p370) In[4], (p373) In[7] : SCV 클래스에 매개변수 gamma='auto'를 추가합니다.
      • 사이킷런 0.22 버전에서 OneHotEncoder 클래스가 데이터에서 정수 카테고리를 인식하는 방식이 변경될 예정입니다. 종전에는 훈련 데이터에 나타난 0~최댓값 사이 범위를 카테고리로 인식하여 원-핫 인코딩하지만 0.22 버전부터는 고유한 정수 값을 카테고리로 사용합니다. 후자의 경우 0~최댓값 사이의 정수라도 훈련 데이터에 없는 값을 변환하려면 에러가 발생합니다. 경고 메세지를 피하고 고유한 정수 값을 사용하는 방식을 선택하려면 categories 매개변수를 auto로 지정합니다.
        • (p269) In[15], (p300) In[59] : OneHotEncoder 클래스에 categories='auto' 매개변수를 추가합니다.
      • 사이킷런 0.22 버전에서 cross_val_score 함수와 GridSearchCV 클래스의 cv 매개변수 기본값이 3에서 5로 바뀔 예정입니다. 0.20 버전에서 cv 매개변수를 지정하지 않는 경우 이에 관한 경고 메세지가 출력됩니다. 경고 메세지를 피하기 위해 cv 매개변수 값을 명시적으로 3으로 지정합니다.
        • (p307) In[5], (p364) In[71] : cross_val_score 함수에 매개변수 cv=3을 추가합니다.
        • (p365) In[72], (p423) In[11], (p424) In[15] : GridSearchCV 클래스에 매개변수 cv=3을 추가합니다.
      • 사이킷런 0.22 버전부터는 GridSearchCVRandomizedSearchCViid 매개변수 기본값이 True에서 False로 바뀝니다. 0.24 버전에서는 이 매개변수가 아예 삭제될 예정입니다. iid 매개변수가 True이면 독립 동일 분포라고 가정하고 테스트 세트의 샘플 수로 폴드의 점수를 가중 평균합니다. False로 지정하면 단순한 폴드 점수의 평균입니다. False일 때 기본 교차 검증과 동작 방식이 같습니다. 사이킷런 0.20 버전에서 iid 매개변수가 기본값일 때 가중 평균과 단순 평균의 차이가 10^-4 이상이면 경고 메세지가 발생합니다. 경고 메세지를 피하기 위해 GridSearchCViid 매개변수를 True로 설정합니다.
        • (p323) In[26], (p328) In[34], (p330) In[36], (p384) In[31], (p386) In[35] : GridSearchCV 클래스에 매개변수 iid=True를 추가합니다.

Your Inputs

파이썬 라이브러리를 활용한 머신러닝”에 대한 42개의 생각

  1. Jaeyeon Baek

    이제 1장 예제들 따라가고 있는데, 어떤 이유인지 제 환경에서는 mglearn 을 인스톨 하고 진행해야 하더라고요. 1장 그림1-3 예제가 mglearn 이 있다는 가정에 진행되는 것인가요? (메시지 전송은 답글로 착각하고 전송했습니다)

    좋아요

    응답
    1. 로드홈 글의 글쓴이

      네 맞습니다. 예제 노트북이 있는 폴더에서 주피터 노트북을 실행하시면 서브 디렉토리에 있는 mglearn을 그대로 임포트하실 수 있습니다. 안드레아스 뮐러가 pypi에 있는 mglearn에 깃허브 코드의 수정 사항을 모두 포함시켰는 지 잘 모르겠어요. ^^

      좋아요

      응답
      1. Jaeyeon Baek

        아.. 타이핑하면서 해야 익혀지는 것 같아서 일부러 소스는 받지 않았거든요, `無`에서 진행하고 있었는데 참고해야겠군요. 감사합니다. 🙂

        Liked by 1명

      2. 안중호

        저 역시 같은 문제로 46페이지가 해결되지 않고 있습니다.
        pip install mglearn을 제대로 했는데도 역시 주피터 노트북에서는 mglearn에서 import error가 반복되고 있는데 해결방법은 없는지요?

        또한, 위에서 답변하신 “예제 노트북이 있는 폴더에서 주피터 노트북을 실행하면” 이라는 말이 무슨 의미이지 잘 모르겠습니다. 저는 여기에 제공된 코드를 긁어다 제꺼에 붙이면서 하나씩 실행해보고 있는데, 이 페이지 내에서 주피터 노트북을 실행하는 뭔가 다른 방법이 있는 것인지요?

        추가로 질문드리면, 여기 코드의 챕터 1 시작부분에 별다른 설명없이 제공된
        from preamble import *
        라는 코드는
        ModuleNotFoundError: No module named ‘preamble’
        의 에러를 발생시키고 있는데 제 수준에서는(구글링 몇시간째인데) 해결이 안되고 있습니다.

        감사합니다.

        좋아요

      3. 로드홈 글의 글쓴이

        안녕하세요. 문의 주셔서 감사합니다. pip install mglearn 했는데 import error가 난다면 설치에 사용한 pip와 노트북 실행에 사용한 python이 다른 버전(혹은 다른 배포판)이 아닌지 검토해 보시면 좋을 것 같습니다. 우분투나 맥OS라면 시스템에 기본으로 설치된 파이썬 버전과 혼돈을 일으키는지 확인해 보세요. virtualenv나 conda 환경을 만드셨다면 환경을 먼저 활성화 하고 mglearn 설치와 주피터 노트북을 실행하셔야 합니다.
        예제 노트북이 있는 깃허브를 클론하시면 mglearn 패키지를 설치하지 않으셔도 바로 사용할 수 있습니다. 이 때에는 클론한 디렉토리로 들어가서(윈도우즈 명령 프롬프트나 우분투 쉘) 주피터 노트북을 실행하면 되다는 의미입니다. 도움이 되셨는지 모르겠네요. 궁금한 점 있으시면 다시 코멘트 주세요. 감사합니다. ^^

        좋아요

      4. JaeUng Jason Hyun

        저도 안중호님과 비슷한 문제가 있는데요
        크롬이나 사파리에서 주피터 노트북을 실행하면 클론받은 폴더 안에 있는 모듈들이 임포트가 잘 됩니다만
        pycharm에서 주피터노트북 파일을 실행시키면 임포트가 되지 않고 모듈이 없다고 뜹니다
        이럴 때에는 주피터 노트북을 해당 디렉토리에서 실행 시키는 방법 밖엔 없나요?

        좋아요

      5. 박해선 글의 글쓴이

        pycharm의 작업 디렉토리가 클론 받은 폴더인지 확인해 보세요. 만약 작업 디렉토리가 다르다면 mglearn 폴더를 현재 폴더 아래로 복사해서 사용하시면 됩니다.

        좋아요

      6. JaeUng Jason Hyun

        pycharm에서 클론받은 폴더 전체를 열기해서 사용하고 있는데 작업디렉토리는 따로 설정을 해야하나요?

        좋아요

      7. 박해선 글의 글쓴이

        같은 주피터 서버를 사용한다면 잘 실행되어야 할 것 같은데요. pycharm에서 로컬 폴더를 인식하지 못한다면 pycharm 커뮤니티 쪽에 문의해 보시는 것이 빠를 것 같습니다. 또 구글에서 ‘pycharm jupyter notebook 사용법’으로 검색해서 여러 사이트의 글을 확인해 보세요.

        좋아요

  2. 박형준

    1장 산점도 행렬 그림이 않그려지는건 어떤 이유로 않되는 걸까요?
    출력값이 이렇게 나오네요

    array([[,
    ,
    ,
    ],
    [,
    ,
    ,
    ],
    [,
    ,
    ,
    ],
    [,
    ,
    ,
    ]], dtype=object)

    좋아요

    응답
  3. rgyeong

    안녕하세요 github에서 zip 파일로 다운받고 압축풀었습니다. 그 안에 있는 디렉토리로 이동
    후 jupyter notebook을 실행하였는데 응답하지 않는다고 뜨는데, 제 컴퓨터의 문제인가요?
    답변 부탁드립니다.

    좋아요

    응답
      1. rgyeong

        대신 한가지만 더 여쭙겠습니다. ;;
        module ‘mglearn.datasets’ has no attribute ‘train_1’ 이라는 오류가 나왔는데, import mglearn만 한 상태라 datasets모듈을 뒤에 붙여주는 것이 맞는 것 같고 책에도 그렇게 나와있는데, 왜 오류가 나는 건가요? 여기서 train_1은 두개의 컬럼으로 되어있고 값은 연속형 숫자 입니다. 책에서 처럼 이진수로 만들어 주지 않아서 그런가요?

        좋아요

      2. 박해선 글의 글쓴이

        안녕하세요. 책이나 깃허브 In[] 몇 번 코드인지 알려 주시면 밤늦게 확인해 드릴 수 있을 것 같습니다. ^^

        좋아요

      3. rgyeong

        네! 넘어가고 다른 것부터 해서 늦게 답글을 올립니다.
        4장 특성공학 269페이지 In[12]입니다 . X 와 y의 관계를 보기 위해서 데이터 셋중에서 두개의 컬럼을 만들어 테이블을 만들었고 이를 train_1에 저장했습니다. 두 컬럼 모두 연속형 숫자이고 `X, y = mglearn.datasets.train_1()` 이라고 입력했을 때 오류가 나타났습니다.

        그리고 하나 더 궁금증이 생겼습니다…. 어떤 특성 1과 특성2가 연관이 있어 하나로 뭉쳐(?)주고 싶은데, 이를 one-hot 인코딩으로 컬럼을 만들게 되면 컬럼 수가 너무 많아져서 다항 특성에서 나온 ‘x1 x2’, ‘x1 x3’ 처럼 연결짓고 싶은데, 제가 원하는 특성 조합을 만들 수 있는 방법이 있을 까요?

        좋아요

      4. 박해선 글의 글쓴이

        안녕하세요. mglearn.datasets은 책의 저자가 예제에 필요한 데이터셋을 만들기 위해 작성한 모듈입니다. 이 모듈에는 train_1 이라는 함수는 없는데요. 모듈에 함수를 추가하신 거라면 직접 작성하신 코드를 확인해 드리기는 어려운점 양해 부탁드립니다. 그리고 가지고 계신 데이터셋으로 필요한 차수만큼 다항 특성을 만든 후 4.5.2 모델 기반 특성 선택이나 4.5.3 반복적 특성 선택 절을 참고하면 적절한 특성을 골라낼 수 있을 것 같습니다. 🙂

        좋아요

  4. mchoixx

    안녕하세요? 3쇄 p. 386의 6.6 아래 문단 4번째줄 우측에서 iris 데이터 셋이라고 써있는데 실제 코드는 cancer 데이터셋 아닌지요? p. 387 설명에도 cancer 데이터셋이라고 명시되어 있고요. 확인해주시면 감사하겠습니다.

    좋아요

    응답
    1. 박해선 글의 글쓴이

      윽, cancer가 맞습니다. 원서의 오류네요. 원서와 번역서를 수차례 읽어왔는데도 실수를 바로 잡지 못했네요. 죄송합니다. 그리고 알려 주셔서 감사드립니다. 편안한 밤 되십시요. 🙂

      좋아요

      응답
  5. incio

    p 67. 3~4번째 줄에 이웃을 적게 사용하면 모델의 복잡도가 높아지고 ~( ) 에서 나온 그림 2-1이 아니라 2-6이 맞나요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 문의 주신 부분은 그림 2-1이 맞습니다. 이 문단에서는 과대/과소 적합을 설명하면서 그림 2-1과 비교하고 있습니다. ^^

      좋아요

      응답
  6. 5star181755905

    p417의 spacy 설치법을 위도운 환경에서 정리했습니다.

    markdown 소스로 전달하니 참고하시면 되겠습니다.

    먼저 spacy를 사용하기 위해 아래와 같은 작업을 수행한다:
    1. 윈도우즈의 경우, **관리자권한으로 conda 프롬프트**를 실행한다.
    ![](https://i.imgur.com/Te4VHGO.png)
    2. 실행된 conda 프롬프트에서 spacy 모듈을 설치한다.
    “`bash
    conda install spacy
    “`
    3. 역시 conda 프롬프트에서 Spacy 영어 모듈을 다운로드 하기 위해 아래와 같이 실행한다.
    “`bash
    python -m spacy download en
    “`
    4. 이때 아래와 같이 링크가 생성되면 정상적으로 아래 코드를 실행할 수 있다.
    “`bash
    Linking successful
    C:\Users\great\Anaconda3\lib\site-packages\en_core_web_sm –>
    C:\Users\great\Anaconda3\lib\site-packages\spacy\data\en

    You can now load the model via spacy.load(‘en’)
    “`

    Liked by 1명

    응답
    1. 박해선 글의 글쓴이

      좋은 정보 감사드립니다(댓글이 스팸 처리 되어 있었네요 ㅜㅜ). spacy 윈도우 설치에서 중요한 것은 관리자 권한으로 conda 프롬프트를 실행하는 것인가 보군요.

      좋아요

      응답
      1. 5star181755905

        예. 않그러면 링크가 생성되지 않습니다.
        링크가 생성되지 않는 경우, 패키지 경로를 변경하도록 코드를 수정해야 하는데, 사용자 마다 경로가 다르다면, 일반화된 코드를 안내하기 어렵겠지요..

        좋아요

  7. 5star181755905

    추가로, spacy 2.0에서의 API 변경으로 인해, custom tokenizer 함수의 생성방법을 변경해야 하는데, 이것도 스팸처리 되지 않았나 모르겠네요…

    좋아요

    응답
  8. 박인혁

    책 289p의 예제 중
    select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42), threshold=’median’)

    여기서 threshold 매개변수의 ‘median’은 밑에 주석을 보면 L1규제를 사용한 모델에 사용하는 값이라는데 그럼 RandomForestClassifier는 L1규제를 사용하는 모델인가요…?
    RandomForestClassifier가 L1규제를 사용한다는 말은 처음들어서요;;…

    좋아요

    응답
    1. 박인혁

      아아 앞장의 일변량 통계에서 특성의 50%만 사용했으니깐
      모델 기반 특성 선택도 똑같이 50%를 사용하기위해 L1규제와는 상관없이 median을 사용한건가요?

      근데 290p 예제에서 X_train_l1이라고 되어있는데 이 말은 RandomForestClassifier가 L1을 사용해서 변수 이름을 X_train_l1라고 지은건가요??

      좋아요

      응답
      1. 박인혁

        아아 LogisticRegression은 l1을 사용하니깐 X_train_l1이라고 하신게 맞는거죠?? ㅠㅠㅠ
        LogisticRegression은 기본값으로 l2를 사용하지만
        penalty=”l1″ 를 추가함으로써 l1을 사용할 수 있는거죠?

        좋아요

    2. 박해선 글의 글쓴이

      안녕하세요. 주석의 글을 혼돈하신 것 같네요. RandomForestClassifier는 L1 규제가 없습니다. L1 규제가 없을 경우 SelectFromModel의 threshold 기본값은 mean이 됩니다. 책에서는 median으로 지정했습니다. X_train_l1이라고 쓴 것은 아마도 일부 특성만 선택했기 때문에 마치 L1 규제 같다는 의미를 살리기 위해서라고 생각됩니다. 🙂

      좋아요

      응답
  9. 박인혁

    책 350P에서 정밀도-재현율 곡선과 ROC 곡선에 대한 얘기가 나오는데

    정밀도-재현율 곡선이 ROC 곡선이 아니라 둘 사이에 무슨 다른 점이 있나요..?
    350P~355P까지 읽었을때 정밀도-재현율 곡선이 ROC 곡선인걸로 이해를 했는데

    355P아래 ROC와 AUC에서는 다르다는 식으로 써져 있네요.
    (‘정밀도-재현율 곡선과 비슷하게 ROC 곡선은 ….)

    좋아요

    응답
      1. 박해선 글의 글쓴이

        350페이지의 제목에 ‘ROC 곡선’이 없어도 될 것 같네요. 원서를 확인해 보고 다음에 수정하겠습니다. 🙂

        좋아요

  10. 닝닝

    2.3.7 커널 서포트 벡터 머신

    그림 2-39 확장된 3차원 데이터셋에서 선형 SVM이 만든 결정 경계

    부분 코드에서 ZZ를 정의할 때 나누기 -coef[2]를 하는 이유가 궁금합니다!

    coef는 결정 함수에 따른 X_new의 1열, 2열, 3열, 즉 특성0, 특성1, 특성1**2의 각각의 coef인 것 같은데요! 결정 경계의 Z값을 정의할 때 왜 특성 1**2의 coef를 나누는지 궁금해서 여쭤보려 댓글을 남깁니다! 혹시 관련 식이 있다면 알려주실 수 있으신가요?

    감사합니다!

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 이 SVM이 만드는 결정 경계는 coef[0]*x + coef[1]*y + coef[2]*z + intercept = 0입니다. x, y 좌표 값에 해당하는 z 값을 계산하기 위해 식을 정리한 것 뿐이에요. 🙂

      좋아요

      응답
  11. 필살

    안녕하세요. ‘파이썬 라이브러리를 활용한 머신러닝’을 보다가 잘 해결되지 않는 부분이 있어서 질분드립니다. 58페이지의 예제(forge 데이터셋의 산점도)에서 mglearn.discrete_scatter를 이용하지 않고 다음과 같이 산점도를 그렸더니, legend가 ‘class 0’만 출력이 되네요. 어느 부분을 수정해야 ‘class 0’과 ‘class 1’가 제대로 할당될까요? 감사합니다.
    ——————————————————–
    plt.figure(figsize=(4,4))
    plt.scatter(X[:,0],X[:,1], c=y, s=30)
    plt.legend([‘class 0′,’class 1’],loc=4)
    plt.xlabel(‘1st X’)
    plt.ylabel(‘2nd X’)
    ——————————————————–

    좋아요

    응답
      1. 필살

        질문에 답을 빨리 올려주셨는데, 제가 확인이 너무 늦었네요. 알람설정에 실수가 있었나봐요;;;
        답변 주셔서 감사합니다~~

        Liked by 1명

  12. 박태신

    p58쪽
    No module named ‘preamble’ 라고 뜨는데 위에도 저와같은분이 있어서 써주신 답글을 봤지만 어떻게 해결해야할지 모르겠네요… 책에 나와있는버젼으로 재설치하면되는건가요…?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. mglearn 모듈을 pip로 설치하거나 책의 깃허브 저장소를 다운로드받아 사용하시면 편리합니다. 감사합니다.

      좋아요

      응답

댓글 남기기

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