파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문

웹 크롤링과 스크레이핑부터 머신러닝ㆍ딥러닝까지 체계적으로 배우기

BeautifulSoup, scikit-learn, TensorFlow를 사용하여 실무에 머신러닝/딥러닝을 적용해 보자!

인공지능, 머신러닝, 딥러닝은 바둑, 의료, 자동차 등 이미 다양한 분야에서 성공적인 성과를 보여주고 있습니다. 이러한 머신러닝, 딥러닝과 관련된 성공 사례를 듣고 나면 실제 업무에서도 활용해보고 싶을 것입니다. 사실 머신러닝이라고 하면 어려운 수학과 관련된 지식이 필요하다고 생각하는 경우가 많지만, 그렇게까지 어려운 수학을 사용하는 경우는 거의 없습니다. 활용할 데이터만 가지고 있다면 자신이 원하는 것을 만들어낼 수 있습니다.

『파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문』에서는 머신러닝의 바탕이 되는 데이터를 수집하고, 수집된 데이터를 기반으로 머신러닝을 수행하는 방법을 설명합니다. 인터넷에서 데이터를 어떻게 효율적으로 수집하는지 알아보고, 머신러닝을 원활하게 할 수 있게끔 데이터를 가공하는 방법을 살펴봅니다. 나아가 가공된 데이터를 이용해 챗봇 제작, 규동 메뉴 이미지 판정, 얼굴 인식 등 머신러닝에 활용하는 과정까지 실질적인 파이썬 예제 코드로 소개합니다.

 

상세 이미지

쿠지라 히코우즈쿠에(くじらひこうづくえ)

중학교 시절부터 취미로 하던 프로그래밍이 재미있어 다양한 것들을 만들다가 프로그래머가 되었다. 현재는 소프트웨어 기획 획사 '쿠지라한도'에서 '재미있고 도움되는 도구'를 주제로 윈도우, 안드로이드 등에서 동작하는 앱을 공개하고 있다. 대표작은 도레미로 작곡할 수 있는 음악 소프트웨어 '텍스트 음악 사쿠라'와 '일본어 기반 프로그래밍 언어 나데시코' 등이다. 2001년에는 온라인 소프트웨어 대상을 받았으며, 2004년 IPA 청소년부에서 슈퍼크리에이터로 인정을 받았고, 2010년에 OSS 공헌자 상을 수상했다. 프로그래밍의 즐거움을 전달하기 위해 매일 분투하고 있다.

윤인성

출근하는 게 싫어서 책을 집필/번역하기 시작했다. 일본어는 픽시브에서 웹 코믹을 읽다가 배웠다고 전해진다. 현재 직업 특성상 집에서 나갈 이유가 별로 없다는 것에 굉장히 만족하는 성격이기도 하다. 홍차와 커피를 좋아하며 요리, 음악, 그림, 스컬핑 등이 취미다. 『모던 웹을 위한 JavaScript+jQuery 입문』 『모던 웹을 위한 Node.js 프로그래밍』 『모던 웹 디자인을 위한 HTML5+CSS3 입문』 등을 저술하였으며, 『스위프트로 시작하는 아이폰 앱 개발 교과서』 『모던 웹사이트 디자인의 정석』 『유니티 게임 이펙트 입문』(이상 위키북스), 『실전 게임 제작으로 배우는 언리얼 엔진 4』 『TopCoder 알고리즘 트레이닝』 『Nature of Code』(이상 한빛미디어), 『소셜 코딩으로 이끄는 GitHub 실천 기술』(제이펍) 등을 번역했다.

  • ▣ 00장: 머신러닝을 위한 데이터 처리
    • 0-1. 크롤링, 스크레이핑, 머신러닝
      • 인터넷의 빅데이터
      • 스크레이핑, 크롤링, 데이터 가공
      • 머신러닝에 사용할 수 있는 데이터의 구조
    •  
  • ▣ 01장: 크롤링과 스크레이핑
    • 1-1. 데이터 다운로드하기
      • 웹상의 정보를 추출하는 방법
      • urllib.request를 이용한 다운로드
      • 웹에서 데이터 추출하기
      • BeautifulSoup로 스크레이핑하기
    • 1-2. BeautifulSoup로 스크레이핑하기
      • 네이버 금융에서 환율 정보 추출하기
      • 웹 브라우저로 HTML 구조 확인하기
    • 1-3. CSS 선택자
      • 위키 문헌에 공개돼 있는 윤동주 작가의 작품 목록 가져오기
      • CSS 선택자 자세히 알아보기
      • CSS 선택자로 추출 연습하기
      • 정규 표현식과 함께 조합하기
    • 1-4. 링크에 있는 것을 한꺼번에 내려받기
      • 한꺼번에 다운받는 데 필요한 처리 내용
      • 상대 경로를 전개하는 방법
      • 재귀적으로 HTML 페이지를 처리하는 방법
    •  
  • ▣ 02장: 고급 스크레이핑
    • 2-1. 로그인이 필요한 사이트에서 다운받기
      • HTTP 통신
      • requests 사용해보기
    • 2-2. 웹 브라우저를 이용한 스크레이핑
      • 웹 브라우저 원격 조작에 사용하는 Selenium
      • 웹 사이트를 이미지로 캡처해보기
      • 네이버에 로그인해서 구매한 물건 목록 가져오기
      • Selenium으로 스크레이핑하는 방법
      • 자바스크립트 실행해보기
    • 2-3. 웹 API로 데이터 추출하기
      • 웹 API
      • 웹 API를 제공하는 이유
      • 웹 API 사용해보기 - OpenWeatherMap의 날씨 정보
      • 국내에서 사용할 수 있는 웹 API
    • 2-4. cron을 이용한 정기적인 크롤링
      • 정기적인 크롤링
      • 매일 환율 정보 저장하기
      • cron으로 매일 한 번 실행하기
      • crontab 설정 방법
    •  
  • ▣ 03장: 데이터 소스의 서식과 가공
    • 3-1. 웹의 다양한 데이터 형식
      • 텍스트 데이터와 바이너리 데이터
      • XML 분석
      • JSON 분석
      • YAML 분석
      • CSV/TSV 분석
      • 엑셀 파일 분석
    • 3-2. 데이터베이스
      • 데이터베이스
      • 데이터 저장에는 어떤 데이터베이스를 사용해야 할까?
      • SQLite - 가볍게 파일 하나로 사용할 수 있는 데이터베이스
      • MySQL 사용하기
      • TinyDB 사용하기
    •  
  • ▣ 04장: 머신러닝
    • 4-1. 머신러닝이란?
      • 머신러닝 개요
      • 머신러닝의 종류
      • 머신러닝의 흐름
      • 머신러닝의 응용 분야
      • 초과 학습(초과 적합)
    • 4-2. 머신러닝 첫걸음
      • 머신러닝 프레임워크 scikit-learn
      • XOR 연산 학습해보기
      • 붓꽃의 품종 분류하기
    • 4-3. 이미지 내부의 문자 인식
      • 손글씨 숫자 인식하기
      • 이미지 데이터 학습시키기
    • 4-4. 외국어 문장 판별하기
      • 외국어 판정
      • 판정 방법
      • 샘플 데이터 수집
      • 언어 판별 프로그램
      • 웹 인터페이스 추가하기
    • 4-5. 서포트 벡터 머신(SVM)
      • SVM이란?
      • SVM을 실제로 사용해보기
      • SVM의 종류
    • 4-6. 랜덤 포레스트
      • 랜덤 포레스트란?
      • 랜덤 포레스트 사용하기
    • 4-7. 데이터를 검증하는 방법
      • 크로스 밸리데이션
      • 그리드 서치
    •  
  • ▣ 05장: 딥러닝
    • 5-1. 딥러닝 개요
      • 딥러닝
    • 5-2. TensorFlow 설치하기
      • TensorFlow
      • 설치 방법
      • 설치가 제대로 됐는지 확인하기
      • TensorFlow로 간단한 계산해보기
    • 5-3. Jupyter Notebook
      • Jupyter Notebook 설치하고 실행하기
      • 새 노트 만들기
      • 데이터 시각화
      • TensorFlow와 함께 사용하기
    • 5-4. TensorFlow 기본
      • TensorFlow 기본
      • 머신러닝 해보기
    • 5-5. TensorBoard로 시각화하기
      • TensorBoard의 사용법
    • 5-6. TensorBoard로 딥러닝하기
      • 딥러닝의 구조
      • 딥러닝 해보기 - MNIST 손글씨 데이터
    • 5-7. Keras로 다양한 딥러닝 해보기
      • Keras
      • Keras 설치
      • Keras로 MNIST 테스트해보기
      • Keras로 비만도 판정해보기
    • 5-8. Pandas/NumPy 다루기
      • Pandas/NumPy
      • 데이터 조작
      • Pandas/Numpy 정리
    •  
  • ▣ 06장: 텍스트 분석과 챗봇 만들기
    • 6-1. 한국어 분석(형태소 분석)
      • 형태소 분석
      • 한국어 형태소 분석 라이브러리
      • 출현 빈도 분석
    • 6-2. Word2Vec으로 문장을 벡터로 변환하기
      • Word2Vec
      • Gensim 설치
      • Gensim의 Word2Vec으로 “토지”를 읽어보기
      • 위키피디아 한국어 버전을 사전으로 사용해보기
      • 위키피디아 데이터로 놀아보기
    • 6-3. 베이즈 정리로 텍스트 분류하기
      • 텍스트 분류
      • 베이즈 정리
      • 나이브 베이즈 분류
      • 베이지안 필터 사용해보기
    • 6-4. MLP로 텍스트 분류하기
      • MLP로 텍스트 분류하기
    • 6-5. 문장의 유사도를 N-gram으로 분석하기
      • 문장의 유사도 분석
      • 레벤슈타인 거리
      • 파이썬으로 레벤슈타인 거리를 계산하는 프로그램
      • N-gram으로 유사도 구하기
    • 6-6. 마르코프 체인과 LSTM으로 문장 생성하기
      • 마르코프 체인과 LSTM/RNN
      • 마르코프 체인이란?
      • 마르코프 체인 구현하기
      • LSTM/RNN
    • 6-7. 챗봇 만들기
      • 챗봇(회화 봇)
      • 챗봇의 구조
    •  
  • ▣ 07장: 이미지와 딥러닝
    • 7-1. 유사 이미지 검출하기
      • 간단한 형태 인식 - Average Hash
    • 7-2. CNN으로 Caltech 101의 이미지 분류하기
      • CNN으로 색상 있는 이미지 분류해보기
    • 7-3. 규동 메뉴 이미지 판정하기
      • 규동을 판정할 수 있는 PC가 좋은 PC
      • 스크레이핑부터 시작하기
    • 7-4. OpenCV로 얼굴 인식하기
      • OpenCV
      • 얼굴을 인식하는 프로그램 만들어보기
      • 얼굴에 모자이크 걸기
    • 7-5. 이미지 OCR - 연속된 문자 인식하기
      • OpenCV로 텍스트 영역 확인하기
      • 문자 인식 데이터 만들기
      • 다양한 숫자 폰트 학습 시키기
    •  
  • ▣ 부록: 개발 환경 구축
    • 부록-1. Docker로 개발 환경 구축하기
      • Docker란?
      • Docker 설치
      • 윈도우 10 이하에서 Docker Toolbox 설치하기
      • macOS에서 Docker for Mac 설치하기
    • 부록-2. 파이썬 + Anaconda 환경 준비
      • 파이썬 + Anaconda 이미지 다운로드

예제코드 다운로드

참고사항

  1. Windows 10 이하 버전의 윈도우에서 도커를 사용하는 경우 아시아 계열 언어의 언어[한자, 한국어, 일본어]를 출력할 때 다음과 같은 오류가 발생할 경우

    New state of 'nil' is invalid.
    

    도커가 아닌 vagrant를 사용하거나 VirtualBox에 우분투를 설치하고 사용해서 우회할 수 있습니다.

  2. Selenium에서 PhantomJS를 지원하지 않는 문제의 해결책

1쇄

  • 20쪽, 예제 bs-test2.py를 다음과 같이 수정

    from bs4 import BeautifulSoup
    
    html = """
    <html><body>
      <h1 id="title">스크레이핑이란?</h1>
      <p id="body">웹 페이지를 분석하는 것</p>
      <p>원하는 부분을 추출하는 것</p>
    </body></html>
    """
    
    # HTML 분석하기 --- (※1)
    soup = BeautifulSoup(html, 'html.parser')
    
    # find() 메서드로 원하는 부분 추출하기 --- (※2)
    title = soup.find(id="title")
    body = soup.find(id="body")
    
    # 텍스트 부분 출력하기
    print("#title=" + title.string)
    print("#body=" + body.string)
    
  • 26쪽, 밑에서 9번째 줄(예제 실행 결과)

    usd/krw = 1,147,50
    

    ==>

    usd/krw = 1,147.50
    
  • 34쪽, 예제의 14번째 줄

    a_list = soup.select("#mw-content-text > ul > li a")
    

    ==>

    a_list = soup.select("#mw-content-text > div > ul > li a")
    
  • 38쪽, 예제 코드의 밑에서 2번째 줄

    <body>
    

    ==>

    </body>
    
  • 49쪽, 밑에서 5번째 줄 아래에 다음 내용 추가

    프로그램의 (※11) 부분에서는 링크 대상을 확인해서 링크가 해당 사이트가 아닌 경우 다운로드하지 않게 만듭니다. 다만 CSS 파일을 다운로드하지 않으면 레이아웃이 깨질 수 있으므로 CSS 파일은 예외적으로 다운로드하도록 조건문을 설정했습니다.
    
  • 50쪽, 첫 번째 줄

    또한 프로그램의 (※11)에서는

    ==>

    또한 프로그램의 (※12)에서는

  • 61쪽, 밑에서 10번째 줄

    $ python3 selenium-capture.py
    

    ==>

    $ python3 login-getmileage.py
    
  • 62쪽, 밑에서 11번째 줄

    r = request.post("http://example.com", data=formdata)
    

    ==>

    r = requests.post("http://example.com", data=formdata)
    
  • 68쪽, 10번째 줄

    test-phantomjs /bin/bash
    

    ==>

    ubuntu-phantomjs /bin/bash
    
  • 91쪽, src/ch2/everyday-dollar.py 예제의 다음 부분을 수정

    from bs4 import BeautifulSoup
    import urllib.request as req
    

    ==>

    from bs4 import BeautifulSoup
    import urllib.request as req
    import datetime
    
  • 108쪽, 상단 예제(src/ch3/json-github.py)의 8번째 줄

    if not os.path.exists(url):
    

    ==>

    if not os.path.exists(savename):
    
  • 119쪽, src/ch3/csv-read2.py 예제의 5번째 줄

    fp = codecs.open(filename, "r", "shift_jis")
    

    ==>

    fp = codecs.open(filename, "r", "euc_kr")
    
  • 125쪽, 8번째 줄

    $ python3 download-png1.py
    

    ==>

    $ python3 excel-write.py
    
  • 126쪽, 밑에서 4번째 줄

    # 2017년 인구로 정렬 --- (※2)
    

    ==>

    # 2015년 인구로 정렬 --- (※2)
    
  • 138쪽, 밑에서 3번째 줄

    res = table.search(Item.price >= 800)
    

    ==>

    res = table.search(Item.price >= 8000)
    
  • 148쪽, 정리 부분의 2번째 줄

    실제로 머신러닝머신러닝

    ==>

    실제로 머신러닝

  • 165쪽, 본문 3번째 줄

    데이터는 리틀 엔디안으로 저장돼 있습니다. struct 모듈로 리틀 엔디안 데이터를 읽어 들일 때는 “>”라는 기호를 지정합니다.

    ==>

    데이터는 엔디안으로 저장돼 있습니다. struct 모듈로 엔디안 데이터를 읽어 들일 때는 “>”라는 기호를 지정합니다.

  • 195쪽, 본문 밑에서 7번째 줄

    파랑(2)의 2배가 흰색(2)입니다.

    ==>

    생각하면 파랑(2)의 2배가 흰색(4)입니다.

  • 202쪽, 예제 밑에서 3번째 줄

    print(학습기 =", clf.best_estimator_)
    

    ==>

    print("학습기 =", clf.best_estimator_)
    
  • 221쪽, 본문 밑에서 7번째 줄

    내용이지만 Jypyter는 파이썬 뿐만 아니라

    ==>

    내용이지만 Jupyter는 파이썬 뿐만 아니라

  • 221쪽, 본문 밑에서 6번째 줄

    인터넷에서 “jypyter ruby”처럼

    ==>

    인터넷에서 “jupyter ruby”처럼

  • 223쪽, 하단 코드 예제에서 밑에서 5번째 줄

    sess.run(tf.tf.global_variables_initializer())
    

    ==>

    sess.run(tf.global_variables_initializer())
    
  • 229쪽, 예제에서 20번째 줄

    플로우 그래프 구출하기 --- (※5)
    

    ==>

    플로우 그래프 구축하기 --- (※5)
    
  • 229쪽, 예제에서 26, 27번째 줄

    W = tf.Variable(tf.zeros([2, 3])); # 가중치
    b = tf.Variable(tf.zeros([3])); # 바이어스
    
    W = tf.Variable(tf.zeros([2, 3])) # 가중치
    b = tf.Variable(tf.zeros([3])) # 바이어스
    
  • 230쪽, 예제에서 7번째 줄

    sess.run(tf.tf.global_variables_initializer()) # 변수 초기화하기
    

    ==>

    sess.run(tf.global_variables_initializer()) # 변수 초기화하기
    
  • 234쪽, 상단 예제에서 8번째 줄

    tw = tf.train.SummaryWriter("log_dir", graph=sess.graph)
    

    ==>

    tw = tf.summary.FileWriter("log_dir", graph=sess.graph)
    
  • 239쪽, 상단 예제 끝에 다음 코드를 추가

    # accuracy 계산을 스코프로 묶기
    with tf.name_scope('accuracy') as scope:
        predict = tf.equal(tf.argmax(y, 1), tf.argmax(y_,1))
        accuracy = tf.reduce_mean(tf.cast(predict, tf.float32))
    
  • 259쪽, 예제 밑에서 6번째 줄

    X_train, y_train)
    

    ==>

    X_train, y_train,
    
  • 277쪽, 예제의 14번째 줄

    lines = text.split("\r\n")
    

    ==>

    lines = text.split("\n")
    
  • 281쪽, 본문 2번째 줄

    $ pip3 install genism
    

    ==>

    $ pip3 install gensim
    
  • 282쪽, 예제에서 상단 임포트 구문을 다음과 같이 수정

    import codecs
    from bs4 import BeautifulSoup
    from konlpy.tag import Twitter
    

    ==>

    import codecs
    from bs4 import BeautifulSoup
    from konlpy.tag import Twitter
    from gensim.models import word2vec
    
  • 283쪽, 위에서 4번째 줄

    model.save("kokoro.model")
    

    ==>

    model.save("toji.model")
    
  • 283쪽, 본문 밑에서 8번째 줄

    프로그램의 (※6)에서는 ==> 프로그램의 (※5)에서는

  • 288쪽, 위에서 4번째 예제 첫 번째 줄

    >>> model.most_similar(positive=["왕자", "여성"], negative=["여성"])[0:5]
    

    ==>

    >>> model.most_similar(positive=["왕자", "여성"], negative=["남성"])[0:5]
    
  • 292쪽, 베이즈 정리 공식에서 다음 부분을 수정

    P(A|B)P(B)P(A)
    

    ==>

    P(A|B)P(B)/P(A)
    
  • 305쪽, mlp3-classify.py 예제의 9번째 줄~10번째 줄을 다음과 같이 수정

    max_words = 67395 # 입력 단어 수: word-dic.json 파일 참고
    nb_classes = 9 # 9개의 카테고리
    

    ==>

    max_words = 56681 # 입력 단어 수: word-dic.json 파일 참고
    nb_classes = 6 # 6개의 카테고리
    
  • 318쪽, 예제 코드의 밑에서 8번째 줄

    data = urllib.request.urlopen("https://m.search.naver.com/p/csearch/dcontent/spellchecker.nhn?" + params)
    

    ==>

    request = urllib.request.Request("https://m.search.naver.com/p/csearch/ocontent/spellchecker.nhn?" + params)
    request.add_header('Referer', 'https://search.naver.com/earch.naver')
    data = urllib.request.urlopen(request)
    

    ※ 트래픽 과부하로 접속이 차단될 수 있으므로 대상 사이트에 피해를 주지 않도록 절대 대량의 요청을 보내지 말아 주십시오.

  • 321쪽, 10번째 줄

    기억하지 못하지만 RNN은 장기적으로 ==> 기억하지 못하지만 LSTM은 장기적으로

  • 336쪽, 예제 코드의 6번째 줄

    data = urllib.request.urlopen("https://m.search.naver.com/p/csearch/dcontent/spellchecker.nhn?" + params)
    

    ==>

    request = urllib.request.Request("https://m.search.naver.com/p/csearch/ocontent/spellchecker.nhn?" + params)
    request.add_header('Referer', 'https://search.naver.com/earch.naver')
    data = urllib.request.urlopen(request)
    

    ※ 트래픽 과부하로 접속이 차단될 수 있으므로 대상 사이트에 피해를 주지 않도록 절대 대량의 요청을 보내지 말아 주십시오.

  • 340쪽, src/ch7/avhash.py의 밑에서 4번째 줄

    def np2hash(n):
    

    ==>

    def np2hash(ahash):
    
  • 365쪽, 예제 코드의 맨 밑줄

    download_all(" ", "./image/gyudon") # --- (※4)
    

    ==>

    download_all("牛丼", "./image/gyudon") # --- (※4)
    
  • 389쪽, facedetect-mosaic.py 예제 코드의 10번째 줄

    output_file = re.sub(r'\,jpg|jpeg|PNG$', '-mosaic.jpg', image_file)
    

    ==>

    output_file = re.sub(r'\.jpg|jpeg|PNG$', '-mosaic.jpg', image_file)
    

2쇄

  • 20쪽, 예제 bs-test2.py를 다음과 같이 수정

    from bs4 import BeautifulSoup
    
    html = """
    <html><body>
      <h1 id="title">스크레이핑이란?</h1>
      <p id="body">웹 페이지를 분석하는 것</p>
      <p>원하는 부분을 추출하는 것</p>
    </body></html>
    """
    
    # HTML 분석하기 --- (※1)
    soup = BeautifulSoup(html, 'html.parser')
    
    # find() 메서드로 원하는 부분 추출하기 --- (※2)
    title = soup.find(id="title")
    body = soup.find(id="body")
    
    # 텍스트 부분 출력하기
    print("#title=" + title.string)
    print("#body=" + body.string)
    
  • 34쪽, 예제의 14번째 줄

    a_list = soup.select("#mw-content-text > ul > li a")
    

    ==>

    a_list = soup.select("#mw-content-text > div > ul > li a")