Page 1

기초부터 모델링,

이 책은 구글과 라쿠텐 머신러닝 개발자가 초보자 눈높이에서 머신러닝의 핵심 이론과 실용적인 예제를 제시합니다. 머신러닝 입문자가 이론을 바탕으로 강력한 성능을 내는 머신러닝 시스템을 구현하고 사용 할 수 있도록 하는 것이 이 책의 목표입니다. 1부에서는 머신러닝의 기초, 2부에서는 머신러닝의 주요 모델, 3부에서는 머신러닝 시스템 구현을 알려

처음 배우는 머신러닝

배경지식 없이도 머신러닝을 배우는 가장 확실한 방법

실전 예제, 문제 해결까지

줍니다. 이론, 실무 예제, 해결 방법까지 모두 담고 있어 입문자뿐 아니라 이미 머신러닝을 현업에서 다 루면서 체계적으로 실력을 다잡고자 하는 중고수에게도 최고의 선택이 될 겁니다.

김승연, 정용주 지음

복잡한 딥러닝 기법과 대용량 컴퓨팅 파워가 주류를 이루는 요즘 ‘머신러닝을 구현할 때는 기본으로 돌아가 데이터 특성을 파악하고 단순한 학습 기법에서 출발해야 한다’는 저자의 주장을 현업 데이터 과학자의 입장에서 다시 한번 강조하고 싶다. _ 김진영 PhD (스냅 데이터 과학자, 『헬로 데이터 과학』 저자)

이 책은 머신러닝을 이용하는 최신 애플리케이션들을 풍부하게 예로 들고, 수학과 통계에 대한 지식 없이도 쉽게 따라 하 며 머신러닝의 기본 개념을 익힐 수 있도록 쓰였다. 그런 점에서 실용적인 초심자용 교재에 대한 갈증을 크게 해소해줄 것 이라 기대한다.

_ 이준석 PhD (구글 리서치 소프트웨어 엔지니어)

전통적인 머신러닝에서부터 최근 열풍인 딥러닝의 활용(이미지, 자연어)까지 유기적으로 연계시킴으로써 딥러닝 입문자 들이 반드시 익혀야 할 머신러닝 기법을 습득하는 데 적합하다.

_ 반대현 PhD (삼성전자 소프트웨어 R&D 센터 책임연구원)

관련 도서 프로그래밍 / 머신러닝

밑바닥부터 시작하는 딥러닝

처음 배우는 인공지능

93000

골빈해커의 3분 딥러닝 9 791162 240045

예제 소스 https://github.com/your-first-ml-book

정가 26,000원

ISBN 979-11-6224-004-5

처음 배우는 머신러닝

김승연, 정용주 지음


처음 배우는 머신러닝 : 기초부터 모델링, 실전 예제, 문제 해결까지 초판 1쇄 발행 2017년 10월 1일 지은이 김승연, 정용주 / 펴낸이 김태헌 베타리더 노은지, 노원매, 김도겸, 황원근, 유승일, 이준석, 김진영, 정준혁, 오정주, 엄태웅, 반대현, 정은진, 송현오 펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제10 – 1779호 / ISBN 979 – 11 – 6224 – 004 – 5

93000

총괄 전태호 / 책임편집 김창수 / 기획 최현우 / 교정·조판 김철수 디자인 표지·내지 김연정 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 송경석, 변지영 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr

Published by Hanbit Media, Inc. Printed in Korea Copyright © 2017 김승연, 정용주 & Hanbit Media, Inc. 이 책의 저작권은 김승연, 정용주와 한빛미디어 (주)에 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단전재와 복제를 금합니다.

지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.


처음 배우는 머신러닝 김승연, 정용주 지음


지은이 소개

지은이

김승연 seungyeonk@google.com 막연히 인간이 무엇인지 데이터를 통해 이해하고 싶다며 컴퓨터공학과에 들어간 이후 머신러닝과 소프트웨어 개 발의 길을 걷고 있다. 서울대학교에서 컴퓨터공학부를 마 치고 조지아 공과대학에서 효율적인 문서의 표현형학습 에 대한 머신러닝을 연구하여 컴퓨터 과학 석사와 박사 학위를 취득했다. 현재 구글 리서치에 소속되어 모바일 환경에서의 머신러닝을 주제로 연구 개발하고 있다.

지은이

정용주 youngjoo.chung@rakuten.com 서울대학교에서 컴퓨터공학과 고고미술사학을 전공하면 서 발굴 데이터의 전산 분석 강좌를 통해 머신러닝의 가 능성을 체험한 후 도쿄대학에서 머신러닝을 이용한 웹 스팸 검출에 관한 연구로 정보이공학 석사와 박사 학위 를 취득했다. 그 후 일본 전자상거래기업 라쿠텐에서 데 이터 분석 및 부정사용 검출 업무에 종사했다. 스탠퍼드 대학교에서 1년의 방문연구원 생활 후 현재 라쿠텐 미국 지사에서 데이터 분석을 담당하고 있다.

4


추천의 글

빅데이터에 이어 머신러닝은 이미 시대의 화두가 되었다. 정보 검색을 전공하고 데이터 과학자 로 일해온 나에게 이는 분명 반가운 소식이다. 머신러닝으로 모든 것을 해결할 수 있으며 해결 해야 한다는 강박관념에 사로잡힌 사람을 많이 본다. 『처음 배우는 머신러닝』은 머신러닝에 관 심은 있지만 배울 기회가 없었던 분께 머신러닝의 실체에 다가갈 기회를 제공하는 책이다. 텍 스트 처리에서 추천 시스템, 이미지 인식에 이르기까지 다양한 분야의 최신 기법을 다루고 있 어 이미 머신러닝을 사용하는 분께도 유용하다. 복잡한 딥러닝 기법과 대용량 컴퓨팅 파워가 주류를 이루는 요즘 ‘머신러닝을 구현할 때는 기 본으로 돌아가 데이터 특성을 파악하고 단순한 학습 기법에서 출발해야 한다’는 저자의 주장을 현업 데이터 과학자의 입장에서 다시 한번 강조한다. _김진영 PhD 스냅 데이터 과학자, 『헬로 데이터 과학』 저자

머신러닝에 처음 관심을 두게 된 계기는 알파고와 이세돌의 대국이었다. 이세돌이 알파고에 패 하고 나서 머신러닝에 관한 강연에 수차례 참석했고 관련 글도 여럿 읽어보았지만 대부분 너무 전문적이거나 그 반대로 피상적이어서 지적 갈증을 해소하기에 역부족이었다. 그러던 차에 『처 음 배우는 머신러닝』을 읽게 되었다. 도서명이 암시하듯이 나를 비롯한 비전문가들도 별다른 배경지식 없이 머신러닝을 체계적으로 배울 수 있게 해주는 가뭄에 단비와 같은 책이다. _정준혁 PhD 텍사스 A&M 대학교 수학과 조교수

5


세계적으로 머신러닝에 대한 관심이 대단한데, 그런 상황에 비해 초심자가 볼만한 책은 부족 하다. 유명한 교재도 있지만 그런 책은 독자가 수학과 통계학 지식을 갖췄다고 전제하고, 실용 적인 애플리케이션보다는 학술적인 내용에 중점을 두고 있기 때문에 읽기 힘들다. 이 책은 머 신러닝을 이용하는 최신 애플리케이션을 풍부하게 예로 들고, 수학과 통계에 대한 지식 없이도 쉽게 따라하며 머신러닝의 기본 개념을 익힐 수 있도록 쓰였다. 그런 점에서 실용적인 초심자 용 교재에 대한 갈증을 크게 해소해줄 것이라 기대한다. _이준석 PhD 구글 리서치 소프트웨어 엔지니어

머신러닝은 이세돌 9단과 바둑을 두고, 서울시 야간버스 노선 최적화를 돕는다. 그야말로 사회 전반에 걸쳐 폭넓게 이용되고 있다. 머신러닝을 배우려는 사람은 많지만, 기존 자료는 영어로 작성된 것이 많아서 접근성이 떨어지는 것이 현실이다. 컴퓨터공학이나 프로그래밍 혹은 통계 학에 대한 지식은 있지만 머신러닝을 처음 접근하는 분에게 실리콘밸리와 일본 현업에서 머신 러닝을 사용하고 있는 저자들이 정말 필요한 이론과 실례를 담은 이 책은 가뭄의 단비같이 시 기적절한 도움을 줄 것이다. 아울러 제공하는 예제 코드는 독자분이 만들려는 머신러닝을 이용 한 애플리케이션을 만드는 데도 유용할 것이다. _정은진 PhD 샌프란시스코 대학교 컴퓨터 과학과 부교수

6


많은 소프트웨어 서비스가 데이터를 기반으로 품질을 계속 개선해나가는 추세다. 이러한 추세 에 따라 데이터를 효과적으로 활용하는 기술인 머신러닝이 더욱 중요해지고 있다. 기본 개념부 터 실제 서비스 응용에 이르기까지 확실하고 쉽게 다루고 있는 이 책을 머신러닝 입문자와 현 업 엔지니어에게 적극 추천한다! _유승일 PhD 구글 리서치 소프트웨어 엔지니어

이 책은 머신러닝 입문자에게 필요한 개념을 친절하고 명확하게 설명한다. 기존 머신러닝 개발 자도 개념이 명확지 않을 때 챙겨볼 만한 핵심 내용을 포함한다. 일반적인 머신러닝 서적이 이 론 위주인 반면, 개념 설명과 구현 예제를 곁들인 이 책은 실전에서 활약하는 개발자에게 직접 적인 도움을 줄 것이다. 특히 전통적인 머신러닝에서부터 최근 열풍인 딥러닝의 활용(이미지, 자연어)까지 유기적으 로 연계시킴으로써 딥러닝 입문자가 반드시 익혀야 할 머신러닝 기법을 습득하는 데 적합하다. _반대현 PhD 삼성전자 소프트웨어 R&D 센터 책임연구원

『처음 배우는 머신러닝』은 컴퓨터공학을 전공하지 않은 초심자에게 매우 적합한 책이다. 영문 에서 번역된 다른 저서들은 이해하기 다소 난해하다는 평이 있었는데 이 책은 머신러닝 관련 현업에 종사하는 한국인들이 애초에 한글로 집필했기 때문에 독자들이 내용을 받아들이기 훨 씬 수월할 것이다. 책의 내용도 독자들이 이해하기 쉬운 도표, 예제, 그리고 코드를 적절히 이 용해 추상적이지 않고 직관적으로 풀어서 설명되어 있다. 머신러닝을 처음 접하는 직관적인 책 을 원하는 초심자에게 시원한 청량제 같은 책이 될 것이라 기대한다. _송현오 PhD 서울대학교 컴퓨터공학부 조교수

7


석사 시절 머신러닝을 영문 교과서로 처음 접하면서 헤맸던 기억이 있다. 또한 현업에서 데이 터 과학자로 일하면서 교과서의 이론과 실제 데이터 분석 사이에 간극이 있어 막막함을 느꼈던 적도 많다. 입문자의 그런 답답함을 이 책이 해소해줄 것이다. 이 책은 복잡한 머신러닝 알고리 즘과 개념을 우리말로 쉽게 설명해줄 뿐만 아니라 예제를 바탕으로 쓰여 있어서 입문자가 쉽게 배울 수 있도록 구성되어 있다. 머신러닝 초보자로서 부딪히는 다양한 장벽도 이 책과 함께라 면 지은이들의 다년간의 경험과 노하우를 얻어 실무에서 쉽게 적용해볼 수 있을 것이다. _노은지 링크드인 데이터 과학자

머신러닝을 배우고는 싶은데 어디서부터 시작해야 할지 막막한 분께 이 책을 추천한다. 두 저 자는 머신러닝의 기본 개념부터 주요 활용 분야까지 알기 쉽게 설명하고자 많은 노력을 들여 매우 흡족한 결과가 나왔다. 특히 활용 예제가 많이 포함되어 있어서 머신러닝을 현업에서 활 용하길 원하시는 분들께 좋은 참고서가 될 것이다. _김도겸 PhD 페이스북 연구원

8


지은이의 말

유학을 준비하면서 서울대학교 바이오지능 연구실에서 학부 연구생으로 머신러닝을 처음 접했 습니다. 당시 크리스토퍼 비숍이 저술한 『패턴인식과 머신러닝 Pattern Recognition and Machine Learning』 으로 스터디 그룹을 만들어 공부했는데, 처음부터 갑자기 이론적으로 깊이 들어가 이해하기 어 려웠던 기억이 생생합니다. 지금은 이 책을 참 좋아하지만 당시 필자 입장에서 머신러닝의 큰 그림을 그리고 활용하기에는 큰 도움이 되지 않았습니다. 그때부터 한글로 된 좋은 입문서가 있 으면 좋겠다는 생각을 했습니다. 그 후 유학길에 오른 후 석박사 과정에서 수업을 듣고 유명한 다른 책과 논문으로 공부하면서 머신러닝에 입문하는 더 나은 방법이 있다는 것을 확신할 수 있 었습니다. 그래서 이 책을 쓸 결심을 하게 되었습니다. 유학 과정에서 머신러닝의 중요성을 많이 느꼈습니다. 정말 불가능해 보였던 일이 머신러닝을 이용해서 해결되는 것을 많이 보았고 한국에서도 앞으로 머신러닝을 본격적으로 발전시키지 않 으면 국제 경쟁력을 키우기 어렵겠다는 생각을 했습니다. 머신러닝 학회에 가보면 수많은 기업 이 머신러닝 기술을 받아들이거나 발전시켜 새로운 산업을 창출해내고 있습니다. 머신러닝은 앞으로의 소프트웨어 산업을 근본적으로 바꿀 것으로 예상됩니다. 예전에 사람들이 직접 만들던 로직의 많은 부분이 데이터를 이용해서 자동화되고 더 정확하게 동작할 겁니다. 예 를 들어 편지봉투에 적혀 있는 번호를 자동으로 인식하는 시스템을 생각해보면 이전에는 1은 세로로 길고, 4는 십자가에 뭔가 이어져 있으며, 0은 동그라미 하나, 8은 동그라미 두 개를 붙 였다는 등 규칙을 일일이 프로그래밍해주어야 했습니다. 일단 선의 모양을 인식하는 일 자체도 어려울 뿐 아니라 서체가 다르거나 글자가 회전되어 있거나 정해진 칸에 있지 않는 경우에는 더욱 그러했습니다. 머신러닝은 이런 문제에 대한 규칙을 자동으로 만들어주는 방법이라고 생각 할 수 있습니다. 이는 좀 더 복잡한 문제를 해결할 때 생각하기 어려울 정도로 많은 규칙을 직접 만드는 것이 아니라, 규칙들을 스스로 학습해서 해결할 수 있게 된다는 것입니다. 머지않은 미 래에는 소프트웨어의 많은 부분에 자동 학습 기능이 적용될 가능성이 있습니다. 김승연

9


아직 빅데이터라는 단어조차 없던 시절에 도쿄대학 대학원 박사과정에 입학했습니다. 그 당시 일본 정부 프로젝트인 ‘정보대폭발(빅데이터라는 단어가 없던 시절에 이를 가리키던 일본어)’ 프로젝트를 수행하면서 대량의 일본어 웹 페이지를 대상으로 스팸 페이지를 자동으로 검출, 제 거하는 일을 담당했습니다. 이 경험을 바탕으로 현재는 일본 최대 전자상거래 기업 라쿠텐에 입사하여 다양한 종류의 데이 터(상품 데이터, 고객 리뷰 데이터, 카드 결제 거래 데이터, 레시피 데이터, 검색 데이터)를 분 석하며 서비스를 개선하고 있습니다. 구매 데이터 분석을 통한 추천 서비스의 제안으로 골프 서 비스 예약률을 2배 이상 높이거나, 거래 데이터 분석을 통해 보안팀이 눈치채지 못한 사기 수법 을 찾고, 필요한 상품 재고 수를 예측하는 등 머신러닝의 실무 활용 가능성을 체감하고 있습니 다. 한편 머신러닝에 대해 체계적으로 알지 못한 채 무턱대고 적용했을 때의 문제에도 직면하곤 합니다. 대학원생 당시 거의 유일한 입문서였던 크리스토퍼 비숍의 『패턴인식과 머신러닝』을 읽으며 공 부했는데, 일본에서는 『패턴인식과 머신러닝의 학습』이라는 책까지 나올 정도로 입문자가 읽기 에는 상당히 난해해서 고생했던 기억이 있습니다. 이 책으로 머신러닝을 접한 분들은 머신러닝 이 굉장히 어렵다고 생각하거나, 혹은 큰 그림을 이해하는 데는 성공했지만 세세한 부분을 모 르는 경우를 간혹 보곤 합니다. 그래서 머신러닝을 더 알기 쉽게, 하지만 큰 그림과 신경 써야 할 세부 내용을 담은 책을 쓰고자 노력했습니다. 정용주

10


이 책에 대하여

“빅데이터가 요즘 화제라고 하지 않았어? 근데 또 머신러닝은 뭐고 딥러닝은 뭐지?” 머신러닝을 처음 접하는 분은 이러한 용어들이 무엇을 의미하는지 감이 오지 않을 것입니다. 이 책은 그러한 의문점을 해소하고자 쓰여졌습니다. 빅데이터라는 용어가 본격적으로 쓰이기 시작한 건 2011년부터였습니다. 머신러닝은 그전부터 활발하게 연구되던 분야였지만, 학습에 사용 가능한 데이터양이 늘어나고 컴퓨터의 연산 능력이 발전한 덕에 전에는 불가능해보였던 여러 문제를 머신러닝으로 해결하게 되면서 다시 중요성이 대두되었고, 특히 딥러닝의 엄청난 성과가 많은 대중적인 관심을 불러일으켰습니다. 한국에서 도 머신러닝이 대중적인 관심을 받기 시작했고 번역된 입문서들이 출판되고 있지만 대부분의 책 이 이론에만 치우쳐 있거나 혹은 단순하게 주어진 코드를 사용하는 방법에만 치우쳐 있어 한글 로 된 입문서가 필요하겠다고 생각했습니다. 지금까지 저자들이 경험한 바로는 머신러닝의 강력함은 이론적인 접근과 실용적인 접근의 시너 지에서 나온다고 생각합니다. 이 책은 독자들이 효과적으로 머신러닝을 배울 수 있도록 이 두 가 지를 쉽고 유기적으로 설명했습니다. 아무쪼록 머신러닝을 기반으로 하여 하고자 하는 바를 이 룰 수 있길 빕니다.

이 책의 독자 이 책은 머신러닝의 핵심 이론을 간결하게 설명하고 실용적인 예제를 유기적으로 설명해서 강 력한 성능을 내는 머신러닝 시스템을 구현하고 사용할 수 있게 도와줍니다. 이 책은 다음과 같 은 분들에게 권합니다. 머신러닝을 처음 배우는 프로그래머

머신러닝 전공을 희망하는 학부 및 석사

머신러닝을 체계적으로 정리하고 싶은 데이터 과학자

11


이 책의 예제 코드 이 책에서 다루는 예제 코드는 깃허브와 한빛미디어 홈페이지에서 내려받을 수 있습니다. 깃허브 : https ://github.com/your -first -ml -book

한빛미디어 : http ://www.hanbit.co.kr/src/10004

이 책의 구성 이 책은 머신러닝 입문자가 알아야 하는 머신러닝의 전반적인 내용을 다룹니다. 여러분은 머 신러닝이 왜 쓸모 있고 어떤 모델과 문제가 있는지, 실무에서 어떻게 사용하는지, 머신러닝의 다 양한 문제를 어떻게 해결할 수 있는지, 프로그램 코드를 어떻게 만드는지 알게 될 겁니다.

1부 머신러닝 기초 지식 머신러닝과 딥러닝이 무엇이고 어떤 분류와 어떤 개념이 있는지 알아봅니다. 1부의 기본 개념 은 3부의 실습에서 유용하게 사용되므로 정확히 알고 가는 것이 좋습니다. 1장 머신러닝 시작하기

머신러닝의 큰 그림을 이해하는 데 도움이 되는 내용을 소개합니다. 머신러닝과 딥러닝이 무 엇인지, AI와 다른 관련 분야들과는 어떠한 관계를 갖고 있으며 어떻게 분류하는지 설명합 니다. 2장 머신러닝의 주요 개념

머신러닝의 주요 개념을 설명합니다. 이론적인 부분을 최대한 쉽고 실용적으로 설명했습니 다. 이 장을 읽고 나면 머신러닝을 도입했을 때 문제를 어떻게 바라보고 어떻게 표현하며 어 떻게 해결 방법을 찾는지, 그리고 예측에 어떻게 사용하는지에 대해 알 수 있습니다. 이들 개 념은 성능에 커다란 영향을 끼치므로 어렵더라도 읽어보기 바랍니다.

12


2부 머신러닝 주요 모델 머신러닝 주요 모델의 이론과 개념을 실제 적용 사례와 함께 설명합니다. 회귀, 군집화 등 머신 러닝의 모델에 대해 어느 정도 알고 있지만 바탕이 되는 이론이나 적용할 수 있는 문제가 무엇 인지에 대해 구체적으로 알고 싶으면 2부를 꼭 읽어보세요. 특히 8장은 실제로 이론을 적용했 을 때 발생하는 다양한 문제를 해결하는 방법을 소개합니다. 3장 데이터와 문제

문제의 종류와 데이터에 대해 이해해야 머신러닝을 제대로 수행할 수 있습니다. 데이터와 문 제의 종류를 소개하여 머신러닝으로 해결할 수 있는 문제를 이해하는 데 도움을 줍니다. 4장 구매 이력 데이터를 이용한 사용자 그룹 만들기

수치 항목으로 구성된 구매 이력 데이터로 사용자 그룹을 만드는 문제를 다룹니다. 수치 데이 터를 이용하는 대표적인 모델인 회귀와 군집화를 좀 더 자세히 알아봅니다. 5장 문서 분석 시스템 만들기

문서를 분석하는 다양한 방법에 대해 설명합니다. 문서를 주어진 카테고리에 맞게 분류하는 방법, 숨겨진 토픽을 찾는 방법, 문법을 분석하는 방법, 문서에서 고유명사를 추출하는 방법 등 이론적인 기반을 소개합니다. 또한 최신 유행하는 임베딩 학습으로 문서를 분석하는 방법 도 소개합니다. 6장 영화 추천 시스템 만들기

넷플릭스, 유튜브 등의 서비스는 사용자가 좋아할 만한 영상을 어떻게 찾아낼까요? 추천 시 스템의 기본 이론에 대해 알아봅니다.

13


7장 이미지 인식 시스템 만들기

이미지의 내용을 어떻게 인식하는지에 대해 설명합니다. 비슷한 사진 찾기, 이미지에 들어 있 는 주요 물체를 찾는 인식 기법에 대해 설명합니다. 또한 최신 기법인 신경망을 이용한 이미 지 분류에 대해서도 살펴봅니다. 8장 머신러닝의 다양한 문제점 해결하기

머신러닝을 최초로 구현했을 때부터 바로 좋은 성능을 보인다면 정말 운이 좋은 겁니다. 같은 방법을 사용하더라도 여러 가지 상황에 따라 좋은 성능이 나오지 않을 수 있습니다. 대부분의 경우에는 몇 가지 문제만 해결해도 엄청난 성능 향상을 얻을 수 있습니다. 모델의 다양한 문 제점을 해결하는 방법, 까다로운 데이터를 처리하는 방법, 속도 향상을 위한 방법 등을 알아 봅니다.

3부 머신러닝 시스템 구현 3부에서 설명한 이론을 실제로 구현하는 방법과 라이브러리를 이용하는 방법을 소개합니다. 모 델을 실제로 적용하는 방법을 더 빨리 알고 싶다면 2부보다 3부를 먼저 읽어도 됩니다. 9장 머신러닝 소프트웨어 소개

머신러닝 태스크에 사용되는 프로그래밍 언어와 각 언어에서 사용하는 대표적인 머신러닝 라 이브러리 및 딥러닝 프레임워크를 소개합니다. 이 책에서 주로 사용할 라이브러리는 사이킷 런과 텐서플로입니다. 이 두 라이브러리의 기본적인 사용법에 대해서도 알아봅니다. 10장 구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전

4장에서 소개한 ‘구매 이력 데이터를 이용한 사용자 그룹 만들기’를 실제로 구현해봅니다. 데이터와 프로그래밍 코드를 함께 살펴보면서 다양한 군집화 구현에 대해 살펴봅니다.

14


11장 문서 분석 시스템 만들기 - 실전

5장에서 살펴본 다양한 ‘문서 분석 시스템’을 구현해봅니다. 스팸문자 분류기와 문서 내용을 간추리는 데 사용되는 토픽을 찾는 방법, 한국어 처리와 임베딩 학습을 통한 문서 분석 방법 을 알아봅니다. 12장 영화 추천 시스템 만들기 - 실전

6장에서 설명한 ‘영화 추천 시스템’을 구현해봅니다. 실제 데이터와 프로그래밍 코드를 살펴 보면서 협업 필터링 구현 방법에 대해 소개합니다. 13장 이미지 인식 시스템 만들기 - 실전

7장에서 살펴본 이미지 관련 기술을 이용해 ‘이미지 인식 시스템’을 만듭니다. 기본적인 이 미지 데이터를 다루는 방법과 얼굴 사진 분류 및 딥러닝을 이용한 손글씨 분류를 구현해봅 니다.

용어 사용에 대하여 개발 현장에서 사용하는 용어와 과거 머신러닝 번역서에서 사용한 용어 사이에 차이가 있습니 다. 머신러닝은 통계학과 많은 부분을 공유하고 있기 때문에 통계학 용어를 무시할 수는 없습니 다. 하지만 개발자라면 영어로 된 라이브러리를 사용하거나, 문서를 보거나, 개발자 간에 협업 할 때 번역된 용어와 영어 원문 사이의 관계를 쉽게 연관짓지 못해 고생한 기억이 있을 겁니다. 그래서 이 책을 집필할 때 많은 고민을 했습니다. 어떻게 하면 독자분이 용어를 친숙하게 느끼면 서도 공개된 많은 소프트웨어와 현업에서 사용하는 용어를 연관시킬 수 있을지에 대해서요. 그 래서 다음과 같은 원칙을 정했습니다.

15


다른 통계학, 데이터 과학, 머신러닝 책과 헷갈리지 않도록 한국통계학회 용어집에 용어가 있는 경우에는 우

선적으로 고려했습니다. 한국통계학회 용어집에 없는 용어라면 유사한 용어를 참고하여 선정했습니다.

현업과 정말 많이 동떨어져 있다고 판단되는 경우 대체 용어를 선정했습니다.

부록으로 용어집을 제공해서 통계학 용어와 현업에서 사용하는 용어를 비교할 수 있게 했습니다.

머신러닝을 접하게 되는 경로에 따라 익숙한 용어가 다를 것입니다. 통계학이나 다른 책을 먼저 접했다면 번역된 용어에, 블로그나 라이브러리로 접했다면 영어나 음차 표현에 익숙할 겁니다. 읽기 쉬운 책을 만들기 위해 용어 선정에 심혈을 기울였습니다. 이런 복잡한 상황을 양해해주시 고 용어집을 참고해주시면 감사하겠습니다.

16


인공지능 지도

Ⓓ 딥러닝기반 Ⓢ 확률통계기반 Ⓡ 강화학습기반 이 책에서 다룬 내용

ⒹⓈ

자율주행

로보틱스

다중 에이전트

ⒹⓈ

영상 인식 Ⓡ

플래닝

ⒹⓈ

온톨로지

동적 제어

음성 인식 ⒹⓈ

지식 표현

인식

로직

ⒹⓈ Ⓢ

품사 태깅

AI

ⒹⓈ

추론

자연어 처리

확률추론

ⒹⓈ

고유명사 추출

ⒹⓇ

ⒹⓈⓇ Ⓢ

범용 지능

학습 사회지능

창작

감성 컴퓨팅 ⒹⓈ

지도학습

ⒹⓈ

비지도학습

ⒹⓇ

강화학습

17


CONTENTS

지은이 소개 �������������������������������������������������������������������������������������������������������������������� 4

추천의 글 ����������������������������������������������������������������������������������������������������������������������� 5

지은이의 말 �������������������������������������������������������������������������������������������������������������������� 9 이 책에 대하여 �������������������������������������������������������������������������������������������������������������� 11 인공지능 지도 ��������������������������������������������������������������������������������������������������������������� 17

Part

1

CHAPTER

머신러닝 기초 지식

1 머신러닝 시작하기

1.1 머신러닝 소개 ������������������������������������������������������������������������������������������������������������ 31 1.2 머신러닝을 이해하는 데 필요한 배경지식 ������������������������������������������������������������������������� 33

1.2.1 수학(선형대수, 미분, 통계, 확률) ������������������������������������������������������������������������ 33

1.2.2 프로그래밍 ����������������������������������������������������������������������������������������������������� 34

1.3 머신러닝 발전사 ���������������������������������������������������������������������������������������������������������� 34

1.3.1 머신러닝의 역사와 현재 트렌드 �������������������������������������������������������������������������� 34

1.3.2 머신러닝의 3가지 관점 ������������������������������������������������������������������������������������� 37

1.4 머신러닝의 분류 ���������������������������������������������������������������������������������������������������������� 39

1.4.1 지도학습, 비지도학습, 강화학습 �������������������������������������������������������������������������� 40

1.4.2 지도학습의 세부 분류 ��������������������������������������������������������������������������������������� 41

1.4.2.1 회귀와 분류 ���������������������������������������������������������������������������������������� 41

1.4.2.2 추천 시스템과 랭킹학습 ������������������������������������������������������������������������ 42

1.4.3 비지도학습의 세부 분류 ������������������������������������������������������������������������������������ 43

1.4.3.1 군집화와 토픽 모델링 ��������������������������������������������������������������������������� 43

1.4.3.2 밀도 추정 ������������������������������������������������������������������������������������������� 43

1.4.3.3 차원 축소 ������������������������������������������������������������������������������������������� 44

1.4.4 딥러닝 ����������������������������������������������������������������������������������������������������������� 44

1.5 마치며 ���������������������������������������������������������������������������������������������������������������������� 45 18


CHAPTER

2 머신러닝의 주요 개념

2.1 모델 : 문제를 바라보는 관점 ������������������������������������������������������������������������������������������ 48

2.1.1 모델이란? ������������������������������������������������������������������������������������������������������ 48

2.1.2 간단한 모델 ���������������������������������������������������������������������������������������������������� 50

2.1.3 복잡한 모델 ���������������������������������������������������������������������������������������������������� 51

2.1.4 구조가 있는 모델 ��������������������������������������������������������������������������������������������� 53

2.1.4.1 순차 모델 ������������������������������������������������������������������������������������������� 53

2.1.4.2 그래프 모델 ���������������������������������������������������������������������������������������� 54

2.1.5 좋은 모델이란 무엇인가? ���������������������������������������������������������������������������������� 55

2.1.5.1 편향-분산 트레이드오프 ����������������������������������������������������������������������� 55

2.1.5.2 정규화 ���������������������������������������������������������������������������������������������� 57

2.2 손실함수 : 모델의 수식화된 학습목표 ������������������������������������������������������������������������������ 58

2.2.1 산술 손실함수 ������������������������������������������������������������������������������������������������� 59

2.2.2 확률 손실함수 ������������������������������������������������������������������������������������������������� 60

2.2.3 랭킹 손실함수 ������������������������������������������������������������������������������������������������� 63

2.2.4 모델 복잡도와 관련된 손실함수 �������������������������������������������������������������������������� 64

2.3 최적화 : 실제로 학습을 하는 방법 ����������������������������������������������������������������������������������� 66

2.3.1 경사하강법 ����������������������������������������������������������������������������������������������������� 67

2.3.2 뉴턴/준 뉴턴 방법 �������������������������������������������������������������������������������������������� 69

2.3.3 확률적 경사하강법 ������������������������������������������������������������������������������������������� 69

2.3.4 역전파 ����������������������������������������������������������������������������������������������������������� 71

2.3.5 최신 최적화 방법 ��������������������������������������������������������������������������������������������� 72

2.4 모델 평가 : 실제 활용에서 성능을 평가하는 방법 ��������������������������������������������������������������� 73

2.4.1 모델의 일반화 특성 평가 ����������������������������������������������������������������������������������� 74

2.4.1.1 학습-평가 데이터 나누기 ���������������������������������������������������������������������� 74

2.4.1.2 교차검증 ������������������������������������������������������������������������������������������� 74

2.4.2 정확도 ����������������������������������������������������������������������������������������������������������� 75

19


CONTENTS

2.4.3 정밀도와 포괄성 ���������������������������������������������������������������������������������������������� 76

2.4.4 랭킹 평가 ������������������������������������������������������������������������������������������������������� 78

2.4.4.1 정밀도@K ����������������������������������������������������������������������������������������� 78

2.4.4.2 NDCG ��������������������������������������������������������������������������������������������� 78

2.5 마치며 ���������������������������������������������������������������������������������������������������������������������� 78

Part

2

CHAPTER

머신러닝 주요 모델

3 데이터와 문제

3.1 데이터형 ������������������������������������������������������������������������������������������������������������������� 83

3.1.1 텍스트 데이터 ������������������������������������������������������������������������������������������������� 84

3.1.2 수치 데이터 ���������������������������������������������������������������������������������������������������� 84

3.1.3 이미지 데이터 ������������������������������������������������������������������������������������������������� 85

3.1.4 음성 데이터 ���������������������������������������������������������������������������������������������������� 86

3.1.5 복합 데이터 ���������������������������������������������������������������������������������������������������� 86

3.2 데이터양과 품질 ���������������������������������������������������������������������������������������������������������� 87

3.2.1 데이터양과 머신러닝의 연관성 ��������������������������������������������������������������������������� 87

3.2.2 데이터 품질과 머신러닝의 연관성 ����������������������������������������������������������������������� 88

3.3 데이터 표준화 ������������������������������������������������������������������������������������������������������������ 89

3.3.1 수치 데이터 표준화 ������������������������������������������������������������������������������������������ 89

3.3.2 카테고리 데이터 표준화 ������������������������������������������������������������������������������������ 91

3.3.3 서수 데이터 표준화 ������������������������������������������������������������������������������������������ 92

3.4 문제 유형 ������������������������������������������������������������������������������������������������������������������ 93

3.4.1 회귀 문제 ������������������������������������������������������������������������������������������������������� 93

3.4.2 분류 문제 ������������������������������������������������������������������������������������������������������� 94

3.4.3 군집화 문제 ���������������������������������������������������������������������������������������������������� 95

20


3.4.4 표현형학습(임베딩학습) ������������������������������������������������������������������������������������ 96

3.5 마치며 ���������������������������������������������������������������������������������������������������������������������� 98

CHAPTER

4 구매 이력 데이터를 이용한 사용자 그룹 만들기

4.1 군집화 �������������������������������������������������������������������������������������������������������������������� 100 4.2 K- 중심 군집화 ��������������������������������������������������������������������������������������������������������� 101 4.3 계층적 군집화 ���������������������������������������������������������������������������������������������������������� 104 4.4 밀도 기반 군집화 ������������������������������������������������������������������������������������������������������� 109 4.5 유사도 계산 ������������������������������������������������������������������������������������������������������������� 111

4.5.1 민코스키 거리 ����������������������������������������������������������������������������������������������� 111

4.5.2 마할라노비스 거리 ����������������������������������������������������������������������������������������� 113

4.6 마치며 �������������������������������������������������������������������������������������������������������������������� 115

CHAPTER

5 문서 분석 시스템 만들기

5.1 문서 분류 시스템 만들기 ��������������������������������������������������������������������������������������������� 118

5.1.1 문서 분류에 많이 사용하는 피처 ����������������������������������������������������������������������� 118

5.1.1.1 단어 빈도 피처 ���������������������������������������������������������������������������������� 118

5.1.1.2 TF - IDF ������������������������������������������������������������������������������������������ 119

5.1.1.3 토픽 또는 군집에 기반한 피처 �������������������������������������������������������������� 121

5.1.2 피처를 이용해서 실제로 분류하기 ��������������������������������������������������������������������� 122

5.1.2.1 로지스틱 회귀 ����������������������������������������������������������������������������������� 122

5.1.2.2 SVM ���������������������������������������������������������������������������������������������� 124

5.1.2.3 그 외에 많이 쓰이는 분류 방법 ������������������������������������������������������������� 127

5.2 토픽 모델링 ������������������������������������������������������������������������������������������������������������� 127

5.2.1 LDA ����������������������������������������������������������������������������������������������������������� 128

21


CONTENTS

5.3 문법 분석 ���������������������������������������������������������������������������������������������������������������� 129

5.3.1 품사 태깅 ����������������������������������������������������������������������������������������������������� 130

5.3.1.1 RNN ���������������������������������������������������������������������������������������������� 131

5.3.1.2 LSTM �������������������������������������������������������������������������������������������� 133

5.3.2 고유명사 추출(NER ) �������������������������������������������������������������������������������������� 135

5.3.2.1 순차 모델을 사용한 NER ( RNN/LSTM ) ����������������������������������������������� 136

5.3.2.2 머신러닝은 아니지만 NER에 사용되는 기법 ������������������������������������������� 136

5.4 단어 임베딩 학습 - word2vec ������������������������������������������������������������������������������������ 136 5.5 마치며 �������������������������������������������������������������������������������������������������������������������� 140

CHAPTER

6 영화 추천 시스템 만들기

6.1 영화 추천 시스템 ������������������������������������������������������������������������������������������������������� 141 6.2 유사도 계산 ������������������������������������������������������������������������������������������������������������� 143

6.2.1 자카드 계수 �������������������������������������������������������������������������������������������������� 143

6.2.2 코사인 유사도 ����������������������������������������������������������������������������������������������� 144

6.2.3 편집 거리 ����������������������������������������������������������������������������������������������������� 146

6.3 내용 기반 추천 시스템 ������������������������������������������������������������������������������������������������ 147 6.4 협업 필터링 ������������������������������������������������������������������������������������������������������������� 148

6.4.1 평균 제곱근 편차 ������������������������������������������������������������������������������������������� 149

6.4.2 사용자 기반, 상품 기반 협업 필터링 ������������������������������������������������������������������� 151

6.4.3 잠재성 요인 모델 ������������������������������������������������������������������������������������������� 152

6.4.3.1 특잇값 분해 �������������������������������������������������������������������������������������� 153

6.5 표준화 �������������������������������������������������������������������������������������������������������������������� 156 6.6 마치며 �������������������������������������������������������������������������������������������������������������������� 157

22


CHAPTER

7 이미지 인식 시스템 만들기

7.1 이미지 처리의 기본 개념 ��������������������������������������������������������������������������������������������� 159

7.1.1 픽셀 ������������������������������������������������������������������������������������������������������������ 160

7.1.2 필터링 ��������������������������������������������������������������������������������������������������������� 161

7.1.3 합성곱 ��������������������������������������������������������������������������������������������������������� 164

7.2 이미지 인식 ������������������������������������������������������������������������������������������������������������� 166

7.2.1 이미지 분류 �������������������������������������������������������������������������������������������������� 167

7.2.2 이미지 검출 �������������������������������������������������������������������������������������������������� 168

7.3 이미지 인식에 사용하는 피처 ��������������������������������������������������������������������������������������� 169

7.3.1 윤곽선 ��������������������������������������������������������������������������������������������������������� 169

7.3.2 코너 ������������������������������������������������������������������������������������������������������������ 171

7.3.3 SIFT ����������������������������������������������������������������������������������������������������������� 174

7.3.4 주성분 분석 �������������������������������������������������������������������������������������������������� 178

7.4 딥러닝을 이용한 이미지 인식 ��������������������������������������������������������������������������������������� 180

7.4.1 CNN 소개 ���������������������������������������������������������������������������������������������������� 180

7.4.2 합성곱 레이어 ����������������������������������������������������������������������������������������������� 181

7.4.3 풀링 ������������������������������������������������������������������������������������������������������������ 183

7.4.4 활성화함수 ��������������������������������������������������������������������������������������������������� 184

7.4.5 완전연결 레이어 �������������������������������������������������������������������������������������������� 186

7.5 마치며 �������������������������������������������������������������������������������������������������������������������� 187

CHAPTER

8 머신러닝의 다양한 문제점 해결하기

8.1 모델 문제 ���������������������������������������������������������������������������������������������������������������� 189

8.1.1 과학습 ��������������������������������������������������������������������������������������������������������� 189

8.1.1.1 학습-평가 데이터 나누기 �������������������������������������������������������������������� 190

23


CONTENTS

8.1.1.2 정규화 �������������������������������������������������������������������������������������������� 191

8.1.1.3 학습을 일찍 끝내기 ���������������������������������������������������������������������������� 195

8.1.1.4 드롭-아웃(딥러닝 기법) ��������������������������������������������������������������������� 196

8.1.2 좋은 모델을 좀 더 수월하게 찾는 방법 ��������������������������������������������������������������� 197

8.1.2.1 간단한 모델부터 적용하기 ������������������������������������������������������������������� 198

8.1.2.2 데이터와 모델 시각화하기 ������������������������������������������������������������������� 198

8.1.2.3 모델의 최대 성능 가늠하기 ������������������������������������������������������������������ 200

8.2 데이터 문제 ������������������������������������������������������������������������������������������������������������� 201

8.2.1 데이터가 너무 많을 때 ������������������������������������������������������������������������������������ 201

8.2.2 데이터가 너무 적을 때 ������������������������������������������������������������������������������������ 204

8.2.2.1 레이블된 데이터는 별로 없지만 일반적인 데이터가 많은 경우(표현형학습) �� 204

8.2.2.2 전이학습 ����������������������������������������������������������������������������������������� 205

8.2.3 데이터가 좀 치우쳐 있을 때 ����������������������������������������������������������������������������� 206

8.2.3.1 레이블이 한쪽으로 치우쳐 있을 때 �������������������������������������������������������� 206

8.2.3.2 데이터값이 치우쳐 있을 때 ������������������������������������������������������������������ 207

8.3 속도 문제 ���������������������������������������������������������������������������������������������������������������� 208

8.3.1 벡터 연산 ����������������������������������������������������������������������������������������������������� 209

8.3.2 머신러닝을 효율적으로 수행하기 위한 시스템 ����������������������������������������������������� 210

8.3.2.1 하드웨어 ����������������������������������������������������������������������������������������� 211

8.3.2.2 네트워크 구성 ����������������������������������������������������������������������������������� 211

8.3.2.3 운영체제 ����������������������������������������������������������������������������������������� 212

8.3.3 분산 처리 ����������������������������������������������������������������������������������������������������� 212

8.3.3.1 데이터의 분산 처리(디스크) ���������������������������������������������������������������� 212

8.3.3.2 데이터의 분산 처리(메모리) ���������������������������������������������������������������� 212

8.3.3.3 연산의 분산 처리 ������������������������������������������������������������������������������� 213

8.4 마치며 �������������������������������������������������������������������������������������������������������������������� 213

24


Part

3

CHAPTER

머신러닝 시스템 구현

9 머신러닝 소프트웨어 소개

9.1 파이썬 설치와 라이브러리 ������������������������������������������������������������������������������������������� 217 9.2 유명 라이브러리 소개 ������������������������������������������������������������������������������������������������� 219

9.2.1 머신러닝 라이브러리 �������������������������������������������������������������������������������������� 219

9.2.2 딥러닝 라이브러리 ����������������������������������������������������������������������������������������� 221

9.2.3 연산 관련 라이브러리 ������������������������������������������������������������������������������������� 223

9.3 이 책에서 사용하는 툴킷 ��������������������������������������������������������������������������������������������� 223

9.3.1 사이킷런 ������������������������������������������������������������������������������������������������������ 225 9.3.1.1 사이킷런 선형 회귀 ���������������������������������������������������������������������������� 225

9.3.2 텐서플로 ������������������������������������������������������������������������������������������������������ 228

9.3.2.1 텐서플로 기본 개념 소개 ��������������������������������������������������������������������� 229

9.3.2.2 텐서플로 선형 회귀 ���������������������������������������������������������������������������� 235

9.4 마치며 �������������������������������������������������������������������������������������������������������������������� 243

CHAPTER

10 구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전

10.1 데이터셋 ��������������������������������������������������������������������������������������������������������������� 245 10.2 데이터 전처리 ��������������������������������������������������������������������������������������������������������� 247 10.3 K-평균 군집화 ������������������������������������������������������������������������������������������������������� 255 10.4 올바른 클러스터 수 K 정하기 ������������������������������������������������������������������������������������ 257

10.4.1 정량적 평가 ���������������������������������������������������������������������������������������������� 257

10.4.1.1 실루엣 계수 ������������������������������������������������������������������������������ 257

10.4.1.2 엘보 방법 ��������������������������������������������������������������������������������� 259

10.4.2 정성적 평가 ���������������������������������������������������������������������������������������������� 260

25


CONTENTS

10.5 계층적 군집화 ��������������������������������������������������������������������������������������������������������� 266 10.6 마치며 ������������������������������������������������������������������������������������������������������������������ 272

CHAPTER

11 문서 분석 시스템 만들기 - 실전

11.1 스팸 문자 필터 만들기(문서 분류) ������������������������������������������������������������������������������ 273

11.1.1 예제에서 사용할 데이터 처리 ����������������������������������������������������������������������� 274

11.1.2 피처를 이용해서 분류하기 ��������������������������������������������������������������������������� 280

11.2 토픽 모델 시스템 만들기 ������������������������������������������������������������������������������������������� 284 11.3 품사 분석 시스템 만들기 ������������������������������������������������������������������������������������������� 286 11.4 고유명사 태깅 시스템 만들기 ������������������������������������������������������������������������������������� 289 11.5 한국어 위키백과를 이용한 word2vec 만들기 ��������������������������������������������������������������� 290

11.5.1 위키백과 데이터의 획득 및 전처리 ���������������������������������������������������������������� 292

11.5.2 형태소 분석 ���������������������������������������������������������������������������������������������� 294

11.5.3 word2vec 학습 ���������������������������������������������������������������������������������������� 297

11.5.4 word2vec 평가 ���������������������������������������������������������������������������������������� 298

11.6 마치며 ������������������������������������������������������������������������������������������������������������������ 301

CHAPTER

12 영화 추천 시스템 만들기 - 실전

12.1 데이터셋 ��������������������������������������������������������������������������������������������������������������� 303 12.2 데이터 전처리 ��������������������������������������������������������������������������������������������������������� 305 12.3 내용 기반 영화 추천 시스템 만들기 ����������������������������������������������������������������������������� 308 12.4 협업 필터링 기반 영화 추천 시스템 만들기 ������������������������������������������������������������������� 316

12.4.1 특잇값 분해 구현하기 ��������������������������������������������������������������������������������� 317

12.4.2 경사하강법 구현하기 ���������������������������������������������������������������������������������� 323

12.4.3 근사 결과 평가하기 ������������������������������������������������������������������������������������ 325

12.5 마치며 ������������������������������������������������������������������������������������������������������������������ 331

26


CHAPTER

13 이미지 인식 시스템 만들기 - 실전

13.1 이미지 데이터를 이용한 K-평균 군집화 ����������������������������������������������������������������������� 333 13.2 주성분 분석을 이용한 사람 얼굴 인식 �������������������������������������������������������������������������� 337 13.3 CNN을 이용한 손글씨 숫자 분류 ������������������������������������������������������������������������������� 349

13.3.1 피처 생성 ������������������������������������������������������������������������������������������������� 350

13.3.1.1 합성곱 레이어 ��������������������������������������������������������������������������� 350

13.3.1.2 풀링 ���������������������������������������������������������������������������������������� 352

13.3.1.3 완전연결 레이어 ������������������������������������������������������������������������ 353

13.3.1.4 드롭-아웃 �������������������������������������������������������������������������������� 353

13.3.2 학습 및 평가 ��������������������������������������������������������������������������������������������� 356

13.3.2.1 소프트맥스와 교차 엔트로피 �������������������������������������������������������� 356

13.3.2.2 최적화함수 ������������������������������������������������������������������������������� 357

13.3.2.3 정확도 평가 ������������������������������������������������������������������������������ 358

13.3.2.4 전체 코드 및 텐서보드 활용법 ������������������������������������������������������ 359

13.4 마치며 ������������������������������������������������������������������������������������������������������������������ 364

부록 용어집 ���������������������������������������������������������������������������������������������������������������������������������������������

365

찾아보기 ���������������������������������������������������������������������������������������������������������������������������������������������������

371

27


CHAPTER

1

머신러닝 시작하기

1.1 머신러닝 소개 머신러닝이란 무엇일까요? 머신러닝, 기계학습, 혹은 이와 관련된 인공지능, 딥러닝 같은 말 을 자주 들어본 사람이더라도 그 개념을 어렴풋이 아는 데 그치거나 이 말들이 너무 다양한 의 미로 사용되는 바람에 각 의미를 헷갈리는 경우가 많습니다. 어떤 때는 통계학 같고, 어떤 때는 알고리즘 같고, 어떤 때는 프로그래밍같이 같이 들립니다. 이는 머신러닝이라는 말 자체가 굉 장히 넓은 의미를 가지고 있기 때문입니다. 머신러닝은 한마디로 다음과 같이 정의할 수 있습니다. “데이터를 이용해서 명시적으로 정의되지 않은 패턴을 컴퓨터로 학습하여 결과를 만들어내는 학문 분야”

이 정의는 1959년에 아서 사무엘 Arthur Lee Samuel 이 정의한 ‘직접적으로 프로그래밍하지 않아도 컴퓨터가 스스로 학습할 수 있는 능력을 주는 학문 분야’와 비슷합니다. 1959년의 정의에서는 통계학적 머신러닝 statistical machine learning 과 딥러닝 deep learning 에서 강조하는 데이터의 중요성은 미처 부각되지 않았습니다. [그림 1-1]이 보여주는 바와 같이 머신러닝은 데이터, 패턴인식, 컴퓨터를 이용한 계산이 합쳐 져서 만들어진 분야입니다.

1장 머신러닝 시작하기

31


그림 1-1 머신러닝을 건설에 비유한 그림. 머신러닝은 데이터를 기반으로 컴퓨터를 이용해서 패턴인식을 할 수 있는 시 스템을 만듭니다.

터를 컴퓨

한 이용

계산

패턴인식

터 데이

기반

이 세 요소가 머신러닝에서 어떠한 의미를 가지는지 짚어보겠습니다. 데이터 머신러닝은 항상 데이터를 기반으로 합니다. 이런 의미에서 머신러닝은 여러 규칙을 단순 조합 하는 ‘고전적인 인공지능 시스템’과는 다릅니다. 또한 사용자가 어떻게 동작할지 완전히 정의하 는 컴퓨터 알고리즘과도 다릅니다. 머신러닝은 알고리즘이 아닌 데이터 학습을 통해 실행 동작 이 바뀝니다. 데이터를 기반으로 한다는 점에서 통계학과 가장 가깝다고 볼 수 있습니다. 패턴인식 머신러닝은 통계학을 비롯해 딥러닝을 이용하여 데이터의 패턴을 유추하는 방법이 주축이 됩니 다. 사용자가 일일이 정해놓은 패턴으로 데이터를 분석하는 것이 아니라 데이터를 보고 패턴 을 추리는 것이 머신러닝의 핵심입니다. 딥러닝의 발전으로 통계학적 머신러닝의 빛이 다소 바 래긴 했지만, 통계학이야말로 데이터에서 패턴을 찾아내는 학문이므로 여전히 머신러닝의 가장 기본적이며 핵심적인 개념입니다. 딥러닝도 통계학에서 사용하는 전통적인 방법과는 다른 방법 을 사용하지만 ‘패턴을 찾아내려고 학습한다’는 점에서 그 목표는 동일하다고 볼 수 있습니다.

32

1부 머신러닝 기초 지식


컴퓨터를 이용한 계산 머신러닝은 데이터를 처리하고 패턴을 학습하고 계산하는 데 컴퓨터를 사용합니다. 그렇기 때문 에 계산 그 자체도 머신러닝에서는 아주 중요합니다. 계산 속도를 높이고, 또 더 많은 데이터를 효율적으로 다루고자 많은 연구가 진행되었습니다. 분산 처리 등 시스템 구성에 관한 연구가 한 예입니다. 이런 점에서 응용수학이나 통계학과 달리 머신러닝은 단순히 수학적인 모델의 구축 이나 증명에만 그치는 것이 아니라 실제 데이터에 대해 계산해서 결과를 만들어낸다는 점에서 머신러닝은 전산학의 한 분야로 볼 수 있습니다. 머신러닝의 3가지 특징을 간단히 살펴봤습니다. 지금부터 머신러닝을 이해하는 데 필요한 지식 이 무엇이고, 머신러닝에 어떤 분야가 있는지 살펴보겠습니다.

1.2 머신러닝을 이해하는 데 필요한 배경지식 머신러닝은 패턴인식을 기반으로 컴퓨터를 이용해서 데이터를 처리하는 학문입니다. 그러므로 머신러닝을 이해하려면 패턴인식에서 쓰이는 수학적 배경지식과 프로그래밍에 대한 지식이 필 요합니다.

1.2.1 수학(선형대수, 미분, 통계, 확률) 머신러닝의 패턴인식 기법은 대부분 수치 연산으로 동작합니다. 그중 행렬 연산(특히 행렬곱) 과 역행렬 개념을 많이 사용하는데, 고교 시절에 배운 행렬에 대한 개념만 알면 기본적인 머신러 닝 기법을 이해할 수 있습니다. 하지만 더 깊이 있는 내용을 이해하려면 대학에서 배우는 선형대 수, 특히 행렬 분해에 대한 지식(예를 들면 특잇값 분해)이 필요합니다. 또한 미분에 대한 지식 도 약간 필요합니다. 최솟값/최댓값 개념과 1차 미분함수만 알아도 되지만 대학에서 배우는 미 적분학과 최적화에 대해 알면 더욱 좋습니다. 통계학 지식도 약간 필요합니다. 머신러닝의 많은 부분이 통계학과 접근 방법이 비슷하기 때문 입니다. 분포란 무엇인지, 정상분포 혹은 가우스분포란 무엇인지, 왜 중요한지, 상관관계란 무 엇인지, 회귀란 무엇인지 등을 알면 도움이 됩니다. 즉, 대학에서 배우는 일반 통계학 이론 정

1장 머신러닝 시작하기

33


도면 충분합니다. 하지만 대학 때 누구나 통계학을 배우는 것은 아니므로 이 책은 독자가 통계 지식이 없다는 가정하에 설명합니다. 끝으로 고교시절에 배우는 확률 지식도 필요합니다. 특히 확률의 정의와 조건부 확률이 중요합 니다. 깊이 알 필요는 없지만, 많은 머신러닝 기법이 확률 모델을 중심으로 구성되어 있기 때문 에 어느 정도의 개념은 알고 있는 것이 좋습니다. 이렇게 나열해보니 배경지식이 정말 많이 필요한 것 같군요. 하지만 이런 배경지식에 대한 깊은 이해가 없어도 이 책의 내용을 이해할 수 있도록 집필했으니 너무 염려하지 않아도 됩니다.

1.2.2 프로그래밍 앞서 말했듯이 머신러닝에는 프로그래밍이 필요합니다. 하지만 머신러닝 라이브러리가 이미 많 이 존재하므로 밑바닥부터 모든 것을 만들지 않아도 머신러닝 시스템을 충분히 구축할 수 있습 니다. 물론 고급 프로그래밍 기법을 안다면 효율적인 머신러닝 시스템 구축에 도움이 됩니다. 분산 처리에 대한 지식도 도움이 됩니다. 이 책에서는 독자 여러분이 파이썬 프로그래밍을 할 수 있다고 가정합니다. 기본적인 파이썬 문 법, 함수 사용, 파일 사용법 정도만 알아도 됩니다. 이 정도의 프로그래밍 실력은 독학으로도 충 분히 쌓을 수 있으니 너무 걱정하지 않아도 됩니다.

1.3 머신러닝 발전사 머신러닝과 인공지능이 지금까지 어떻게 발전해왔고, 최신 트렌드는 무엇인지 알아보겠습니다. 또한 머신러닝 기법을 바라보는 다양한 관점도 알아보겠습니다.

1.3.1 머신러닝의 역사와 현재 트렌드 머신러닝의 시작은 인공지능이라고 볼 수 있습니다. 머신러닝과 인공지능 모두 컴퓨터를 이용 해서 지능적인 작업을 하는 방향으로 발전해왔습니다. 어떻게 보면 머신러닝은 인공지능이라

34

1부 머신러닝 기초 지식


는 큰 학문의 한 분야라고도 생각할 수 있습니다. 머신러닝은 [그림 1-2]와 같이 1950년대에 인공지능이라는 개념으로 태동했고, 신경망 시대를 거쳐 통계학적 머신러닝과 빅데이터 시대 를 지나 지금의 딥러닝 시대에 다다랐습니다. 각 시대별 특징을 살펴봅시다. 그림 1-2 머신러닝 변천사 신경망 기반 규칙 기반

고전적 인공지능 시대

신경망 시대 통합

통계학적 머신러닝 시대

통계 기반

1950

1960

1990

딥러닝 시대

빅데이터 시대

2010

2013

현재

고전적 인공지능 시대 컴퓨터가 발명된 이래로 이 신기한 기계가 어떤 일을 할 수 있는지에 대한 관심이 끊이지 않았 습니다. 예를 들어 1950년에 유명한 컴퓨터 학자인 앨런 튜링은 인공지능을 판별하는 튜링 테 스트를 제안했는데, 이는 기계가 인간과 얼마나 비슷하게 대화하는지를 기준으로 기계의 지능을 판별하는 테스트입니다. 이처럼 1950년대에는 컴퓨터의 가능성에 대해 다양한 논의가 있었습 니다. 신경망 시대

1957년에 퍼셉트론 perceptron 이라는 기초적인 신경망이 개발되었습니다. 이를 여러 개 묶어 복 잡한 신경망을 구성하면 입력과 출력을 굉장히 유연하게 연결할 수 있었지만, 당시 신경망에는 여러 가지 문제점이 있었습니다. 우선 그 시대에는 구할 수 있는 데이터가 굉장히 한정적이라 신경망 성능이 생각보다 신통치 않았고, 기초 이론의 부족으로 한정적인 패턴만 학습이 가능했 습니다. 많은 학자가 신경망 구축에 뛰어들었지만, 예상보다 결과가 잘 나오지 않아 침체된 상 태가 이어졌습니다. 이 시기를 ‘인공지능의 겨울’이라고 부르곤 합니다.

1장 머신러닝 시작하기

35


통계학적 머신러닝 시대

1990년대에 들어 통계학을 전산학과 접목시켜 대규모 데이터에서 패턴을 찾는 시도가 기존에 비해 진일보된 성과를 냈습니다. 기존의 방법과 가장 큰 차이점은 데이터에 훨씬 더 중요한 비 중을 두었다는 것입니다. 그 결과 기존의 그 어떤 방법보다 성능이 좋았기 때문에 큰 관심을 받 고 산업의 여러 분야에 도입되었습니다. 이 시기에 머신러닝이라는 용어가 등장 했으며, 차후 에 딥러닝이 나온 이후 이런 통계학에 중심을 둔 기법들을 통계학적 머신러닝이라고 부르게 됩 니다. 빅데이터 시대 통계학적 머신러닝은 웹에서 쏟아지는 데이터, 대용량 저장장치, 분산 처리 기술과 결합하여 엄 청난 시너지를 만들었습니다. 빅데이터라는 용어가 2010년대부터 유행했는데, 빅데이터 시대 에는 기존보다 더 큰 데이터를 분석하기 위해 기존보다 훨씬 더 큰 규모의 머신러닝 시스템을 만들게 되고 그 덕택에 성능도 더욱 좋아지게 됩니다. 딥러닝 시대 데이터가 많아지고 연산 능력이 증가하면서(특히 GPU가 발전하면서) 머신러닝 연구자들은 예전 신경망 이론에 다시 한번 눈길을 돌렸습니다. 기존의 신경망 시대보다 훨씬 더 많은 데이 터와 새로 개발된 이론을 합치자 단순히 통계학적 머신러닝만 사용하는 모델을 넘어서는 결과 를 얻을 수 있게 되었습니다. 기존의 신경망보다 훨씬 더 복잡한, 즉 깊이가 깊은 신경망을 사용 하게 되었기 때문에 이를 딥러닝이라고 부르게 됩니다. 딥러닝 시대의 신경망 연구는 60년대의 신경망 연구와는 상황과 성과가 달랐습니다. 오랜 기간 연구가 진행된 통계학적 머신러닝을 기 존의 신경망에 접목했고, 데이터가 폭발적으로 증가해서 복잡한 신경망을 학습할 만한 기반도 생겼습니다. 그 덕분에 성능이 이전보다 훨씬 잘 나오게 되었습니다. 현재 트렌드 현재 머신러닝은 대량의 데이터를 바탕으로 하는 딥러닝 기법을 주로 사용합니다. 기존에는 해 결하기 힘들었던 음성 인식, 번역, 이미지 인식에서 특히 좋은 성과를 보이고 있습니다. 이러한 성과는 다음과 같은 최근의 새로운 연구 결과에 의해 가능했습니다. 성격이 다른 데이터를 연관시켜서 데이터를 더 효율적으로 사용하는 딥러닝 구조의 개발. 예) 비디오에 있는

자막과 이미지를 동시에 학습시키거나 영어, 프랑스어, 스페인어를 동시에 학습시키기

36

1부 머신러닝 기초 지식


CHAPTER

2

머신러닝의 주요 개념

앞 장에서는 머신러닝이 무엇인지, 머신 러닝에 어떤 분야가 있는지, 다른 분야와는 어떤 관련이 있는지에 대해 이야기했습니다. 이 장에서는 머신러닝의 주요 개념에 대해 알아보겠습니다. 그런데 왜 알고리즘이 아니라 개념이나 이론을 알아야 하는 걸까요? 머신러닝을 도입한다는 것 은 단순히 프로그램에 새로운 기능을 추가하거나 좀 더 빠른 알고리즘을 도입하는 것과는 다릅 니다. 머신러닝은 보유한 데이터의 성격이나 양, 품질에 따라서 결과가 달라지기 때문입니다. 머신러닝 시스템이 기계라면 데이터는 그 기계의 연료입니다. 맞지 않는 연료를 넣거나 양이 적 절하지 않으면 기계가 고장나게 되지요. 머신러닝 시스템을 구축하는 과정은 탐구의 연속입니다. 보유한 데이터가 어떤 성질을 가지는 지, 그 데이터에 맞는 머신러닝 기법은 무엇인지, 어떻게 해야 적합한 데이터를 얻을 수 있는지, 실제로 시스템을 구현해보니 기대했던 성능이 나오지 않는 이유는 무엇인지에 대한 해답을 찾 아가는 과정입니다. 여러 기법을 시도해보고 실패하고 수정하는 과정에서 좋은 머신러닝 시스 템을 만들게 됩니다. 이런 탐구 과정에서 시행착오는 필연입니다. 머신러닝 이론을 알면 ‘왜’와 ‘어떻게’에 해당하는 문제를 좀 더 쉽고 효율적으로 진행할 수 있어 더 좋은 성능의 시스템을 구축할 수 있게 됩니다. 이론이 다소 어렵거나 지루하다면 구체적으로 구현 방법을 설명하는 3부 ‘머신러닝 시스템 구 현’을 먼저 살펴본 후 다시 돌아와서 읽어도 좋습니다. 이 장에서 다룰 머신러닝의 4가지 핵심 개념은 다음과 같습니다.

2장 머신러닝의 주요 개념

47


모델 : 데이터를 바라보는 시점과 가정

손실함수 : 모델의 수식화된 학습목표

최적화 : 손실함수로 표현된 모델을 실제로 학습

모델 평가 : 모델의 성능이 실제 상황에서 어떨지 추정

2.1 모델 : 문제를 바라보는 관점 모델은 머신러닝의 시작점이라고도 할 수 있습니다. 이제부터 모델의 정의와 분류, 좋은 모델의 특징에 대해 알아보겠습니다.

2.1.1 모델이란? 데이터 분석을 하거나 머신러닝으로 문제를 해결하려면 무엇부터 해야 할까요? ‘데이터가 어떤 패턴을 가지지 않을까? 그 패턴들을 이용하면 어떻게든 되지 않을까?’ 여러 생각이 들 겁니다. 그런데 패턴이 있기는 할까요? 사실 패턴이 있을 것이라는 생각도 어찌 보면 데이터 자체에 대 한 믿음입니다. 그러한 믿음을 수학에서는 가정이라고 합니다. 이러한 여러 가정을 한데 모은 것 을 머신러닝에서는 모델이라고 합니다. 쉽게 말해 현재 상태를 어떠한 시각으로 바라보고 어떠한 기대를 하고 있는가 하는 것이 모델입 니다. 그렇다면 모델은 머신러닝에서 어떤 역할을 할까요? 일반적으로 머신러닝의 과정은 다음 과 같습니다. 그림 2-1 머신러닝의 과정

모델 정하기

모델 수식화하기

모델 학습하기

모델 평가하기

필요에 따라 반복

48

1부 머신러닝 기초 지식


1. 모델 정하기(데이터가 어떻게 생겼을지 가정하기) 2. 모델의 학습 목표를 수식화하기 3. 실제 데이터로 모델 학습하기(최적화) 4. 평가하기

그런데 과정 1에서 데이터가 어떻게 생겼을지 이미 가정을 해놓고 왜 또 과정 3에서 실제 데이 터로 학습이 필요할까요? 예를 들어 과정 1의 가정이 다음과 같다고 합시다. “이 데이터에서 x 와 y 는 선형적인 상관관계를 가진다. 즉, 임의의 w 에 대해 y = wx 와 같 은 관계를 가질 것이다.” 그렇다면 과정 3의 가정은 다음과 같을 수 있습니다. “데이터를 토대로 추측해본 결과 y = 2x 와 같은 형태를 가진다. 즉, 데이터에 가장 잘 맞 는 w는 2 다.” 모델이란 가정에 따라 생성될 수 있는 함수들의 집합입니다. 이런 의미에서 보면 ‘모델이 바뀐 다’는 것은 어떤 함수의 꼴이 완전히 달라진다는 겁니다. 정해진 함수(위에서는 y = wx ) 안에 서 함수의 파라미터(여기서는 w )를 데이터를 통해 추측하는 것을 학습이라고 합니다. 머신러 닝의 러닝 learning 이 바로 이 학습을 뜻합니다. 그리고 학습이라는 것은 그 모델이 표현하는 함 수 집합 중에서 가장 데이터에 적합한 함수를 고르는 과정입니다. 더 자세한 내용은 2.1.2절~ 2.1.5절에서 예제와 함께 설명하겠습니다. 지금은 모델에 대해 다 음 2가지만 기억하세요. 1. 모델은 데이터를 어떻게 바라볼지에 대한 가정(통계학 용어로는 믿음 belief 이라고 함)입니다. 2. 모델은 머신러닝의 시작점입니다.

이제부터 모델을 ‘간단한 모델’, ‘복잡한 모델’, ‘구조가 있는 모델’로 분류하여 알아보겠습니다. 좋은 모델이란 무엇인지, 그리고 좋은 모델을 얻기 위한 ‘편향-분산 트레이드오프’와 ‘정규화’에 대해서도 알아보겠습니다.

2장 머신러닝의 주요 개념

49


2.1.2 간단한 모델 모델이 ‘간단하다’는 말은 ‘데이터의 구조가 간단하다’는 뜻입니다. 이는 ‘굉장히 강력한 가정’을 한다고 해석할 수 있습니다. 가장 간단하지만 아주 효과적인 모델로 선형 모델 linear model 이 있습니다. 선형 회귀 linear regression 라는 말을 아마 많이 들어보았을 겁니다. 선형 회귀는 대표적인 선형 모델입니다. 예측할 결괏값 을 y 라 하고 예측에 사용하는 값을 x1 , x2 , 라 합시다. 다음 [그림 2-2]는 선형 회귀의 한 예입 니다. 그림 2-2 선형 회귀. 데이터(x )로 학습된 모델(점선). 수식은 y = - 5 + 0.4x 1

선형 회귀 정의는 다음과 같습니다. 수식 : y = w 0 + w 1 x 1 + w 2 x 2 + 

출력값( y )이 입력값(피처) ( x 1 , x 2 ,  )에 대해 선형적인 관계

위 그림은 w0 = - 5, w1 = 0.4인 예로 볼 수 있습니다(피처 하나( x1 )를 사용한 경우이므로 w 0 ,

w 1만 존재합니다).

50

1부 머신러닝 기초 지식


선형 관계는 출력값이 입력값(피처값)들에 가중치를 곱한 값의 합(선형 결합)으로 표현되는 관계입니다. 한 가지 속성(x1 )이 1만큼 증가하면 결괏값은 w1 만큼 증가합니다. 감소하는 경우 에는 w 1 만큼 감소합니다. [그림 2-2]의 경우 w1 = 0.4이므로 x가 1만큼 증가할 때 y 는 0.4만큼 증가합니다. 이러한 선형적인 관계는 많은 곳에서 찾을 수 있습니다. 예를 들어 제품의 생산량 ( x )과 불량품 수( y )를 들 수 있습니다. 생산량과 불량품 수는 일반적으로 양의 상관관계인 경 우가 많으므로 선형 회귀 모델이 아주 적합합니다. 이러한 선형 회귀 예시와 같이, 간단한 모델은 이해하기가 쉽다는 장점이 있습니다. 또한 간단 한 모델은 일반적으로 데이터를 간단하게 설명하려 하기 때문에 가정 자체에 제약이 많고 데이 터의 변화에 비해 모델 자체의 변화폭 variance (분산)이 적습니다. 모델 자체의 변화폭이 적으므 로 예외 데이터가 들어와도 영향을 적게 받기 때문에 신경을 써야 할 부분이 적습니다. 간단한 모델의 단점은 무엇일까요? 간단한 모델은 복잡한 관계를 학습할 수 없습니다. 입출력 데이터의 관계가 단순한 선형 관계가 아니면 어떻게 될까요? 예를 들어 w0 x1 /(w1 + x1 ) 같은 관계 말이죠. 당연히 간단한 모델로 복잡한 데이터를 제대로 표현하지 못할 겁니다. ‘간단한 모델’은 다음과 같이 간단히 정리할 수 있습니다. 데이터가 복잡하지 않고 간단하게 생겼다고 가정합니다.

결과를 이해하기 쉽습니다.

학습이 쉽습니다.

가정 자체가 강력해서 모델의 표현 능력에 제약이 많습니다.

2.1.3 복잡한 모델 앞서 설명한 간단한 모델에 비해 복잡한 모델은 데이터가 상대적으로 더 복잡하게 생겼다고 가 정할 때 사용하는 모델입니다. 물론 간단하고 복잡한 것은 상대적인 구분이지만, 복잡한 모델은 모델의 유연성을 더 중요시합니다. 예를 들어 결정 트리 decision tree 모델을 들 수 있습니다. 다음 그림은 결정 트리의 예입니다.

2장 머신러닝의 주요 개념

51


그림 2-3 결정 트리의 예

x2  3

x1 ≥ 3

x 4  2.5

x 5  −1

y3

x 3  2.5

x 5  0.1

x4  1

y2

y1

x3  1

x 1  1.5

y4

y6

결정 트리의 정의는 다음과 같습니다. 트리의 한 분기점마다 한 가지 조건(보통 입력의 한 부분)을 검사하여 분기를 합니다.

모든 분기가 끝나는 리프노드(맨 끝의 노드)에는 결괏값이 들어 있습니다.

결정 트리는 선형 모델과 달리 복수의 비교식으로 정의됩니다. 그리고 이 비교식은 무수히 늘어 날 수 있기 때문에 더 일반적이고 유연한 가정을 할 수 있습니다. 예를 들어 앞서 설명한 선형 모 델도 결정 트리로 구현할 수 있습니다. 각 분기점마다 모든 값에 대한 결과를 작성해서 결과를 저장하면 되니까요. 복잡한 모델은 간단한 모델에 비해 전체 데이터에 대한 일괄적인 가정이 적 습니다. 예를 들어 결정 트리는 데이터 전체에 대한 가정이 거의 없다시피 합니다. 그렇다면 왜 모든 걸 포함할 수 있는 복잡한 모델을 사용하지 않고 간단한 모델을 사용하는 걸까요. 2.1.5절 ‘좋은 모델이란 무엇인가?’에서 설명합니다. 복잡한 모델의 가장 큰 장점은 복잡한 데이터의 모델링에 적합하다는 겁니다. 결정 트리처럼 유 연성이 뛰어난 모델은 많은 종류의 데이터를 모델링할 수 있습니다. 하지만 데이터의 모든 부분 에 대해 일일이 가정을 만듦으로써 불필요한 노이즈까지 학습하여 성능이 나빠질 수 있습니다.

52

1부 머신러닝 기초 지식


CHAPTER

3

데이터와 문제

데이터는 머신러닝에서 정말 중요합니다. 머신러닝은 데이터를 이용해서 문제를 해결하기 때문 에 데이터의 중요성은 몇 번이고 강조해도 부족하지 않습니다. 머신러닝으로 문제를 풀 때는 데 이터형, 품질, 양에 따라 고려해야 할 점이 달라집니다. ‘풀고자 하는 문제 유형’ 역시 중요합니 다. 어떤 문제를 풀지에 따라 고민거리가 달라지기 때문입니다. 이 장에서는 데이터와 풀고자 하 는 문제 유형에 대해 알아봅니다. 데이터형에 따라 머신러닝에서 고려해야 할 점

데이터양과 품질이 달라질 때 고려해야 할 점

데이터에 치우침이 있을 때 표준화하여 효율적으로 학습하는 방법

머신러닝 문제 유형과 다양한 기법

3.1 데이터형 데이터에도 유형이 있을까요? 있다면 머신러닝과 데이터형 간에는 어떤 연관이 있을까요? 이 절에서는 데이터형별 특징을 살펴보고 각각의 특징에 따라 어떤 머신러닝 기법을 사용하는지 살펴보겠습니다. 2장에서 설명한 바와 같이 머신러닝의 모델을 결정하는 것은 데이터에 대한 믿음(가정)입니다. 만일 우리가 다루는 데이터가 어떤 유형인지 알고 있다면 당연히 모델을 선 택하는 일도 쉬워질 겁니다. 그리고 거의 대부분의 경우 데이터양이나 품질 때문에 생기는 고민 에 비해 데이터형에 의한 고민은 쉽게 해결할 수 있습니다.

3장 데이터와 문제

83


3.1.1 텍스트 데이터 텍스트 데이터는 다른 데이터에 비해 쉽게 구할 수 있습니다. 예를 들어 위키피디아 덤프 파일이 라든가 전자책 등 다양한 유형의 공개 텍스트 데이터가 있습니다. 또한 데이터의 의미 단위가 개 별 단어나 연속하는 단어로 이루어져 있으므로 다른 데이터에 비해 의미 단위를 조각내기도 쉽 습니다. 하지만 단위 데이터를 쉽게 조각내기 힘든 이미지 데이터나 음성 데이터와 달리 의미를 파악하려면 단어 간의 관계를 유추하거나 문법을 분석해야 합니다. 또한 의미 단위인 단어의 유 형이 너무 다양하다는 문제도 있습니다. 텍스트 분석이 언뜻 보면 쉬워 보이지만 이러한 문제들 때문에 사실은 굉장히 까다롭습니다. 특히 행렬을 이용해서 문서의 단어 분포를 표현하는 경우에는 존재하는 단어에 비해 문서에 나 타나는 단어가 적으므로 행렬의 원소 대부분이 0인 상황이 많이 발생합니다(5.1.1.1절 ‘단어 빈도 피처’ 참조). 이런 경우 데이터가 굉장히 희박 sparse 하다고 표현하며, 이러한 희박한 데이 터를 이용하여 머신러닝을 하면 모델 학습이 잘못되어 실전 성능이 제대로 나오지 않게 됩니다. 그렇기 때문에 텍스트를 모델링하려면 이러한 상황을 해결해야 합니다. 또한 텍스트 데이터는 순서가 중요합니다. 순서에 따른 의미 변화를 모델링하기 위해서는 순차 모델 머신러닝 기법(2.1.4.1절 ‘순차 모델’ 참조)을 사용해야 합니다.

3.1.2 수치 데이터 수치 데이터는 금융, 생산 공정, 관측 장치 등으로부터 얻을 수 있습니다. 많은 양을 쉽게 얻을 수 있지만 항상 노이즈가 섞여 있습니다. 노이즈가 생기는 이유는 다양하지만 일반적으로는 센 서 노이즈와 현상의 무작위성이 원인입니다. 그렇기 때문에 수치 데이터 분석에는 노이즈에 강 한 머신러닝 기법을 사용합니다. 수치 데이터는 대부분 숫자 피처를 가지기 때문에 텍스트에 비해 데이터 밀도가 높습니다. 그 렇기 때문에 텍스트 데이터와는 다른 방식으로 접근해야 합니다. 텍스트 데이터와 비슷하게 데이터의 순서가 중요한 수치 데이터도 있습니다. 예를 들면 주식 데 이터를 생각해볼 수 있는데, 굉장히 노이즈가 많기 때문에 노이즈에 강한 순차 모델, 예를 들면 칼만 필터 Kalman Filter 와 같은 모델을 사용합니다.

84

2부 머신러닝 주요 모델


3.1.3 이미지 데이터 이미지 데이터는 최근 들어 주목받고 있습니다. 스마트폰, 디지털 카메라, 사진 및 동영상 공유 서비스가 발전함에 의해 사용할 수 있는 데이터양이 급격하게 늘어났고, 이는 데이터양이 많을 수록 성능이 향상되는 딥러닝을 이용한 모델이 전에 없던 성능을 낼 수 있게 해주었기 때문입 니다. 이미지 데이터의 가장 큰 특징은 값(색상, 채도, 명도 등)과 위치에 따라 점의 의미가 달라진다 는 겁니다. 예를 들어 [그림 3-1]과 같은 사과 이미지가 있다고 합시다. 그림 3-1 작은 사과 이미지를 픽셀이 잘 보이도록 확대한 모습

이미지 데이터는 각 구역을 픽셀로 쪼개어 표현하게 되는데, 주변 픽셀에 따라 한 픽셀이 갖는 값의 의미가 달라집니다. 예를 들어 검은 구역이 있을 경우, 주변이 모두 검은 구역이면 사과의 가운데, 오른쪽 옆이 흰 구역이면 사과의 가장자리가 되는 식이죠. 이렇게 픽셀 데이터가 근접한 픽셀 데이터와 강한 연관 관계를 가지는 것이 이미지 데이터의 가장 큰 특징입니다. 이러한 근접 연관성을 효과적으로 모델링하는 데는 2.1.4.2절 ‘그래프 모델’에서 다룬 구조 모 델 등을 사용합니다. 예를 들어 대표적인 딥러닝 기법인 CNN Convolutional Neural Network 은 한 픽 셀과 그 주변 픽셀의 값을 동시에 고려하여 피처를 생성합니다. 자세한 내용은 7.4절 ‘딥러닝을 이용한 이미지 인식’에서 설명하겠습니다. 비디오 데이터도 머신러닝에 사용됩니다. 예를 들어 비디오를 이용한 머신러닝을 할 경우, 비 디오를 연속되는 이미지로 분할하여 사용하게 됩니다. 이때 연속된 이미지가 어떤 장면을 나타

3장 데이터와 문제

85


내는지 학습하기 위해 앞서 설명한 구조 모델을 확장시켜 화면의 위치 근접도와 시간 근접도를 복합적으로 사용하는 기법이 적합합니다.

3.1.4 음성 데이터 음성 데이터는 수치 데이터와 많은 부분에서 비슷합니다. 노이즈가 많으며 특히 시간에 따른 변 화가 중요하기 때문에 시간에 따른 변화를 모델링할 수 있는 머신러닝 기법이 사용됩니다. 하지 만 몇 가지 주목할 점이 있습니다. 음성 데이터는 소리에 관한 데이터이므로 일반적으로 소리의 높낮이나 음색을 신호 처리 기법 으로 전처리한 후에 사용하게 됩니다. 대표적인 기법으로는 스펙트로그램 spectrogram 이나 퓨리에 Fourier

피처 등이 있습니다. 이러한 신호 처리 기법을 적용하여 얻은 피처와 원래 신호를 조합하

여 머신러닝을 하는 경우가 많습니다. 또한 데이터를 수집할 때 보통 한 가지 소리만 깔끔하게 얻는 경우는 많지 않습니다. 그래서 녹 음된 소리를 여러 가지 소리로 나누는 머신러닝 기법을 사용한 이후에 앞서 언급한 기법을 일반 적으로 사용합니다.

3.1.5 복합 데이터 복합 데이터는 다양한 유형의 데이터가 섞여 있는 것을 말합니다. 단순하게 생각하면 데이터의 특성에 따라 각기 다른 머신러닝 기법을 적용하여 분석을 할 수도 있지만, 연관 관계를 이용해서 여러 기법을 한번에 학습시키는 방법도 생각할 수 있습니다. 예를 들어 비디오(이미지 데이터, 음성 데이터)와 자막(텍스트 데이터)이 동시에 입력으로 들 어오는 경우를 생각할 수 있습니다. 시간대별 이미지, 음성, 자막이 연관 관계를 가지고 있기 때 문에 이러한 연관 관계를 한번에 학습할 수 있는 기법을 사용하면 각각을 따로 처리하는 것보다 더 좋은 결과를 얻을 수 있습니다. 최근에 각광받는 방법으로는 이미지 분류와 자막 분류를 하는 신경망 모델을 동시에 중간 레이어를 공유해서 학습합니다. 그 결과로 이미지를 입력하면 그 이 미지에 무엇이 있는지 텍스트로 설명할 수 있습니다.1 1 http://www.nature.com/nature/journal/v521/n7553/fig_tab/nature14539_F3.html 참고

86

2부 머신러닝 주요 모델


3.2 데이터양과 품질 데이터양과 품질은 유형만큼이나 머신러닝 기법의 선택과 적용에 큰 영향을 끼칩니다. 이미 2장 에서 간단히 설명했지만 여기서는 머신러닝을 실제로 적용할 때의 고려 사항을 자세히 살펴보겠 습니다.

3.2.1 데이터양과 머신러닝의 연관성 모든 머신러닝 기법은 데이터가 적으면 유용한 학습 결과를 얻기 힘듭니다. 그렇기 때문에 데이 터를 많이 모으는 것은 굉장히 중요합니다. 하지만 데이터가 많더라도 특정 항목(레이블)에 대 한 데이터가 적으면 해당 부분에 대해서는 학습이 제대로 되지 않을 수 있습니다. 이 문제는 이 미지 태깅처럼 분류 항목 수가 굉장히 많은 경우에 빈번히 발생합니다. 구체적으로 다음 세 경 우를 들 수 있습니다. 데이터의 레이블을 얻기 굉장히 어려운 경우 사람이 일일이 예측 결과(예를 들면 이미지 태깅이나 문법 파싱)를 제공하는 경우에는 큰 비용 이 들기 때문에 데이터의 레이블을 얻기 어렵습니다. 이런 경우에는 학습이 잘되지 않은 부분을 머신러닝 시스템이 사람에게 질문하는 방식으로 학습 성능을 높이는 액티브 러닝 active learning 기 법을 사용하는 것도 좋습니다. 데이터양은 많지만 특정 레이블의 데이터가 부족한 경우 데이터가 전체적으로는 많지만 레이블 유형이 다양해서 어떤 레이블은 굉장히 적은 수의 데이 터만 가지는 경우입니다. 사람이 레이블을 태깅하는 경우에는 특정 레이블로의 쏠림이 더 많이 발생해서 이 현상이 더 심각해지는 경우가 많습니다. 균형이 맞지 않게 되면 손실함수는 데이터 가 많은 레이블에 집중하고 나머지를 무시하기 때문에(2.4.3절 ‘정밀도와 포괄성’ 참조) 균형 잡힌 성능을 보여주지 못합니다. 이를 해결하려면 데이터양이 많은 레이블에서 임의로 데이터를 누락시켜(과소표집) 데이터의 균형을 맞추거나, 데이터가 적은 경우에도 잘 동작하는 원샷러닝 one-shot learning (또는 원샷학습) 등의 기법을 사용할 수 있습니다. 데이터를 한 번만 보고 학습이 가능하다고 해서 원샷러닝이 라고 부릅니다.

3장 데이터와 문제

87


데이터양은 많지만 특정 경우의 데이터가 아예 없는 경우 데이터가 들어오는데 새로운 레이블이 끊임없이 생성되는 경우에는 제로샷러닝 zero-shot learning (또는 제로샷학습)을 사용합니다. 대표적인 제로샷러닝 기법으로 다른 형식의 데이터를 이용해 서 유사도를 판별하여 새로운 레이블을 학습 데이터 없이 예측하는 방법이 있습니다. 예를 들어 비디오와 자막이 입력으로 주어지는 경우 자막의 유사도를 판단하여 이미지의 내용을 추측하는 방식을 사용할 수 있습니다.

3.2.2 데이터 품질과 머신러닝의 연관성 데이터양뿐만 아니라 품질도 머신러닝 기법 선택에 영향을 미칩니다. 데이터 품질은 노이즈양에 가장 크게 영향을 받습니다. 유용한 피처와 함께 레이블이 주어졌을 때 레이블의 무작위성에 따 라 머신러닝 기법이 달라집니다. 데이터 품질에 따른 고려 사항은 다음과 같습니다. 관측 데이터에 노이즈가 많은 경우 무작위성이 높아 노이즈가 많은 경우는 수치 데이터에서 굉장히 빈번하게 발생합니다. 데이터 양이 적으면 성능에 더 큰 영향을 주는데, 이를 해결하려면 2.1.2절에서 다룬 ‘간단한 모델’을 사용합니다. 간단한 모델은 가정이 강합니다. 이 모델은 유연하지 않고 노이즈에 강하기 때문에 이 경우에 적합한 모델이라고 볼 수 있습니다. 노이즈 자체를 가정에 두는 칼만 필터 같은 모델 도 많이 이용됩니다. 레이블이 일정하지 않은 경우 크라우드 소싱이나 여러 사람이 수작업으로 레이블링하는 경우에는 작업자의 데이터나 레이블 에 대한 해석 차이로 레이블이 통일되지 않을 수 있습니다. 예를 들어 단어가 긍정적인지 부정적 인지 수치로 나타내는 작업을 여럿이서 한다고 가정합시다. A는 전반적으로 점수를 낮게 주고

B는 높게 주었다고 합시다. 이런 경우에는 평가자로 인한 편차를 줄이는 전처리 작업이 필요합 니다. 수치값이라면 레이블의 평균과 분산을 구해서 맞춰주는 경우가 일반적이고, 여러 항목에 서 고르는 작업의 경우에는 몇 명 이상이 동일한 항목을 고른 경우에만 그 값을 활용하는 방법이 있습니다. 즉, 전처리 작업을 한 후에 머신러닝을 적용합니다.

88

2부 머신러닝 주요 모델


CHAPTER

4

구매 이력 데이터를 이용한 사용자 그룹 만들기

이 장에서는 사용자 그룹을 만드는 방법을 알아보겠습니다. 온라인 상거래 사이트는 사용자를 그룹으로 나누어 캠페인, 세일 등의 마케팅 전략을 세웁니다. 예를 들어 디비디와 블루레이를 판 매하는 사이트에 20대 남성이 많을 경우, 20대 남성이 좋아할 만한 영화를 적극 프로모션하는 식입니다. ‘20대 남성’과 같은 성별 및 연령 정보 말고도 구매 이력을 이용하여 그룹을 만들 수 도 있습니다. 예를 들어 마블 슈퍼히어로 영화를 구매하는 마블팬 그룹 같은 것 말이죠. 그러려 면 제일 먼저 사용자의 구매 이력을 살펴볼 필요가 있습니다. [표 4-1]은 가상의 사용자 구매 이 력 데이터입니다. 표 4-1 사용자 구매 이력 데이터 피처

피처값

사용자 ID

abdc

구매일시

2017/04/01

구매상품명

[Blu - ray] 캡틴 아메리카: 시빌 워 2D + 3D Combo (2Disc )

구매상품 가격

30000

구매상품 수

1

구매상품 카테고리

DVD/블루레이

이 데이터를 이용해서 사용자의 구매 패턴을 정의해봅시다. 일반회원/VIP (구매 횟수 및 구매 총액), 정기구매회원/단발성회원(구매 횟수), 가전제품구매자/생활용품구매자(구매상품 카 테고리), 저가 상품 구매자(구매상품 가격의 평균), 마블팬(구매상품명) 등 하나의 데이터셋

4장 구매 이력 데이터를 이용한 사용자 그룹 만들기

99


으로 무수한 패턴을 정의할 수 있습니다. 2장에서 설명한 대로 모델을 만들어 문제를 풀 경우 각 패턴에 대해 일일이 모델을 만들어야 합니다. 여기에 사용자의 성별, 연령, 주소 등 사용자 정 보까지 더해지면 계산이 매우 복잡해집니다. 어쩌면 우리가 상상도 할 수 없는 패턴이 존재할 수 있습니다. 이와 같이 ‘사용자 그룹 만들기’는 수학적 모델을 만들기 어려운 대표적인 문제입 니다. 이 문제를 푸는 방법으로 군집화에 대해 알아보겠습니다.

4.1 군집화 데이터 특징을 이용한 그룹핑 문제에서는 특정 패턴을 정의하여 모델을 만드는 방법보다는 비 슷한 데이터를 한데 모으는 방법이 더 효율적입니다. 이 방법을 군집화라고 합니다. 이 방법은 미리 그룹을 정의하지 않기 때문에 비지도학습에 속합니다. 크게 중심 기반 군집화, 계층적 군집 화, 밀도 기반 군집화로 나눌 수 있습니다. 다음은 각 방법에 대한 간단한 소개입니다. 중심 기반 군집화 prototype-based clustering : 클러스터를 클러스터 중심점으로 정의하는 기법입니다(4.2절).

계층적 군집화 hierarchical clustering : 클러스터의 크기에 따라 클러스터의 계층을 정의하고 계층의 상하위를 이용

하는 기법입니다(4.3절). 밀도 기반 군집화 density-based clustering : 클러스터를 데이터가 높은 밀도로 모여 있는 공간으로 보는 기법입니

다(4.4절).

군집화의 핵심 아이디어는 비슷한 데이터를 한데 묶는다는 겁니다. 그렇다면 비슷하다는 것, 즉 유사도가 높다는 것은 무슨 의미일까요? 데이터를 이루는 피처값이 비슷하다는 겁니다. 사용자 구매 이력을 생각해보면, 비슷한 상품을 구매하는 사용자를 한데 묶을 수 있습니다. 또한 비슷한 연령대 사용자를 한데 묶을 수도 있습니다. 예를 들면 X는 사용자 1, Y는 사용자 2를 의미하고, 데이터 X를 X = {x1 , x2 , x3 ... xm }으로, 데 이터 Y를 Y = {y1 , y2 , y3 ... ym }으로 정의합니다. 여기서 m 은 피처 수입니다. [표 4-1]을 기준 으로 예를 들어보면 x1 과 y1 은 구매상품 개수, x2 와 y2 는 구매상품명 등으로 생각할 수 있습니 다. 그럼 각 피처의 차이의 총합

m

i 1

( xi − yi )가 적을수록 비슷한 사용자라고 할 수 있습니다.

하지만 단순히 차이를 전부 합하면 한 피처에 대해 +가 나오고, 다른 한 피처에 대해 -가 나오 면 두 데이터 사이의 피처값이 많이 다름에도 불구하고 전체 합이 0이 될 수 있습니다. 따라서 단순한 차이 대신 그 차이를 제곱한 값을 더하여 얻어진 값에 루트를 사용합니다. 수학적 정의 는 다음과 같습니다. 100 2부 머신러닝 주요 모델


식 4-1 유클리드 거리(민코스키 거리의 특수한 경우)

d ( X ,Y ) 

m i 1

(xi − yi )2  X − Y

그러고 보니 이 식은 두 점 사이의 최단 거리인 유클리드 거리 Euclidean distance 를 구하는 식과 같습 니다. 일반적으로 유클리드 거리를 구하는 식은 계산의 편의를 위해 위 식을 제곱(제곱유클리드 거리 squared Euclidean distance )하여 사용합니다. 제곱유클리드 거리 =

m i 1

(xi − yi )2  X − Y

2

여기서 궁금한 점이 생깁니다. 가격 2만원과 1만원의 차이인 10000이, 연령 25세와 24세의 차 이인 1과 같다고 할 수 있을까요? 또 연령의 차이를 뺄셈으로 구하는 건 이해가 되는데, 상품 명의 차이는 어떻게 구할까요? 성별의 차이는 수학적으로 표현할 수 있을까요? 이에 대해서는

3.3절 ‘데이터 표준화’에서 살펴본 데이터 표준화 방법을 적용하면 됩니다. 또한 [식 4-1]에서 차이값을 제곱하지 않고 그냥 절댓값을 취하면 어떻게 될까요? 이에 대해서는 4.5절 ‘유사도 계 산’에서 자세히 살펴보겠습니다.

4.2 K-중심 군집화 이 절에서는 중심 기반 군집화의 대표적인 예인 K-중심 군집화 K-centroid clustering, K-medoid clustering 에 대해 알아보겠습니다. 중심 기반 군집화는 클러스터 중심점을 정한 후 클러스터 중심점에 가 까운 데이터들을 모아가며 클러스터를 확장하는 방법이므로 군집화 초기에 몇 개의 중심점을 어 떻게 배치하는가가 중요합니다. K-중심 군집화는 초기에 K 개의 중심점을 랜덤으로 선택하여 군집화를 시작합니다. 중심 기반 군집화에서는 클러스터 수 K 와 함께 클러스터 중심을 어떻게 구하느냐를 정할 필 요가 있습니다. 여러 데이터를 요약하는 방법으로 평균 mean , 대푯값 median , 최빈값 mode 이 있다 는 것은 아실 겁니다(중학교 때 변량, 도수 등을 배운 것 기억하시죠? ). 클러스터 안의 데이터 의 평균값을 중심으로 사용할 경우 K-평균 군집화, 대푯값을 사용할 경우 K-대푯값 군집화 K-medians clustering

, 최빈값을 사용할 경우 K-최빈값 군집화 K-modes clustering 라고 합니다. 3가지 방

법 모두 중심점을 고르는 방법이 다를 뿐 전체 군집화 과정은 동일합니다.

4장 구매 이력 데이터를 이용한 사용자 그룹 만들기 101


K-중심 군집화는 다음 절차를 거칩니다. 1. 임의로 뽑은 K 개의 데이터를 중심으로 하는 클러스터를 만듭니다(각 클러스터가 데이터 하나씩만 가지고 있 습니다). 2. 각 데이터와 클러스터 중심 간의 거리를 계산합니다. 3. 데이터와 클러스터 중심 간의 거리가 가장 짧은 클러스터에 데이터를 할당하고 이 데이터를 포함하여 클러스 터 중심을 업데이트합니다. 4. 과정 2와 3을 반복하는데, 과정 3에서 더 이상 중심의 위치가 변하지 않거나, 업데이트 전후 중심점의 차이가 사용자가 지정한 허용 오차 이내거나, 사용자가 지정한 횟수만큼 반복했으면 종료합니다.

과정 3에서는 가장 가까운 클러스터에 데이터를 할당하고 있습니다. K-중심 군집화에서 클러 스터는 클러스터 중심으로 정의되므로 결국 데이터와 클러스터 중심 사이의 거리가 가장 짧게 되는 클러스터를 찾는 것입니다. [식 4-2]를 이용하여 거리를 구할 수 있습니다. 식 4-2 클러스터 안의 데이터와 클러스터 중심 간의 거리

x − µc

2

x : 데이터

m c : 클러스터 C의 중심점 군집화는 각 데이터에 대해 [식 4-2]의 값을 최소화하는 것이 목적입니다. 그런데 [식 4-2]를 자 세히 보면 2.2.1절 ‘산술 손실함수’에서 살펴본 제곱 손실함수와 같은 형태임을 알 수 있습니다.

loss ( f )  ( y − yˆ ) 2

f : 모델 y : 데이터로부터 주어진 출력 yˆ : 모델에 데이터로부터 주어진 입력을 넣어서 계산한 값 따라서 분산 분석과 같은 제곱 손실함수에 대한 이론을 K-중심 군집화에도 적용할 수 있습니 다. K = 2일 경우의 군집화를 그림으로 살펴보겠습니다.

102 2부 머신러닝 주요 모델


그림 4-1 K-중심 군집화

1. 랜덤으로 뽑은 두 개의 점을 클러스터 i , j 의 중심 µ i , µ j로 지정합니다.

μj

μi 클러스터 i 클러스터 i

클러스터 j 클러스터 j

2. 검은 점을 클러스터 i 와 j 중 어느 쪽에 할당할지 판단하기 위해 더 가까운 중심을 찾습니다.

μj

μi 클러스터 i

클러스터 j

클러스터 i 더 가까우므로 클러스터 i 에 할당하고 클러스터의 중심을 갱신합니다.클러스터 j 3. 검은 점이 µ i 에

μj

μi 클러스터 i

클러스터 i

4. 모든 점에 대해 과정 2와 3을 반복합니다.

클러스터 j

μj

μi 클러스터 i 클러스터 i

클러스터 j

클러스터 j 클러스터 j 4장 구매 이력 데이터를 이용한 사용자 그룹 만들기 103


과정 4에서 업데이트가 없으면 군집화를 종료한다고 했는데, 이는 각 데이터가 속한 클러스터 가 변하지 않는 것, 즉 수렴한다는 것을 의미합니다. 하지만 수렴되기까지 상당한 시간이 걸리 므로 실제로는 이전 단계의 총제곱합과 새로 얻은 총제곱합의 차이가 허용오차보다 작거나, 클 러스터 중심 업데이트의 횟수가 사용자가 지정한 반복 횟수 이상이면 군집화를 종료합니다. 클러스터 수 K , 허용 오차, 반복 횟수 모두 사용자가 지정하는 파라미터이므로 군집화 결과를 보면서 바꾸어 가며 시도해야 데이터를 잘 표현하는 그룹을 만들 수 있습니다. 이에 대해서는

10장에서 실제 구현을 통해 설명하겠습니다.

4.3 계층적 군집화 계층적 군집화에서의 계층은 클러스터의 계층을 의미합니다. 최상위 계층의 클러스터는 모든 데 이터를 포함하는 하나의 클러스터입니다. 최하위 계층의 클러스터는 단 하나의 데이터만을 포 함하므로 클러스터 수가 데이터 수와 같게 됩니다. 계층적 군집화에는 하향식인 분할적 군집화와 상향식인 집괴적 군집화가 있습니다. 사용자가 클러스터 수 K 를 명시적으로 지정하는 K-중심 군집화와는 달리 계층적 군집화는 클러스터 수 를 지정할 필요가 없습니다. 계층적 군집화는 각 단계마다 한 쌍의 클러스터를 비교하는데, 하향식인 분할적 군집화는 각 계 층의 클러스터들을 둘로 쪼개어 하위 계층으로 진행하고, 상향식인 집괴적 군집화는 각 계층의 클러스터들 중에서 가장 가까운 두 개를 하나로 합쳐 상위 계층의 클러스터를 만들어갑니다. [그림 4-2]는 이를 시각화한 것입니다.

104 2부 머신러닝 주요 모델


CHAPTER

5

문서 분석 시스템 만들기

문서 분석 시스템은 말 그대로 문서를 분석해서 유용한 정보를 얻어내는 시스템입니다. 문서의 내용을 분석해서 분류하거나, 문서의 주제를 추출하거나, 문법 분석을 해서 문장 구조를 파악 하거나, 고유명사를 추출하는 등의 용도로 사용합니다. 문서 데이터는 다른 데이터보다 구하기 쉽고 종류도 굉장히 많습니다. 내용에 관계없이 대량의 텍스트가 필요하다면 웹페이지, 잘 정리 된 백과사전 자료는 위키백과, 사용자 간의 사회활동 정보는 트위터, 상품에 대한 평가는 쇼핑몰 댓글에서 얻을 수 있습니다. 이렇게 많은 문서 데이터가 존재하는 이유는 인터넷에서의 소통이 대부분 텍스트를 통해 이루어지기 때문입니다. 따라서 문서의 내용을 분석하여 결과를 활용하 면 경쟁에서 우위를 확보하거나 통찰력을 얻을 수 있기 때문에 최근 들어 쇼핑몰, 인터넷방송사, 정부기관, 포털사이트 등 다양한 분야에서 문서 분석 시스템을 사용합니다. 하지만 3.1.1절 ‘텍스트 데이터’에서 말했듯이 문서 분석에서 좋은 성능을 얻기란 생각보다 쉽 지 않습니다. 문서의 의미라는 것은 중의적일 때도 있고, 단어가 배열된 순서에 따라 달라지며, 의미가 미묘하게 다른 단어들이 많아서 각각을 구분하기도 어렵기 때문입니다. 이런 어려움을 이겨내고 텍스트의 복잡한 의미를 파악하는 방법에 대해 알아보도록 하겠습니 다(실제 구현은 11장에서 다룹니다). 이 장에서 다루는 내용은 다음과 같습니다. 문서 분류 시스템 만들기

토픽 모델링

문법 분석

단어 임베딩

5장 문서 분석 시스템 만들기 117


5.1 문서 분류 시스템 만들기 문서 분류 document classification, document categorization 는 말 그대로 문서를 분류하는 것이 목적입니다. 예를 들어 문서를 항목별로 분류하기(도서관에서 책 분류하기), 제품 리뷰로 상품에 대한 긍 정/부정 의견 판단하기 sentiment analysis, 문서 내용을 보고 사람과 봇 중 누가 생성했는지 판단하 기 등을 들 수 있습니다. 이 절에서는 일상에서 쉽게 접할 수 있는 스팸 필터를 머신러닝을 이 용해서 만들어보겠습니다(실제 코드는 11장에서 다룹니다).

5.1.1 문서 분류에 많이 사용하는 피처 문서는 어떤 기준으로 분류할까요? ‘문서 내용을 분석해서 분류해야지’라고 생각했다면 반은 맞춘 겁니다. 문서에서는 내용, 글쓴이, 서식, 문서 구조, 문서 길이 등 여러 가지 피처를 얻을 수 있는데, 그중 문서 내용이 가장 기본이 됩니다.

5.1.1.1 단어 빈도 피처 문서 내용을 완벽하게 이해하는 머신러닝 시스템은 아직 존재하지 않습니다. 그래서 간단한 모 델을 이용하여 약간은 부정확하지만 적당한 수준의 시스템을 만든 후 많은 문서로 학습시켜 조 금씩 더 나은 좋은 결과를 만들어내는 방식이 주로 사용됩니다. 이러한 간단한 모델에 사용되는 피처의 예로는 단어 빈도 word frequency, term frequency 를 들 수 있습 니다. 이 피처는 문서에서 단어가 얼마나 자주 나오는지 측정해서 문서 내용을 파악하는 방법입 니다. 예를 들어 문서에 축구와 관련된 단어가 자주 등장한다면 그 문서를 축구와 관련된 문서 라고 여기는 것입니다. 단어 빈도는 단어가 문서에서 얼마나 나오는지 계산한 후 문서 전체 단 어 숫자로 나누어 그 비율을 계산합니다. 물론 단어가 단순히 몇 번 출현하는지 세는 단어 카운 팅 word counting 방식도 많이 사용하지만, 이 방식은 한 문서가 길고(즉, 많은 단어로 이루어져 있 고) 다른 문서가 짧을 경우(즉, 적은 단어로 이루어져 있을 경우) 공정한 비교가 어렵기 때문 에 횟수보다는 빈도를 더 많이 사용합니다. 때로는 단어의 존재 여부만 체크하는 단어 출현 word occurrence

도 유용합니다(단순히 문서를 긍정 또는 부정으로 평가할 때 의외로 좋은 성능을 보여

줍니다). 엄밀하게 정의하면 단어 빈도 피처는 다음과 같습니다.

118 2부 머신러닝 주요 모델


i번째 단어 빈도 피처

i번째 단어가 문서에 나타난 횟수 문서의 총 단어 수

즉, 단어 빈도 피처는 가능한 모든 단어(보통 단어집 vocabulary 이라고 부릅니다)의 개수만큼의 피처를 가지며 각각의 값은 단어가 문서에 나타난 횟수와 문서의 총 단어 수로 결정됩니다. [표

5-1]은 어휘집에 단어 { a, b, c }가 존재하는 경우의 예를 든 것입니다. 표 5-1 단어 빈도 피처 예제 문서 1 (a, b, c )

문서 2 (b, a, c, c )

문서 3 (c )

피처 1번 (a )

0.33

0.25

0

피처 2번 (b )

0.33

0.25

0

피처 3번 (c )

0.33

0.50

1

[표 5-1]의 문서 1은 단어 3개(a, b, c )로 이루어졌습니다. 단어가 각각 1개씩 나오고, 전체 단어 숫자가 3개이므로 피처값이 1/3, 1/3, 1/3로 정의됩니다. 문서 2는 a가 1번, b가 1번, c 가 2번 나왔기 때문에(전체 단어 수는 4겠지요? ) 피처값이 1/4, 1/4, 1/2로 정의됩니다. 한 가지 중요한 점은 b가 a보다 먼저 나왔지만 단어 빈도 피처는 순서를 구분하지 않고 숫자만 세 기 때문에 순서에 영향을 받지 않는다는 겁니다. 그리고 문서 3은 c만 1번 나왔기 때문에 세 번 째 피처만 1 값을 가지고 나머지는 0 값을 가지게 됩니다. 실제로 어휘집에서 단어 빈도를 확인 하면 문서 3처럼 대부분의 피처값이 0이 될 겁니다. 어휘집에 출현하는 단어가 굉장히 많기 때 문입니다. 문서 내에 존재하는 단어의 출현 빈도 값이 0인 문서 3과 같은 경우를 ‘희박하다’고 표현합니다 (자세한 내용은 3.1.1절 ‘텍스트 데이터’ 참조). 참고로 단어 빈도나 카운팅 피처의 경우 백-오브-워즈 bag-of-words 피처라고 부르기도 합니다.

5.1.1.2 TF-IDF 단어 빈도 피처의 한 가지 문제점은 단어 하나하나의 중요도가 동일하기 때문에 빈도수가 높은 단어를 상대적으로 중요하다고 오인할 수 있습니다. TF-IDF Term-Frequency Inverse-Document Frequency 방법을 이용하면 단어의 희귀도를 고려해서 피처를 생성할 수 있습니다. 단어의 중요도는 어떻게 결정할까요? 다음과 같은 문서가 있다고 합시다.

5장 문서 분석 시스템 만들기 119


11살 생일을 며칠 앞둔 어느 날 해리에게 초록색 잉크로 쓰여진 한 통의 편지가 배달된다. 그 편 지의 내용은 다름 아닌 해리의 11살 생일을 맞이하여 전설적인 ‘호그와트 마법학교’에서 보낸 입 학 안내장이었다... (이하 생략)1

이 문서에서 가장 많이 나오는 단어는 ‘해리’이므로 해리가 가장 중요한 단어인 것처럼 보입니 다. 하지만 해리포터 시리즈의 각 편을 다룬 기사를 구분하는 데 과연 해리라는 단어가 유용할 까요? 예를 들어 해리포터 시리즈를 다룬 기사 3편에 대해 각각 단어 수를 세어봤더니 [표 5-2]와 같 은 결과를 얻었다고 합시다. 표 5-2 기사에 따라 다르게 등장하는 단어 수에 대한 예 기사 1

기사 2

기사 3

해리

132

98

103

호그와트

90

95

55

지팡이

0

120

55

성물

0

0

49

세 기사 모두에서 ‘해리’라는 단어가 가장 많이 등장하므로, 이 세 기사를 서로 구분하는 데 해리 는 별로 중요하지 않습니다. 반면 ‘성물’은 기사 3과 나머지 기사를 구분하는 데 쓰일 수 있습니 다. 이런 식으로 각 단어가 문서(여기서는 기사)를 구분하는 데 얼마나 중요한지 고려하는 피처 가 바로 TF-IDF입니다. 여기서의 TF는 앞서 설명한 단어 빈도 Term-Frequency 를 뜻하고 IDF는 역문서 빈도 Inverse Document Frequency 를 뜻합니다.

TF-IDF 피처는 다음과 같이 계산합니다. TF- IDF = 단어 빈도 * 역문서 빈도

단어 빈도는 5.1.1.1절 ‘단어 빈도 피처’에서 설명했듯이 단어가 나온 횟수를 문서 전체에 나온 단어 수로 나눈 값입니다. 역문서 빈도는 다음과 같습니다. 가능한 모든 단어 중 i번째 IDF 피처

 log

1 출처 : 위키백과 『해리포터와 마법사의 돌』 소개문

120 2부 머신러닝 주요 모델

전체 문서 수 i번째 단어가 나타나는 문서 수


[표 5-2]에서 성물은 한 번만 나왔기 때문에 IDF가 log (3/1 )= 0.477, 해리는 모든 문서에서 나 왔기 때문에 log (3/3 )= 0.000이 됩니다. 많은 문서에서 흔하게 등장하는 단어의 IDF가 낮다 는 것을 알 수 있습니다. 각 단어의 IDF는 다음 표와 같습니다. IDF 피처값 해리

log (3/3 ) = 0.000

호그와트

log (3/3 ) = 0.000

지팡이

log (3/2 ) = 0.176

성물

log (3/1 ) = 0.477

그렇다면 TF도 계산해서 실제로 TF-IDF를 구해보도록 합시다. 문서 1에서 해리의 TF는 132 / (132 + 90 ) = 0.595고 IDF는 0이므로 TF-IDF는 0입니다. 마찬가지로 호그와트의 TF-IDF도

0입니다. 지팡이와 성물의 TF는 0이므로 문서 1의 TF-IDF 피처는 [0, 0, 0, 0]입니다. 문서 3의 TF 피처가 [0.393, 0.210, 0.210, 0.187]이므로 각각에 IDF를 곱한 TF-IDF는 [0, 0, 0.210 * 0.176, 0.198 * 0.477] = [0, 0, 0, 037, 0.094]입니다. TF-IDF 피처는 이렇게 중요한 단어에 강조를 주어 문서를 구분하는 데 도움을 줍니다. 전체적으로 자주 나오지 않는 단어의 로그값이 너무 작아서 IDF가 예외적으로 커지는 것을 막 기 위해 IDF에 약간 변형을 주어 사용하기도 합니다. 바로 log를 취하기 전에 1을 더해서 다음 과 같이 계산하는 방법입니다. 스무딩된 IDF 피처

 log 1

전체 문서 수 i번째 단어가 나타나는 문서 수

5.1.1.3 토픽 또는 군집에 기반한 피처 지금까지는 단순히 단어 출현 횟수를 세거나 그 중요도를 고려해서 피처를 정하는 방법을 알아 보았습니다. 단어 외에 더 큰 의미 단위를 이용해보면 어떨까요? 예를 들어 단어들을 군집한 후 각 문서에 나타나는 단어가 어떤 군집에 해당되는지, 혹은 각 문서가 어떤 토픽으로 구성되는 지 파악한 다음 그 토픽들이 가지는 중요도를 계산해서 피처를 만드는 방법을 생각해볼 수 있 습니다. 여기서는 이러한 방법으로 문서에서 피처를 만들 수 있다는 정도만 언급하겠습니다. 자세한 내 용은 5.2절 ‘토픽 모델링’에서 다룹니다.

5장 문서 분석 시스템 만들기 121


5.1.2 피처를 이용해서 실제로 분류하기 5.1.1절 ‘문서 분류에서 많이 사용하는 피처’에서는 문서에서 피처를 뽑아보았으며, 그를 통해 문서를 어떤 고정된 길이의 숫자로 변환시켰는데, 여기서는 그것을 이용해서 문서를 어떻게 분 류할 수 있는지 이야기해보겠습니다. 문서를 피처로 변환한 후에는 피처를 분류할 수 있는 머신러닝 기법을 사용하면 됩니다. 이 절에 서는 대표적인 문서 분류 기법인 로지스틱 회귀와 SVM에 대해 살펴보겠습니다(물론 결정 트 리 등 거의 모든 분류 기법을 사용할 수 있습니다).

5.1.2.1 로지스틱 회귀 로지스틱 회귀는 2.1.2절 ‘간단한 모델’에서 잠깐 소개했던 선형 회귀 모델에 로지스틱 함수를 적용해서 분류를 하는 기법입니다. 이 모델은 간단해서 구현이 쉬우며 좋은 성능을 내기 때문 에 자주 사용됩니다. 로지스틱 회귀는 선형 회귀와 밀접한 연관관계를 가지고 있습니다. 선형 회귀는 2.1.2절 ‘간단한 모델’에서도 잠깐 소개를 했었는데요, 주어진 입력과 출력 사이에 선형 관계가 존재한다는 가정을 합니다. 주어진 피처(xi )에 따라 다음과 같이 정의됩니다.

y  ∑ wi xi  w0 i

선형 회귀는 간단하지만 학습이 빠르고 모델이 단순함에도 불구하고 좋은 성능을 보이므로 굉 장히 널리 쓰입니다. 하지만 주어진 입력에 따라 연속적인 산술값을 출력하는 회귀 기법이기 때문에 분류를 할 때는 약간 변형시켜 사용해야 합니다. 이 변형을 위해 로지스틱 함수를 이용 합니다. 로지스틱 함수는 임의의 숫자를 0에서 1 사이의 값으로 변환시키는 함수로, 다음과 같이 정의 됩니다.

σ ( x) 

1 1  e−x

로지스틱 함수의 출력값이 입력에 따라 어떻게 달라지는지 그림으로 보면 느낌이 확 올 겁니다.

122 2부 머신러닝 주요 모델


CHAPTER

6

영화 추천 시스템 만들기

영화 추천 시스템은 정보 필터링 시스템의 일종으로, 각 정보(상품, 신문기사, 친구 등)에 대 한 사용자 점수나 선호도 등을 예측합니다. 아마존을 비롯한 거의 모든 전자상거래 사이트에서 는 사용자에게 상품을 추천합니다. 뉴스 포털에서 제공하는 사용자별 추천 기사는 이제 너무나 도 익숙합니다. 이렇게 추천 시스템은 오늘날 인터넷 기반 서비스에서 없어서는 안 될 중요한 서비스를 제공합니다. 이 장에서는 그중에서 넷플릭스 프라이즈 Netflix Prize 로 널리 알려진 영화 추천 시스템에 대해 알아봅니다.

6.1 영화 추천 시스템 영화 추천 시스템은 사용자가 해당 영화에 별점을 몇 개 줄 것인지 예측하는 문제입니다. 우선 추천 시스템에 쓰일 만한 데이터를 생각해볼까요? [표 6-1]과 같이 사용자가 영화에 준 별점 데이터가 있어야 합니다. 표 6-1 사용자 별점 데이터 사용자 ID

abcd

영화 ID

000001

별점

4

별점을 준 일시

2012 - 03 - 02

6장 영화 추천 시스템 만들기 141


[표 6-1]에 있는 정보만으로는 000001이 어떤 영화인지 알 수 없으므로 사용자가 왜 영화

00001에 별점 4를 줬는지 알 수 없습니다. 영화의 내용을 알기 위해서는 별도로 [표 6-2]와 같 은 영화 정보도 있어야 합니다. 표 6-2 영화 데이터 영화 ID

000001

영화 제목

해리 포터와 마법사의 돌

영화 장르

판타지

상영개시일

2011월 11월 14일

영화 내용

해리 포터는 위압적인 이모부 버논과 냉담한 이모 페투니아, 욕심 많고 버릇없는 사촌 두들 리 밑에서 갖은 구박을 견디며 계단 밑 벽장에서 생활한다. 11살 생일을 며칠 앞둔 어느 날 해리에게 초록색 잉크로 쓰여진 한 통의 편지가 배달된다. 그 편지의 내용은 다름 아닌 해리 의 11살 생일을 맞이하여 전설적인 ‘호그와트 마법학교’에서 보낸 입학 안내장이었다. 그리 고 해리의 생일을 축하하러 온 거인 해그리드는 해리가 모르고 있었던 해리의 진정한 정체를 알려주는데, 그것은 바로 해리가 굉장한 능력을 지닌 마법사라는 것이었다!

회귀 모델로 영화의 특징을 이용해서 사용자의 별점을 예측하는 경우를 생각해봅시다. 영화의 특징으로는 영화 제목, 영화 장르, 상영개시일 등이 있습니다. IMDB 같은 지식 베이스를 이용 하면 등장하는 배우나 영화 장르 같은 정보를 이용할 수 있습니다. 이를 이용하여 회귀식을 작 성한다면 ‘영화 수 × 영화의 특징 수 × 사용자 수’만큼의 변수를 고려해야 하므로 모델이 복잡 해집니다. 한 사용자의 취향은 그 사용자가 보는 영화 내용으로 알 수 있습니다. 예를 들어 어떤 사용자가 해리포터 1편부터 4편까지 보았다고 할 때 5편을 추천하는 건 당연하겠죠. 또한 비슷한 판타 지 소설 기반의 영화인 나니아 연대기를 추천해도 좋을 겁니다. 이렇게 상품 내용에 기반하는 방식을 내용 기반 추천 시스템이라고 합니다. 또한 비슷한 영화 취향을 지닌 사용자들은 비슷한 영화를 볼 겁니다. 만약 사용자 1이 스파이더 맨, 아이언맨, 어벤져스, 닥터 스트레인지를 보았고, 사용자 2가 스파이더맨, 아이언맨, 어벤져 스를 보았다면, 사용자 2에게 닥터 스트레인지를 추천해도 될 겁니다. 이렇게 다른 사용자 정보 를 이용하는 방법이 협업 필터링입니다. 이 장에서는 내용 기반 추천 시스템에서 유사도 계산에 사용하는 자카드 계수와 코사인 유사도, 협업 필터링에 사용하는 수학적 기법인 행렬 분해에 대해 알아봅니다.

142 2부 머신러닝 주요 모델


6.2 유사도 계산 유사도란 두 객체가 얼마나 유사한지 나타내는 척도입니다. 4.5절 ‘유사도 계산’에서는 수치 데 이터의 유사도를 측정하는 방법에 공부했습니다. 여기서는 두 문서 간의 유사도 평가와 협업 필 터링에 자주 사용하는 자카드 계수와 코사인 유사도, 그리고 단어의 유사도 평가에 사용하는 편 집 거리에 대해 알아봅니다. 자카드 계수와 편집 거리는 문서 안의 문자열을 그대로 사용하여 유 사도를 계산할 수 있습니다. 코사인 유사도는 문서 안의 문자열의 빈도를 사용합니다. 자카드 계수 : 두 집합이 공유하는 원소 수에 기반한 유사도

코사인 유사도 : 두 벡터 사이의 각도에 기반한 유사도

편집 거리 : 문자열을 편집하는 데 필요한 연산 수에 기반한 유사도

6.2.1 자카드 계수 자카드 계수 Jaccard coefficient 는 두 집합의 유사도를 측정하는 계수입니다. 집합 S 와 T 가 있을 때, 두 집합의 자카드 계수는 두 집합의 교집합의 원소 수를 합집합의 원소 수로 나눈 값입니다. 식 으로 표현하면 다음과 같습니다. 식 6-1 자카드 계수

S T ⊂

S T 각 영화 줄거리의 유사도를 비교하여 사용자가 구매한 영화와 비슷한 내용의 영화를 추천한다 고 생각해봅시다. 영화 줄거리에 출현하는 단어와 전체 단어 사이에는 다음과 같은 관계가 있 습니다. P  00 : 영화 1과 영화 2의 줄거리에 사용되지 않은 단어

P  01 : 영화 1 줄거리에만 사용된 단어

P  10 : 영화 2 줄거리에만 사용된 단어

P  11 : 영화 1과 영화 2 줄거리에 동시에 사용된 단어

6장 영화 추천 시스템 만들기 143


예를 들어 ‘해리포터와 마법사의 돌’(영화 1 )과 ‘해리포터와 불의 잔’(영화 2 )의 내용을 비교한 다고 할 때, P01은 마법사의 돌, P10은 불의 잔, P11은 해리포터, 론, 헤르미온느, P00은 아 이언맨, 스트레인지, 미녀와 야수 등이 될 겁니다. 단순히 생각해보면 영화 1과 영화 2의 유사도는 P11 / (P00 + P01 + P10 + P11 )이 될 것 같습 니다. 이렇게 계산하는 유사도를 단순 일치 계수 simple matching coefficient 라고 합니다. 즉, 두 영화 줄거리에 공통으로 사용되는 단어를 모든 단어 수로 나누는 거죠. 하지만 한 영화의 줄거리 소개 에 사용되는 단어 수가 모든 단어 수보다 월등히 적으므로 위 식을 사용할 경우 P00의 값이 다 른 값에 비해 굉장히 크게 됩니다. 협업 필터링에서도 비슷한 문제가 생깁니다. 예를 들어 한 사용자가 구매하는 상품 수가 온라인 쇼핑몰에 존재하는 전체 상품 수에 비해 월등히 적으므로 두 사용자 중 어느 쪽도 구매하지 않은 상품 수(P00 )가 많아집니다. 이렇게 데이터 하나에 존재하는 피처 수가 가능한 피처 수에 비해 월등하게 적은 경우 데이터가 희박하다고 표현합니다. 자카드 계수는 이렇게 희박한 데이터 간 의 유사도를 측정하는 데 유용합니다.

6.2.2 코사인 유사도 코사인 유사도 cosine similarity 는 두 벡터 사이의 각도를 -1부터 1 사이의 값으로 나타내는 척도입 니다. 두 벡터가 같은 방향(두 벡터 사이의 각도가 0도)이면 1, 두 벡터가 완전 반대 방향(두 벡터 사이의 각도가 180도)이면 -1이 됩니다. 값이 1일 경우 벡터 간의 유사도가 크다는 거고, -1일 경우 유사도가 매우 작다는 겁니다. 정의는 다음과 같습니다. 식 6-2 코사인 유사도

sim( X , Y ) 

X ⋅Y X Y

X : xi를 요소로 가지는 벡터. (x1, x2 ... xk ) Y : yi를 요소로 가지는 벡터. (y1, y2 ... yk )

X ⋅ Y : 벡터 X, Y 의 내적 ∑i 1 xi yi k

X : X 의 노름 Y : Y 의 노름

144 2부 머신러닝 주요 모델


각도와 유사도는 무슨 관계가 있을까요? 문서에 나오는 단어 빈도를 사용하여 유사도를 측정 한다고 생각해봅시다. [표 6-3]은 각 문서에 출현하는 단어 수를 보여줍니다. 표 6-3 문서당 단어 빈도 단어 1

단어 2

문서 1

4

3

문서 2

2

1

문서 3

1

3

위 표를 다음과 같은 벡터로 나타낼 수 있습니다. 문서 1 = ( 4 , 3 ) 문서 2 = ( 2 , 1 ) 문서 3 = ( 1 , 3 )

그림으로 나타내면 [그림 6-1]과 같습니다. 그림에서 볼 수 있듯이 코사인 유사도는 벡터의 크 기를 무시하고 각도를 이용하여 유사도를 계산합니다.

4

단어 2

그림 6-1 벡터로 표현된 문서 안의 단어 빈도

문서 3

2

3

문서 1

1

문서 2

1

2

3

4

단어 1

6장 영화 추천 시스템 만들기 145


문서 2와 문서 3 중 어느 문서가 문서 1에 가까운지 살펴보겠습니다.

sim (문서 1, 문서 2 )  (4 × 2  3 ×1)

(4 22  322 ) (2 22  122 )  0.98

sim (문서 1, 문서 3 )  (4 ×1  3 × 3)

(4 2  32 ) (12  32 )  0.82

문서 2가 문서 3보다 문서 1에 더 가깝다는 것을 알 수 있습니다. 문서 1과 문서 2에는 단어 1 이 단어 2보다 많이 나온 반면, 문서 3에는 단어 2가 단어 1보다 훨씬 많이 나타나고 있습니다. 따라서 문서 1과 문서 2가 내용면에서 비슷하다고 보는 것이죠. 이와 비슷한 경우를 3.3절 ‘데 이터 표준화’에서 살펴봤습니다. 코사인 유사도는 문서 길이(즉, 문서 안의 단어 수)에 영향을 받지 않기 때문에 유클리드 거리보다 문서 유사도 계산에 훨씬 자주 쓰입니다.

6.2.3 편집 거리 편집 거리는 한 문자열을 다른 문자열로 변환시킬 때 필요한 연산의 수입니다. 이때 연산 횟수 가 많을수록 거리가 멀다고 정의합니다. 문자열에 대해 가능한 연산은 문자 삽입 insertion, 삭제 deletion

, 대체 substitution, 전치 transposition 가 있습니다. 편집 거리는 허용하는 연산에 따라 종류가 나

뉘는데, 예를 들어 대체 연산만 허용하는 해밍 거리와 삽입, 삭제, 대체 연산을 허용하는 레벤슈 타인 거리 등이 있습니다. 문자열 비교 시 가장 자주 사용하는 거리는 레벤슈타인 거리 Levenshtein distance

입니다.

예를 들어 다음과 같은 문자열이 있다고 합시다.

S1 = abcd S2 = acfdg S1을 S2로 만들려면 다음과 같은 과정을 거칩니다. 1. b 삭제 2. f 삽입 3. g 삽입

3번의 연산을 거쳤으므로 편집 거리(S1 , S2 )는 3이 됩니다.

146 2부 머신러닝 주요 모델


CHAPTER

7

이미지 인식 시스템 만들기

이미지 인식은 전자상거래 사이트의 상품 인식, 디지털 카메라 및 구글 포토의 얼굴 인식, 자율 주행 자동차의 도로상황 파악 등 다양한 곳에서 사용됩니다. 또한 최근 딥러닝의 발달로 인식 성능과 처리 속도가 놀랍게 향상되어 응용 범위가 확대되고 있습니다. 이 장에서는 이미지 인식의 기본 개념과 자주 사용되는 피처에 대해 알아보고, 이미지에 담긴 물 체의 카테고리를 정하는 물체 분류와 이미지에 담긴 물체를 인식하는 물체 인식 기법을 소개합 니다. 또한 이미지 인식에서 최근 각광을 받고 있는 딥러닝 기법인 CNN (합성곱 신경망)에 대 해서도 살펴봅니다.

7.1 이미지 처리의 기본 개념 이 절에서는 이미지 처리에서 사용하는 기본 개념인 픽셀, 필터링, 합성곱에 대해 알아보겠습 니다.

7장 이미지 인식 시스템 만들기 159


7.1.1 픽셀 디지털 이미지는 픽셀 pixel 로 구성되어 있습니다. 화면 크기가 17인치, 해상도가 1920 × 1080 픽셀이라는 표현에는 아마 다들 익숙할 겁니다. 픽셀은 컴퓨터 모니터에서 표시할 수 있는 가장 작은 단위라고 생각하면 됩니다. 픽셀은 밝기의 강도 intensity 와 컬러 채널값을 가집니다. 그림 7-1 그레이스케일 이미지 가능한 강도값 [0,255]

0

200

[그림 7-1]의 그레이스케일 이미지에서 각 픽셀은 흰색(강도 255 ), 검은색(강도 0 ), 다양한 강도의 회색( 1 ~ 254 )으로 채워져 있습니다. 컬러 이미지는 픽셀 하나가 R (빨간색), G (녹 색), B (파란색) 세 채널로 구성되고 각각 0 ~ 255의 강도를 가집니다. 예를 들어 빨간색은 [255, 0, 0], 녹색은 [0, 255, 0], 파란색은 [0, 0, 255] 이런 식입니다. 따라서 채널별로 높이 m 픽 셀과 넓이 n 픽셀을 가지는 이미지를 m × n 행렬로 표현할 수 있습니다. 채널이 하나인 그레이 스케일 이미지는 m × n × 1 행렬로, 컬러 이미지는 m × n × 3 행렬로 표현할 수 있습니다. [그 림 7-2]는 8 × 8 픽셀 이미지의 강도값을 행렬로 표현한 겁니다. 예를 들어 (0, 4 ) 요소는 104 라는 값을 가지는데, 이때 104는 이 위치의 강도값입니다.

160 2부 머신러닝 주요 모델


그림 7-2 행렬로 변환된 이미지 픽셀 (0,4)

i

j

이미지를 픽셀 좌표 (x , y )의 강도값을 반환하는 함수로 볼 수도 있습니다. [그림 7-2]에서 이 미지를 I 라 했을 때, 이미지의 (0 , 4 ) 요소와 그 강도값을 함수로 표현하면 I (0 , 4 ) = 104가 됩 니다. 즉, I (x , y ) = 강도값인 함수가 됩니다. 이 함수를 이미지 강도함수 혹은 강도함수라고 합 니다.

7.1.2 필터링 기존 이미지의 픽셀값을 선형적으로 조합하여 새로운 픽셀값으로 변환한 뒤 그 픽셀들로 새로 운 이미지를 생성하는 것을 필터링 filtering 이라고 합니다. 필터링은 결괏값이 저장될 픽셀 좌표의

1, 2,  범위의 픽셀 정보를 조합하는 방식을 사용합니다. 예를 들어 가로 3개 × 세로 3개 =

9개의 픽셀 정보를 조합한다면 3 × 3 크기의 윈도우(혹은 커널 kernel )를 사용합니다. 자주 사용 되는 윈도우 크기로는 3 × 3와 5 × 5가 있습니다.

7장 이미지 인식 시스템 만들기 161


그림 7-3 이동평균 필터링

F x, y 

Gx, y 

(0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 )/ 9 = 0 F x, y 

Gx, y 

(0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 90 )/ 9 = 10 F x, y 

Gx, y 

(0 + 0 + 0 + 0 + 0 + 0 + 0 + 9 0 + 90 )/ 9 = 20 162 2부 머신러닝 주요 모델


대표적인 필터링 방식으로 이동평균 필터링이 있습니다(그림 7-3 ). ( 2n + 1 ) × ( 2n + 1 ) 크 기의 윈도우를 사용하여 이동평균 필터링을 적용할 경우, 목표 픽셀에서  n 위치의 값을 모두 2 더한 후 (2n + 1 ) (윈도우의 넓이)로 나누면 됩니다. 예를 들어 [그림 7-3]의 첫 번째 이미지

는 새 이미지 G의 (1, 1 ) 픽셀값을 정하기 위해 이전 이미지 F의 (0, 0 ), (0, 1 ), (0, 2 ), (1, 0 ), (1, 1 ), (1, 2 ), (2, 0 ), (2, 1 ), (2, 2 ) 픽셀값을 모두 더한 후 9로 나누었습니다. 이 작업을 이 미지 F의 모든 픽셀에 대해 반복합니다. 하지만 이미지 G의 (0, 0 ) 픽셀을 생성하려면 이미지 F의 (-1, -1 ), (0, -1 ), (1, -1 ), (0, -1 ), (0, 0 ), (0, 0 ), (1, -1 ), (1, 0 ), (1, 1 ) 픽셀값이 필요한데, -로 시작하는 픽셀은 존재하지 않 습니다. 이와 같이 이미지의 네 가장자리 픽셀은 윈도우 안의 픽셀값이 비어 있기 때문에 별도 로 처리합니다. 네 가장자리의 픽셀값을 처리하는 방법으로는 이미지 바깥 값을 0으로 채우는 제로 패딩 zero-padding 과 이미지 바깥 값을 가장 가까운 가장자릿값으로 처리하는 가장자릿값 복 제 edge value replication 가 있습니다. 그림으로 나타내면 [그림 7-4]와 같습니다. 일반적으로는 제로 패딩을 많이 사용합니다. 그림 7-4 제로 패딩과(왼쪽)과 가장자릿값 복제(오른쪽) 윈도우 중심 (0,0)

윈도우 중심 (0,0)

이동평균 필터링은 픽셀을 주변 픽셀값의 평균으로 변환하므로 더 부드러운(스무딩된) 이미지 를 생성합니다. 이동평균 외에도 윈도우 안의 픽셀 중 최댓값으로 픽셀을 생성하는 최댓값 필터 링, 단순히 주변 값들의 평균을 구하는 대신 거리에 따라 차등을 주는 가우스 필터링(혹은 가우

7장 이미지 인식 시스템 만들기 163


스 윈도우), 이미지의 경계선을 얻어내는 엣지 필터링 등이 있습니다. 이러한 필터링 방식은 다음 절에서 설명하는 합성곱 윈도우를 용도에 맞게 설정하여 구현할 수 있습니다.

7.1.3 합성곱 필터링 방식은 합성곱 convolution 의 특별한 경우입니다. 사실 이미지 처리에서의 필터링은 합성 곱의 적용이라고 생각해도 됩니다. 합성곱은 함수와 이동한 함수의 값을 곱한 다음, 구간에 대 해 적분하여 새로운 함수를 구하는 연산입니다. 연산 기호는 *입니다. 함수 f 와 함수 g의 합성 곱 f * g 를 식으로 표현하면 다음과 같습니다.

( f ∗ g ) ( t ) = ∫ f (τ ) g (t − τ ) dτ

t : 임의의 값 t : 함수 입력값 함수의 이동은 함수의 그래프를 일정 방향으로 평행이동 혹은 대칭이동하는 것입니다. 중학교에 서 배운 이차함수의 이동을 떠올리면 이해하기 쉬울 겁니다. 함수 y = f (x )에 대한 이동을 식으 로 표현하면 다음과 같습니다. ●

p 만큼 평행이동 : y = f (x - p )

x 축 대칭이동 : - y = f (x )

그림 7-5 함수의 이동

y  x 2 → y  ( x − 2) 2 평행이동

164 2부 머신러닝 주요 모델

y  x 2 → y  −( x ) 2 x축 대칭이동

y  x 2 → y  −( x − 2) 2 평행이동 + 대칭이동


CHAPTER

8

머신러닝의 다양한 문제점 해결하기

이 장에서는 머신러닝 시스템의 성능이 잘 나오지 않을 때 고려할 만한 사항을 살펴보겠습니다. 머신러닝으로 문제를 해결한다는 것은 데이터에 맞는 모델, 적합한 손실함수, 최적화 방법, 평 가 방법을 찾는 과정입니다. 처음에서 성능이 잘 나오지 않더라도 너무 실망하지 마시고 개선 방 안을 찾아내면 됩니다.

8.1 모델 문제 지금부터 8.2절 ‘데이터 문제’에서 다룰 데이터 처리, 8.3절 ‘속도 문제’에서 다룰 속도 향상 외 에 모델 자체에서 비롯된 문제를 해결해서 모델의 성능을 향상하는 방법을 크게 둘로 나눠 설명 합니다. 첫 번째는 학습할 때는 잘 동작했는데 실제로 사용하니 성능이 생각보다 잘 나오지 않는 과학습(오버피팅, 과적합, 과적응) 문제를 해결하는 방안을 알아보고, 두 번째는 데이터에 적 합한 모델을 효과적으로 찾는 방법에 대해 알아보겠습니다.

8.1.1 과학습 머신러닝 시스템을 기존 데이터로 학습시킨 후 평가했을 때는 좋은 성능이 나와 학습이 잘되었 다고 판단했는데, 새로운 데이터에서는 예상대로 성능이 나오지 않는 경우의 원인은 대부분 과

8장 머신러닝의 다양한 문제점 해결하기 189


학습 때문입니다. 과학습은 말 그대로 모델이 과하게 학습 데이터에 집중한 나머지 필요 이상으 로 패턴을 학습한 경우입니다. 다음 그림과 같은 경우를 들 수 있습니다. 그림 8-1 과학습의 예. 거시적으로는 선형 패턴(점선으로 표시)을 가지는 데이터인데 필요 이상으로 복잡하게 학습한 경우(실선으로 표시) 15

10

5

0

-5

-10

-15 -6

-4

-2

0

2

4

6

[그림 8-1]은 과학습의 한 예입니다. 그래프에서 × 로 표시된 점은 관측된 데이터입니다. 얼핏 봐 도 데이터가 왼쪽 아래부터 오른쪽 위까지의 선형 패턴을 가집니다. 이 데이터를 기반으로 X 값 이 7일 때의 Y 값을 예측한다면 11 정도가 될 겁니다. 그런데 전체적인 패턴을 무시한 채 학습 데이터를 완벽하게 예측하는 것에만 중점을 두어 모든 점을 지나는 선을 모델로 만들게 되었습 니다. 그 결과 실선과 같은 과학습된 모델을 가지게 되고 X 값이 7일 때의 Y 값을 제대로 예측 할 수 없게 된 겁니다. 그렇다면 이 문제를 어떻게 해결해야 할까요? 그리고 이런 현상이 일어날지 어떻게 미리 알 수 있을까요? 2.1.5.2절 ‘정규화’와 2.4.1절 ‘모델의 일반화 특성 평가’에서 이론상으로 다룬 바 있 습니다. 이제부터 과학습을 해결하는 실용적인 방법을 알아보겠습니다.

8.1.1.1 학습-평가 데이터 나누기 과학습 문제를 발견하는 가장 효과적인 방법은 전체 데이터의 일부만으로 모델을 학습시키고 나머지 데이터를 이용해 모델을 평가해서 얼마나 데이터의 일반적인 패턴을 잘 학습하는지 판단

190 2부 머신러닝 주요 모델


하는 겁니다. 일반적인 패턴을 잘 파악하지 못하는 모델은 그렇지 않은 모델에 비해 학습용 데 이터에서는 좋은 성능을 보이지만, 평가용 데이터에서는 성능이 잘 나오지 않는 현상을 보이게 됩니다. 자세한 내용은 2.4.1절 ‘모델의 일반화 특성 평가’를 참조하세요.

8.1.1.2 정규화 모델의 정규화는 바로 이런 과학습 문제를 해결하기 위해 등장했습니다. 정규화는 데이터를 설 명할 수 있는 가장 간단한 가정만을 사용한다는 ‘오컴의 면도날 가정’을 이용하여 과학습을 막습 니다. [그림 8-1]을 보면 데이터의 패턴을 설명하기에는 점선이 실선으로 표시된 복잡한 모델보 다 더 간단합니다. 이렇게 데이터의 패턴을 복수의 가정으로 설명할 때는 데이터의 패턴에서 심 하게 벗어나지 않으면 되도록 간단한 가정을 사용하는 것이 좋습니다.

2.1.5.2절 ‘정규화’에서 설명했듯이 ‘데이터의 패턴에서 너무 벗어나지 않는 것’과 ‘더 간단한 모 델을 사용하는 것’의 균형은 정규화 파라미터로 결정합니다. 그렇다면 그 파라미터를 어떻게 결 정해야 할까요? 2.4.1절 ‘모델의 일반화 특성 평가’에서 설명한 것과 같이 정규화 파라미터를 결 정하는 데이터셋을 따로 빼놓고 학습하는 방법을 많이 사용합니다. 정규화 파라미터가 실제로 어떻게 영향을 미치는지 간단한 예제를 통해 알아보겠습니다. 사이 킷런의 linear_model.Ridge 클래스는 정규화 파라미터를 지원하는 선형 회귀 클래스입니다. 클래스의 원형은 다음과 같습니다. class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)

여기서 정규화와 관련된 파라미터는 alpha인데, 값이 클수록 정규화의 강도가 더욱 강해집니다. 실제로 어떻게 문제가 발생하는지 시각적으로 보여드리기 위해 2차 함수를 따르는 데이터를 만 든 후 10차 함수 형태의 모델을 사용하는 경우를 알아보겠습니다(현실에서는 데이터가 몇 차원 함수를 따르는지 알 수 없으므로 임의로 높은 차원을 가정합니다). 여기서는 구현보다는 어떻게 되는지 설명에 집중하기 위해 자세한 코드는 생략하도록 하겠습니다. 데이터는 다음과 같은 가우스분포로 생성되었습니다.

y  x 2 − 2 x − 1  노이즈

8장 머신러닝의 다양한 문제점 해결하기 191


그리고 우리 모델은 10차 함수 형태까지 학습할 수 있는 능력을 가진 10차 다항함수를 사용했 습니다. 수식으로 나타내면 학습 과정에서 상수 부분까지 모두 11개의 파라미터(w10 w0 )를 학습하게 됩니다.

yˆ  w10 x10    w3 x 3  w2 x 2  w1 x  w0 모델이 표현할 수 있는 한계(10차 함수)가 실제 데이터(2차 함수)보다 훨씬 높죠? 이런 경우 에 과학습이 심하게 발생할 수 있습니다. 과학습이 나타나는 현상을 실제로 랜덤한 데이터를 만들고 학습해서 시각화해보겠습니다. 먼저 정규화 없이 그냥 모델을 단순하게 학습시킨 결과 를 살펴보겠습니다(그림 8-2 ). 그림 8-2 정규화 없이(alpha = 0 ) 10차 방정식으로 회귀했을 경우

[그림 8-2]를 보면 단순히 오목하게 생긴 2차 함수의 패턴을 학습하면 되는데 모델이 필요 이상 으로 복잡해서 굉장히 구불구불한 모양으로 학습된 것을 볼 수 있습니다. 똑같은 데이터에 정규 화 파라미터 alpha 값을 증가시켜 보겠습니다.

192 2부 머신러닝 주요 모델


그림 8-3 정규화가 있을 때(alpha = 0.1 )의 변화

[그림 8-2]에 비해 곡선이 훨씬 부드러워졌습니다. 다시 말해, 모델이 표현 가능한 범위보다 좀 더 간단한 모델을 사용하도록 강제된 것을 확인할 수 있습니다. 그림 8-4 정규화가 좀 더 강할 때(alpha = 1 )

8장 머신러닝의 다양한 문제점 해결하기 193


[그림 8-4]는 [그림 8-3]보다 더욱 강하게 정규화 값을 설정한 경우입니다. 곡선이 좀 더 부드러 워져서 더 간단한 모델이 되었습니다. 이렇게 정규화 파라미터를 조절하면서 필요 이상으로 복잡한 패턴을 학습하지 않도록 머신러닝 모델을 조절할 수 있습니다. 그렇다면 적절한 파라미터 값은 어떻게 찾을 수 있을까요? 그림 8-5 검증용 데이터를 나누어 정규화 파라미터 정하기 1.

A

B

2.

C

V

B

3.

C

V

B

4.

A

B

5.

A

B

1. 데이터를 학습 및 검증용(A )과 테스트용(B )으로 나눕니다. 2. A를 다시 학습용(C )과 검증용(V )로 나눕니다. 3. 학습용 데이터에 대해 적당한 정규화 파라미터로 학습을 수행한 후 검증용 데이터를 사용해 성능을 측정합니 다. 반복해서 V에서 가장 성능이 좋은 정규화 파라미터를 찾습니다. 4. 과정 3에서 찾은 정규화 파라미터를 이용해서 A에 대해 학습을 수행합니다. 5. 모델 자체에 대한 평가는 B로 하면 됩니다.

과정 2부터 4까지는 교차검증을 이용해도 됩니다. 교차검증은 2.4.1.2절 ‘교차검증’을 참조하기 바랍니다.

194 2부 머신러닝 주요 모델


CHAPTER

9

머신러닝 소프트웨어 소개

이 장에서는 머신러닝에 사용하는 프로그래밍 언어와 라이브러리를 소개합니다. 머신러닝 시 스템을 구축하는 언어로는 파이썬, 자바, C, 루아 등이 유명하고, 언어별로 주요 라이브러리가 다릅니다.

9.1 파이썬 설치와 라이브러리 이 책은 파이썬으로 예제를 구현합니다. 파이썬은 귀도 반 로섬 Guido van Rossum 이 1991년에 발 표한 고급 프로그래밍 언어로 2016년 12월 기준 http://www.tiobe.com/ 랭킹이 자바, C,

C++에 이어 4위입니다. 파이썬은 플랫폼 독립적이며, 인터프리터 방식, 객체지향, 대화형 언 어이므로 컴파일이 필요 없어 개발이 굉장히 빠르고 유연하기 때문에 시행착오를 거치며 좋은 모델과 파라미터를 찾아가는 머신러닝에 적합합니다. 이런 이유로 머신러닝 관련 종사자 및 데 이터 과학자들에게 인기가 많고 그 결과 머신러닝 라이브러리가 굉장히 풍부합니다. 또한 C로 구현된 CPython (표준 구현)은 C 기반의 수치해석 라이브러리인 넘파이 Numpy 와 사이파이 Scipy 를 이용하면 스크립트 언어임에도 고속 연산이 가능합니다. 이 책에서는 넘파이와 사이파이를 사용하므로 CPython을 설치해야 합니다.

9장 머신러닝 소프트웨어 소개 217


파이썬은 윈도우, 맥, 리눅스 모두에서 사용할 수 있습니다. 인스톨은 어렵지 않으므로 http:// python.org를 참고하세요. 한글로 된 설치 안내는 장고걸스 튜터리얼 1 을 참고하면 됩니다. 이

책의 예제는 파이썬 3.5.1에서 작성했습니다. 파이썬 2.7에서도 대부분의 코드가 작동하지만 수정이 필요한 부분이 있습니다. 가급적이면 파이썬 3.x 버전을 사용해주세요. 파이썬은 인기가 많은 언어라 여러 배포판이 있습니다. 컨티넘 Continuum 사의 아나콘다 Anaconda 배포판이 머신러닝에 필요한 라이브러리인 넘파이, 사이파이, 파이썬 가시화 라이브러리인

Matplotlib, 데이터 가공에 자주 사용되는 Pandas 등을 포함하고 있어서 널리 쓰입니다. 아 나콘다는 상업적으로도 이용할 수 있는 무료 배포판으로 아나콘다 사이트 2에서 내려받아 원클 릭으로 인스톨할 수 있습니다. 아나콘다에서 새로운 패키지를 설치 및 갱신할 때는 다음 명령을 사용합니다. 설치 명령

conda install 패키지명 갱신 명령

conda update 패키지명

만약 아나콘다 배포판이 아닌 기본판을 사용할 경우 아래 명령으로 패키지를 설치합니다. 설치 명령

pip3 install 패키지명 갱신 명령

pip3 install 패키지명 - -upgrade

파이썬 기본판 혹은 아나콘다 배포판을 설치한 후에는 pydoc modules 3 명령으로 이 책에서 사 용할 다음 라이브러리가 들어 있는지 확인해주세요. 넘파이 : 파이썬에서 고속 수치 연산을 지원하는 라이브러리. 다차원 배열, 행렬 및 이를 이용한 계산 함수를

제공합니다.

1 https://tutorial.djangogirls.org/ko/python_installation/ 2 https://www.continuum.io/downloads 3 파이썬에 설치된 모듈은 pydoc modules 명령어로 확인할 수 있습니다.

218 3부 머신러닝 시스템 구현


싸이파이 : 수학 과학 연산을 위한 다양한 함수를 지원하는 라이브러리. 넘파이와 함께 파이썬을 이용한 수치

연산에 활발히 사용됩니다. 사이킷런 scikit-learn : 넘파이와 사이파이에 기반한 파이썬용 머신러닝 라이브러리. 이후 절에서 자세히 설명합

니다. M  atplotlib : 파이썬에서 이미지 플롯을 하기 위해 사용하는 라이브러리. 다양한 그래프를 그릴 수 있습니다.

N  LTK : 파이썬에서 자연어 처리를 하기 위해 사용하는 라이브러리. 영어의 어간 추출 및 품사 분석을 할 수

있습니다. O  penCV : 파이썬에서 이미지 데이터를 처리하는 데 사용하는 라이브러리. 원래 C++로 쓰여졌지만 현재

는 파이썬 인터페이스도 제공합니다.

9.2 유명 라이브러리 소개 이 절에서는 머신러닝과 딥러닝에 주로 사용하는 라이브러리를 간략히 소개합니다. 사실 라이 브러리를 굳이 사용하지 않아도 이 책에서 설명한 모든 모델을 구현할 수는 있습니다. 하지만 라 이브러리를 사용하는 것으로 교차검증이나 파라미터 서치와 같은 기능을 쉽게 사용할 수 있고, 특히 딥러닝 라이브러리는 GPU의 분산 연산을 이용하여 경사하강법 등의 계산을 고속화하므 로 학습률을 높여줍니다.

9.2.1 머신러닝 라이브러리 이 절에서는 머신러닝에서 자주 사용하는 라이브러리를 살펴보겠습니다. 머신러닝 라이브러리 는 다루는 데이터, 인터페이스 언어, 라이브러리로 존재하는 모델을 기준으로 선택하게 됩니다. 사이킷런 4 사이킷런은 다양한 지도학습, 비지도학습 알고리즘을 구현하며, 풍부한 샘플 데이터를 제공합 니다. 또한 위에서 살펴본 넘파이와 사이파이를 이용하여 고속화까지 하고 있어서 학계와 현장 에서 가장 많이 사용합니다. 그래서 각 모델에 대한 설명 및 관련 논문도 풍부합니다.

4 http://scikit-learn.org/

9장 머신러닝 소프트웨어 소개 219


Statsmodels 5 사이킷런에 비해 통계모델 평가에 특화된 라이브러리입니다. 특히 회귀분석 패키지는 사이킷 런에서는 제공하지 않는 계수 p-value 값, F-statistics, 아카이케 정보량 기준(AIC ) 및 베이 즈 정보량 기준(BIC )에 대한 정보를 제공합니다. 또한 분산 분석과 시계열 분석을 위한 라이 브러리를 제공합니다. 팬더스Pandas 6 데이터 가공에 사용되는 라이브러리입니다. 행렬 인덱스를 가지는 R의 DataFrame 자료형과 시계열 자료형을 넘파이 기반으로 구현합니다. 데이터 로딩 및 접근에 편리한 여러 함수를 제공 하고 있어서 많이 사용합니다.

NLTK Natural Language Toolkit 7(자연어 툴킷) 자연어 처리에 사용하는 라이브러리입니다. 영어에서 사용할 수 있는 자연어 처리 함수(예를 들면 어간 추출기 등) 및 데이터셋을 다수 제공하며, 나이브 베이즈 분류기 등의 간단한 분류 함수도 제공합니다.

MLlib 8 고속 분산 클러스터링 엔진인 아파치 스파크용 머신러닝 라이브러리입니다. 스파크의 자료형 인 RDD Resilient Distributed Dataset 에 적용할 수 있는 머신러닝 함수를 제공합니다. 파이썬, 스칼라, 자바 인터페이스를 지원합니다. 분류/회귀 관련 함수, 군집화 함수, 협업 필터링, 모델 선택 및 파라미터 튜닝 기능도 제공합니다. 웨카 Weka 9 자바로 쓰인 데이터마이닝/머신러닝 라이브러리입니다. 뉴질랜드의 와이카토 대학에서 1999 년에 자바 데이터 마이닝 프로덕트를 만드는 프로젝트가 시작된 후로 꾸준히 업데이트되고 있

5 http://statsmodels.sourceforge.net/ 6 http://pandas.pydata.org/ 7 http://www.nltk.org/ 8 http://spark.apache.org/mllib/ 9 http://www.cs.waikato.ac.nz/ml/weka/

220 3부 머신러닝 시스템 구현


습니다. 그래픽 유저 인터페이스를 제공하는 것이 특징입니다. 또한 명령행을 이용하면 몽고디 비, 하둡, 스파크에서도 사용할 수 있습니다.

OpenCV10 인텔에서 개발한 C/C++ 기반 오픈 소스 컴퓨터 비전 라이브러리입니다. 최초 버전은 2000년 에 공개되었습니다. 긴 역사를 가지고 있어서 이미지 처리에 필요한 함수를 풍부하게 제공하고 있습니다. C, C++, 파이썬 및 자바 인터페이스로 제공합니다. 간편한 비교를 위해 [표 9-1]에 머신러닝 라이브러리를 요약해두었습니다. 표 9-1 자주 쓰이는 머신러닝 라이브러리 라이브러리명

인터페이스 언어

특징

사이킷런

파이썬

전반적인 데이터와 다양한 모델을 다루는 라이브러리

Statsmodels

파이썬

통계 분석에 특화된 라이브러리

팬더스

파이썬

데이터 가공용 라이브러리

NLTK

파이썬

자연어 처리 라이브러리

MLlib

파이썬, 스칼라, 자바

아파치 스파크에서 사용하는 대규모 머신러닝 라이브러리

웨카

자바

자바용 머신러닝 라이브러리. 간단하게 사용할 수 있는

GUI 제공 OpenCV

C/C++, 파이썬, 자바

이미지 데이터 처리에 특화된 라이브러리

9.2.2 딥러닝 라이브러리 이 절에서는 딥러닝 라이브러리(프레임워크)에 대해 살펴보겠습니다. 딥러닝이 유명해진 계 기가 된 이미지넷 챌린지(7.4.1절 ‘CNN 소개’ 참조)의 알렉스넷을 재현한 카페 Caffe 가 큰 인기 를 얻으면서 그 후 다양한 딥러닝 라이브러리가 개발되었습니다. 최근에는 파이썬 기반의 딥러 닝 라이브러리가 많이 쓰입니다. 또한 모바일 환경 및 분산 처리에 초점을 맞추는 라이브러리 가 인기를 끌고 있습니다.

10 http://opencv.org/

9장 머신러닝 소프트웨어 소개 221


텐서플로11 구글의 인공지능 연구팀인 구글브레인에서 개발, 관리하는 딥러닝 라이브러리입니다. 수학 계 산 및 데이터 처리를 노드(심벌)로, 각 노드 간의 데이터 흐름을 엣지로 하는 그래프로 표현합 니다. 이 심벌과 연산 그래프로 딥러닝의 학습 과정을 추상화하여 딥러닝 모델을 쉽게 구현할 수 있습니다. 최적화에 널리 쓰이는 확률적 경사하강법 등의 함수를 지원하며, 최신 모델을 포함하 여 다양한 딥러닝 모델을 제공합니다. C++, 파이썬 인터페이스를 지원합니다. 특히 파이썬의 사이킷런과 유사하게 TFLearn 혹은 케라스 keras 등 텐서플로를 더 쉽게 사용할 수 있는 고수준 래퍼를 제공하여 더욱 쉽게 사용할 수 있습니다. 또한 분산 처리와 모델 모니터링을 쉽게 할 수 있는 다양한 툴도 기본 제공합니다. 모바일 환경에서도 사용할 수 있습니다. 카페 12 미국 캘리포니아 버클리 주립대학교의 버클리 인공지능 연구소 berkeley artificial intelligence research (BAIR )13에서 관리하는 딥러닝 라이브러리입니다. 설정 파일로 모델을 학습시키며, 이미지 데 이터를 사용하는 딥러닝에 많이 사용합니다. 또한 여러 가지 공개 데이터로 미리 학습된 모델을 많이 제공합니다.14 그러나 RNN을 주로 사용하는 자연어 처리용 딥러닝 모델 지원은 상대적으 로 약합니다. C, C++, 파이썬, MATLAB의 인터페이스를 사용할 수 있습니다. 2017년 현재 페이스북에서 Caffe2를 공개했고 개발을 진행하고 있습니다. Caffe2는 모바일 기기에서의 딥 러닝 지원을 목표로 활발히 개발이 진행 중입니다. 토치 Torch 15 뉴욕 대학교에서 C와 LuaJIT로 구현한 딥러닝 라이브러리입니다. 스크립트 언어인 루아로 구 현되었으면서도 빠른 실행 속도를 자랑합니다. 텐서 tensor 개념과 연산 그래프를 처음 소개한 라 이브러리로, GPU 텐서 클래스 등을 소개함으로써 GPU로 쉽게 학습할 수 있습니다. C, C++ 및 루아 인터페이스를 제공합니다. 카페와 마찬가지로 RNN 학습에는 잘 사용하지 않습니다.

2017년 현재 페이스북 주도로 개발 중인 파이썬의 토치 API인 파이토치 pytorch 가 제공되고 있 습니다. 11 http://www.tensorflow.org, http://tflearn.org 12 http://caffe.berkeleyvision.org/, https://caffe2.ai/ 13 http://bair.berkeley.edu/ 14 https://github.com/BVLC/caffe/wiki/Model-Zoo 15 http://torch.ch, http://pytorch.org/

222 3부 머신러닝 시스템 구현


CHAPTER

10

구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전

이 장에서는 4장에서 공부한 군집화 기법을 사용하여 실제 구매 데이터로 사용자 클러스터를 만 들어보겠습니다. 구매 이력을 바탕으로 하는 사용자 군집화와 판매 내역을 바탕으로 하는 상품 군집화는 마케팅 전반에 걸쳐 널리 사용됩니다. 사용자의 소비 패턴과 구매 총액을 바탕으로

VIP 고객과 일반 고객을 그룹핑하거나 판매 패턴이 비슷한 상품(예를 들면 30대 남성층이 자 주 구매하는 상품)을 그룹핑하여 사용자 캠페인을 여는 등 다양하게 응용할 수 있습니다. 군집화 순서는 다음과 같습니다. 1. 데이터셋의 전체적인 모습을 파악합니다(데이터 시각화). 2. 군집화를 적용할 수 있도록 데이터를 가공합니다(데이터 전처리). 3. 적절한 클러스터 수 K 를 정합니다. 4. 최종 군집화 알고리즘을 적용합니다.

10.1 데이터셋 구매 이력을 바탕으로 사용자 그룹을 만들려면 사용자 정보가 들어 있는 구매 이력이 있어야 합 니다. 실제로 고객 정보를 관리하는 회사에 근무하는 개발자라면 회사의 데이터셋을 이용해서 군집화 기법을 바로 응용할 수도 있지만 그렇지 않은 대다수 독자를 위해 공개 데이터를 이용하 겠습니다.

10장 구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전 245


이 장에서 사용할 데이터는 캘리포니아대학교 어바인 University of California, Irvine 에서 관리하는 머신 러닝 리포지터리의 온라인 상거래 데이터 online retail data 입니다. 다음 URL에서 데이터셋을 내려 받기 바랍니다. https://archive.ics.uci.edu/ml/datasets/Online+Retail

이 데이터는 주로 선물이나 기념품을 판매하는 1981년에 설립된 한 영국 회사의 2010년과

2011년의 거래 내역입니다. 엑셀 파일로 제공되며, 약 54만 개의 거래 내역이 담겨 있습니다. 그림 10-1 온라인 상거래 데이터의 상세

데이터를 살펴보면 변수가 8개 있습니다. 각 변수의 의미는 [표 10-1]과 같습니다. 표 10-1 데이터의 변수명과 설명 변수명

설명

InvoiceNo

6자리 숫자로 이루어진 거래 고유번호

StockCode

5자리 숫자로 이루어진 상품 코드(상품으로 간주합니다)

Description

상품명

Quantity

한 거래당 판매된 상품 수

InvoiceDate

거래가 성립된 일시 MM/DD/YY HH : MM

UnitPrice

가격

CustomerID

사용자 ID

Country

사용자의 국가

246 3부 머신러닝 시스템 구현


2011년의 거래 데이터를 이용하여 같은 상품을 구입한 영국에 거주하는 사용자 그룹을 찾아보 겠습니다. 즉, StockCode를 이용해서 CustomerID를 군집화하겠습니다. NOTE_ 이 데이터는 공개 데이터이므로 개인 정보 보호를 위해 우편번호를 CustomerID로 사용하고 있습

니다.

10.2 데이터 전처리 데이터를 분석할 때는 우선 데이터의 전체 모습을 파악해야 합니다. 그래야 어떤 분석 방법이 적 절한지 결정할 수 있습니다. 예를 들어 사용자가 구매하는 상품 수를 생각해봅시다. 만약 각 사 용가가 상품을 100개 아니면 10개만 구입하는 경우 이 데이터는 구매상품 수를 기준으로 두 그 룹으로 나눌 수 있습니다. 하지만 모든 사용자가 상품을 50개만 구매한다면 이 데이터는 구매 상품 수가 아닌 다른 기준을 골라 군집화해야 합니다. 여기서는 고유 사용자 수와 고유 상품 수를 사용하므로 일단 이 두 속성에 대해 기초 통계량을 조사해보겠습니다. 전체 사용자 수 및 상품 수를 구하고, 한 사용자가 구매한 고유 상품 수의 기 초 통계량, 즉 고유 상품 수의 최솟값, 최댓값, 평균값, 표준편차를 구해보겠습니다. 기초 통계 량을 구하면 데이터의 전체 모습을 확인할 수 있는 것은 물론이고 군집화할 때 노이즈가 될 수 있는 예외값에 대해서도 알 수 있습니다. 또한 데이터를 시각화하여 데이터 전체 모습에 대해 기초 통계량과는 다른 정보를 얻어 보겠습니다. 마지막으로 기초 통계량과 시각화로 얻은 정보 를 이용하여 데이터에서 예외 샘플을 제외하겠습니다. 다음과 같은 딕셔너리를 정의했습니다. u ser_product_dic : 사용자 ID를 키로, 그 사용자가 구입한 상품 코드의 셋을 값으로 하는 딕셔너리입니다.

p roduct_user_dic : 상품 코드를 키로, 그 상품을 구입한 사용자 ID의 셋을 값으로 하는 딕셔너리입니다.

위 두 딕셔너리를 활용하면 사용자가 구매한 고유 상품과 각각의 상품을 구매한 사용자 정보를 알 수 있게 됩니다. 그리고 product_per_user_li를 이용해서 사용자가 구매한 상품 수를 리스트에 저장하여 사용 자가 구매한 고유 상품 수의 최솟값, 최댓값, 평균값, 표준편차를 구할 수 있습니다.

10장 구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전 247


p roduct_per_user_li : 각 사용자가 구입한 고유 상품 수를 값으로 하는 리스트입니다.

또한 집계 및 분석의 편의를 위해 다음 딕셔너리를 정의했습니다. product_id_name_dic : 상품 코드를 키로, 상품명을 값으로 하는 딕셔너리입니다.

데이터의 기초 통계량은 scipy의 stats 모듈에서 제공하는 describe 함수로 쉽게 살펴볼 수 있습니다. scipy.stats.describe(a, axis=0, ddof=1, bias=True, nan_policy='propagate')

주요 파라미터는 다음과 같습니다. a : 파이썬 리스트

axis : 기초 통계량을 행과 열 중 어느 것을 축으로 계산할지 정하는 파라미터. 0이면 행, 1이면 열, None이

면 행과 열 모두에 대해 기초 통계량을 계산합니다. 예제 10-1 데이터의 기초 통계량 계산 및 시각화

import time from scipy import stats

# 데이터 구조 정의 # 사용자 ID를 키로 갖고 상품 코드의 셋을 값으로 갖는 딕셔너리와 # 상품 코드를 키로 갖고 사용자 ID의 셋을 값으로 갖는 딕셔너리 user_product_dic = {} product_user_dic = {} # 상품 코드를 키로 갖고 상품명을 값으로 갖는 딕셔너리 # 군집화의 내용을 확인하는 단계에서 상품명을 사용합니다. product_id_name_dic = {} # 파일을 읽어 위에서 정의한 데이터 구조를 채웁니다. for line in open('online_retail_utf.txt'): # 데이터를 한 행씩 읽어 필요한 항목을 저장합니다. line_items = line.strip().split('\t') user_code = line_items[6] product_id = line_items[1]

248 3부 머신러닝 시스템 구현


product_name = line_items[2] # 사용자 ID가 없을 경우 무시합니다. if len(user_code) == 0: continue # 영국에서 구매한 사용자만 고려하므로 국가가 united kingdom이 아닌 경우엔 무시합니다. country = line_items[7] if country != 'United Kingdom': continue # 연도를 읽을 때 에러 처리. 파일 헤더를 무시합니다. try: invoice_year = time.strptime(line_items[4], '%m/%d/%y %H:%M').tm_year except ValueError: continue # 2011년에 일어난 구매가 아닌 것은 무시합니다. if invoice_year != 2011: continue # 읽은 정보로 데이터 구조를 채웁니다. # 상품 가짓수를 고려하므로 상품 코드를 셋으로 가지도록 하겠습니다. user_product_dic.setdefault(user_code, set()) user_product_dic[user_code].add(product_id) product_user_dic.setdefault(product_id, set()) product_user_dic[product_id].add(user_code) product_id_name_dic[product_id] = product_name # 데이터 구조를 다 채웠으므로 각 사용자가 구매한 상품 가짓수로 리스트를 만듭니다. product_per_user_li = [len(x) for x in user_product_dic.values()]

# 이 장에서 사용할 최종 사용자 수와 상품 가짓수를 출력합니다. print('# of users:', len(user_product_dic)) print('# of products:', len(product_user_dic)) # 각 사용자가 구매한 상품 가짓수로 기초 통계량을 출력합니다. print(stats.describe(product_per_user_li))

10장 구매 이력 데이터를 이용한 사용자 그룹 만들기 - 실전 249


실행 결과는 다음과 같습니다. # of users: 3835 # of products: 3588 DescribeResult(nobs=3835, minmax=(1, 1603), mean=58.690743155149931, variance=6207.1088214350575, skewness=5.833816723404396, kurtosis=72.60364097540138)

stats.describe 함수의 기초 통계량 출력 결과를 보면 한 사용자가 상품을 평균 58.69가지

산다는 것을 알 수 있습니다. 또한 한 사용자가 구매한 최대 고유 상품 수와 최소 고유 상품 수 를 보면 최대 상품 1,603가지를 사고, 최소 상품 한 가지를 사는 것도 알 수 있습니다. 그럼 각 사용자가 구매하는 고유 상품 가짓수는 어떤 분포를 보일까요? 이를 알아보기 위해 matplotlib 라이브러리를 이용해 플롯을 만들어보겠습니다. 기본 함수인 plot 함수를 사용합

니다. matplotlib.pyplot.scatter(*args , **kwargs )

이 함수는 포인트를 플롯하는 함수입니다. 여러 가지 파라미터를 사용할 수 있는데, 주요 파라 미터는 다음과 같습니다. x : X축 데이터

y : Y축 데이터

m arker : 플롯에 사용할 마커. ‘o’, ‘+’ 등을 고를 수 있습니다.

c olor : 플롯에 사용할 색

이 외에도 포인트 크기 등을 고를 수 있습니다. 마커와 색에 대해서는 공식 문서1를 참고하세요. 한 사용자당 구매한 상품 가짓수의 리스트를 Counter형으로 바꾸어 {구매상품 가짓수:구매 사용 자 수} 형태로 만들었습니다. 그 후 Counter형의 키인 구매상품 가짓수를

자 수를 Y축으로 하여 플롯을 띄웁니다.

1 https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot

250 3부 머신러닝 시스템 구현

X축으로, 값인 사용


CHAPTER

11

문서 분석 시스템 만들기 - 실전

이 장에서는 5장에서 설명한 문서 분석 시스템의 예로 다음 다섯 가지를 구현합니다. 문서 분류 시스템 : 스팸 문자를 분류하는 간단한 문서 분류 시스템

토픽 모델 시스템 : 문서에서 토픽을 뽑아내는 시스템

품사 분석 시스템 : 문서에서 각 단어의 품사를 분석하는 시스템

고유명사 태깅 시스템 : 문서에서 시간, 장소 등의 고유명사를 태깅하는 시스템

단어 임베딩학습 : 문서에서 각 단어를 의미 있는 임베딩(표현형)으로 학습하여 단어의 의미를 수학적으로 모

델링하는 시스템

각 시스템에서 다루는 기법은 서로 선후 관계가 없으므로 관심 있는 부분을 먼저 읽어도 좋습니 다. 이 장의 내용이 잘 이해되지 않는다면 5장을 참조하기 바랍니다.

11.1 스팸 문자 필터 만들기(문서 분류) 누구나 한 번쯤은 스팸 문자를 받아본 적이 있으실 겁니다. 스팸 문자가 엄청 오면 정말 짜증나 죠. 중요한 순간에 진동이 울리면 김미영 팀장인 겁니다. 세상에 공짜가 없는데 왜 자꾸 돈을 꿔 준다고 그럴까요? 이런 스팸 문자를 어떻게 하면 효과적으로 필터링할 수 있을까요? 스팸 문자를 자세히 보면 어떤 패턴이 있다는 것을 알 수 있습니다. 일단 내용이 대출이나 성적 인 경우가 많고요, 발신자를 보면 모르는 사람입니다. 하지만 모든 스팸 단어와 이상한 발신자를

11장 문서 분석 시스템 만들기 - 실전 273


필터링하는 코드를 짠다면 새로운 스팸 단어와 새로운 발신자가 생길 때마다 필터를 계속 업데 이트해야 할 겁니다. 그렇다면 머신러닝으로 스팸 패턴을 자동으로 파악하여 필터를 갱신하는 시스템을 만들면 좋지 않을까하는 생각이 들 겁니다. 문서 분류 시스템이 바로 그런 경우에 유 용한 시스템입니다.

11.1.1 예제에서 사용할 데이터 처리 실제로 시스템을 구현한다면 데이터를 모으는 것부터 시작해야겠지만, 이 장에서는 분류 시스 템 구현에 초점을 맞추고 있으므로 주어진 데이터를 가지고 진행하겠습니다. 이 장에서 사용할 데이터는 SMS 스팸 문자 데이터셋인데요, 10.1절 ‘데이터셋’에서도 소개한

UCI 머신러닝 자료실에서 데이터를 받을 수 있습니다. https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection

이 데이터셋은 2012년에 Grumbletext 등의 웹사이트에서 수집한 총 5574개의 SMS 메시지 입니다. 압축을 풀면 파일 두 개가 나오는데, 데이터셋은 SMSSpamCollection 파일에 들어 있습니다. 평 범한 텍스트 파일인데, 한 줄에 SMS 데이터 하나(문서 하나라고 표현하겠습니다)가 들어 있습 니다. 맨 앞 단어는 스팸인지 아닌지(ham = 스팸이 아니다, spam = 스팸이다) 표시하는 레이 블이고, 실제 문자 내용은 그다음에 이어집니다. 몇 가지 문자 예를 살펴보면 다음과 같습니다. 표 11-1 SMS 스팸 문자 데이터 내용

ham

Go until jurong point, crazy... Available only in bugis n great world la e buffet ... Cine there got amore wat ...

ham

Ok lar... Joking wif u oni ...

spam

Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question (std txt rate )T&C's apply 08452810075over18's

ham

U dun say so early hor... U c already then say...

이 절에서 데이터를 처리하는 흐름은 다음과 같습니다.

274 3부 머신러닝 시스템 구현


1. 단어집 만들기 2. 단어의 출현 빈도 처리하기 3. 레이블 처리하기 4. 피처로 만들기

문서를 분석하는 다양한 방법 중 5.1.1.1절 ‘단어 빈도 피처’에서 설명한 단어 빈도 피처를 만 들어보겠습니다. 단어 빈도 피처를 만들려면 단어집 vocabulary 이 필요하겠지요? 먼저 단어집을 만들어봅시다. 다음 코드는 SMSSpamCollection 파일을 열어서 영어 단어를 숫자 ID로 매핑 하는 딕셔너리를 만듭니다. 예제 11-1 단어집 만들기

vocabulary = {} # 딕셔너리를 선언합니다. with open('SMSSpamCollection') as file_handle: # 파일을 엽니다. for line in file_handle: # 파일을 한 줄씩 읽습니다. splits = line.split() # 한 줄을 빈 칸으로 쪼개서 리스트로 만듭니다. label = splits[0] # 맨 앞의 단어는 레이블이니까 따로 둡니다. text = splits[1:] # 전체 내용을 단어 단위로 살펴보고 # 사전에 해당 단어가 없으면 추가 후 고유번호를 붙입니다. # 그리고 그 매핑을 vocabulary에 저장합니다({'단어' -> 고유ID}). for word in text: lower = word.lower() # 소문자로 통일합니다. if not word in vocabulary: vocabulary[word] = len(vocabulary)

단어집은 딕셔너리 자료형입니다. 단어집의 데이터셋 형식은 다음과 같습니다. {'단어' -> 고유ID}

단어집 내용을 출력해보겠습니다. print(vocabulary) {'reason': 2252, '80488.biz': 5278, 'offer:)': 3947, 'doing?what': 13208, 'naal': 8654, 'jsco': 5929, 'china.': 7762, 'onion-rs.': 10818, 'sleepin,': 12337, 'ak': 2772, 'performed?': 708, 'dt': 7990, '08081263000': 10000, 'ok.varunnathu': 1839, 'scared': 931, 'plane..': 3498, 'spose': 8536, 'aquarius': 13277, 'words': 222, 'thk...': 6967, 'rice.': 4426, 'asian': 12754, 'yes..he': 2503, 'lily': 4698, 'reminds': 7746, ... 후략

>>>

11장 문서 분석 시스템 만들기 - 실전 275


이 단어집을 이용해서 단어 빈도 피처를 만들어보겠습니다. [예제 11-2]는 파일을 읽어 리스트 형 변수 features에 단어집을 기반으로 단어 빈도 피처를 만드는 코드입니다. 예제 11-2 단어 빈도 피처 만들기

import numpy as np # 각 문서의 피처 벡터를 뽑아서 features 리스트에 넣습니다. features = [] with open('SMSSpamCollection') as file_handle: for line in file_handle: # 파일을 한 줄씩 읽습니다. feature = np.zeros(len(vocabulary)) # 0으로 채워진 numpy 벡터를 만듭니다. text = splits[1:] for word in text: lower = word.lower() # vocabulary에 따라 각 피처가 몇 번 나왔는지 개수를 셉니다. feature[vocabulary[lower]] += 1 # 단어 빈도 피처이므로 문서에서 나온 총 단어 수로 전체 벡터를 나누어 피처를 만듭니다. feature = feature / sum(feature) features.append(feature)

features에 담겨진 결과를 출력해봅시다.

print(features) [array([ 0.05, 0.05, 0.05, ..., 0. , 0. , 0. ]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., ., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), array([ 0., 0., 0., ..., 0., 0., 0.]), 후략 >>>

여기서 features는 넘파이 리스트로 각각의 넘파이 리스트가 한 문서의 피처를 담고 있습니다. 위 코드는 각 단어가 몇 번씩 나왔는지 넘파이 배열(np.zero )에 기록하고, 한 문서가 끝나면 전체 단어 개수로 각 단어의 출현 수를 나눠 각 단어 빈도 피처값을 계산합니다. 즉, 위와 같이 저장된 하나의 넘파이 배열(array[0.50, ...] )은 문서 하나의 피처를 뜻합니다.

276 3부 머신러닝 시스템 구현


그렇다면 전체 피처는 얼마나 큰 메모리 공간을 차지할까요? features 리스트를 보면 하나하 나가 문서에서 뽑아낸 피처이므로 리스트는 문서 수만큼 있을 겁니다. 그리고 각각의 피처는 넘파이 배열이므로 각각 단어집만큼의 길이를 가집니다. 전체적으로는 문서 수 × 단어집 크기 만큼의 0으로 가득 찬 공간이 있는데 그 공간에서 단어가 나오는 곳에만 0이 아닌 숫자들이 위 치하게 됩니다. 앞의 결과를 보면 알겠지만 0이 거의 대부분을 차지하고 있습니다.

5.1.1절 ‘문서 분류에 많이 사용하는 피처’에서도 설명했듯이 단어집에 존재하는 단어 수보다 문서에 나오는 단어 수가 월등히 작은 경우가 많기 때문에 대부분 0으로 차 있게 됩니다. 앞의 예제에서는 단어집에 존재하는 단어 수가 13629개, 문서가 5574개 있으므로 총 75,968,046 개의 숫자를 저장합니다. 각 숫자를 8바이트 double precision 로 저장한다고 가정하면 579MB 라는 어마어마한 공간을 차지합니다. 그런데 실제로 관측된 단어 수는 86 ,908 개이므로

86908 / 75968046 = 0.001 = 0.11%만큼의 공간만 의미 있는 숫자를 저장하고 있습니다. 나 머지 99.89%의 공간은 0으로 가득 차 있습니다. 그러므로 0을 기록하지 않는다면 저장 공간을 절약할 수 있을 겁니다. 0이 아닌 항목만 저장하 는 방식을 희박행렬 sparse matrix 저장이라고 합니다. 저장 방식에는 몇 가지가 있는데, 대표적으 로는 리스트 하나에 ‘행 번호, 열 번호, 값’을 저장하거나, 같은 행에 해당하는 항목들을 열별로 저장한 이차원 리스트 등이 있습니다. [예제 11-4]에서는 사이킷런에서 제공하는 희박행렬 저 장 방식을 사용해보겠습니다. 그전에 각 문서에 해당하는 레이블도 처리해봅시다. 여기서는 스팸에 해당하는 문서는 1로 표 시하고 그렇지 않으면 0으로 표시하겠습니다. 문서가 나타나는 순서에 따라 단어 빈도 피처와 유사하게 0과 1을 만듭니다. 예제 11-3 레이블 처리하기

labels = [] with open('SMSSpamCollection') as file_handle: for line in file_handle: # 파일을 한 줄씩 읽습니다. splits = line.split() label = splits[0] if label == 'spam': # 맨 앞 단어(label)가 spam이면 1, 아니면 0을 추가합니다. labels.append(1) else: labels.append(0)

11장 문서 분석 시스템 만들기 - 실전 277


설명의 편의를 위해 세 단계로 구분해서 파일을 여러 번 돌면서 피처와 레이블을 준비했습니 다. 하지만 파일을 한번에 읽는 좀 더 효율적인 방식도 가능합니다. 문서를 처음부터 살펴보면서 단어가 새로 나왔는지 구분하고, 바로 피처를 만들고, 동시에 레이블도 기록하면 됩니다. 사이 킷런에서는 이런 모든 과정을 한번에 쉽게 할 수 있는 코드를 제공합니다. 그리고 앞서 설명한 희박행렬 형식으로 결과를 반환합니다. 이를 위해 사이킷런의 CountVectorizer와 TfidfTransformer를 사용해서 피처를 생성하고 파이썬의 pickle 라이브러리를 이용해서 내용을 저장해보겠습니다. 문서를 단어 단위로 쪼개서 각 단어가 몇 번 나왔는지 세어 단어 카운팅 피처를 만드는 CountVectorizer 클래스를 살펴봅시다.

class sklearn.feature_extraction.text.CountVectorizer(input=u'content', encoding=u'utf-8', decode_error=u'strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=u'(?u)\ b\w\w+\b', ngram_range=(1, 1), analyzer=u'word', max_df=1.0, min_df=1, max_ features=None, vocabulary=None, binary=False, dtype=<type 'numpy.int64'>

주요 파라미터는 다음과 같습니다. stop_words : [예제 11 -6]에서 더 자세히 설명하겠지만, 단어 중에서 대명사나 관사처럼 의미가 약한 단어 를 피처에서 제외할 때 사용합니다.

max_df : 단어가 나온 문서의 숫자가 이 값 이상으로 나오면 그 단어를 피처에서 제외합니다. 다시 말해, 단

어가 너무 흔해서 많은 문서에 나타나는 경우 피처에서 제외한다는 뜻입니다. df는 document frequenc 의 약어입니다. min_df : max_df와는 반대로 너무 희박하게 나오는 단어를 피처에서 제외합니다. 이 옵션은 특히 오타, 인터

넷 주소, 자주 나오지 않는 특수한 전문용어를 피처에서 제외하는 데 아주 효과적입니다. max_features : 자주 나온 순서대로 피처의 숫자를 제한할 때 사용합니다. 명시하지 않으면 피처를 모두 사

용합니다.

일반적으로 fit_transform ( ) 메서드를 이용해서 입력에서 피처를 생성합니다. fit_transform 은 [n_samples, n_features] 형태의 문서-단어 희박행렬을 생성합니다. 반환된 피처는 바로 사용할 수도 있고, 아니면 다른 피처 변환기 Feature Transformer 에 사용할 수도 있습니다. 예제에서는 CountVectorizer에서 나온 피처를 TfidfTransformer 클래스를 이용해 서 단어 빈도 피처 term frequency feature 로 변환해보겠습니다.

278 3부 머신러닝 시스템 구현


CHAPTER

12

영화 추천 시스템 만들기 - 실전

이 장에서는 6장에서 다룬 추천 시스템 이론을 이용하여 실제 영화 데이터로 추천 시스템(내용 기반 추천 시스템과 협업 필터링 기반 추천 시스템)을 만들어보겠습니다. 추천 시스템은 아마존 과 같은 온라인 상거래 사이트뿐만 아니라 뉴스 사이트, 영화 사이트 등에서 사용자들이 선호 할 만한 상품, 뉴스, 영화 등을 추천하여 사이트 이탈율 abandonment rate 을 줄이고 클릭율 click through rate

을 높여 매출에 기여하는 용도로 사용됩니다. 구현 순서는 다음과 같습니다. 1. 데이터셋 구하기 및 데이터 전처리 2. 내용 기반 영화 추천 시스템 만들기 3. 협업 필터링 기반 영화 추천 시스템 만들기

12.1 데이터셋 이 장에서는 영화 데이터로 무비렌즈 movie lens 데이터셋를 이용합니다. 무비렌즈는 미네소타 대 학의 그룹렌즈 그룹에서 배포하는 공개 데이터셋입니다. 이 데이터셋의 크기는 영화 정보와 사 용자 수에 따라 100K, 1MB, 224MB 등 다양합니다. 여기서는 무비렌즈 100K 데이터셋을 이 용합니다. 아래 사이트에서 100K 데이터셋을 내려받으세요. http://grouplens.org/datasets/movielens/

12장 영화 추천 시스템 만들기 - 실전 303


100K짜리 데이터셋은 1997년 9월부터 1998년 4월 동안 수집되었고 다음과 같은 항목으로 구성되어 있습니다. u .data : 영화 1,682개에 대해 미국의 사용자 943명이 매긴 별점(1 - 5 ) 100,000개

u .user : 사용자 나이, 성별, 직업, 우편번호( zip ) 정보

u .item : 영화 정보, 상영 개시일, 비디오 발매일, IMDB URL , 장르 정보

장르 정보는 원-핫 인코딩으로 표시하고 19가지입니다. 자세한 분류는 다음과 같습니다. 미정 Unknown, 액션 Action, 어드벤처Adventure, 애니메이션 Animation, 아동용 Children’s, 코미디 Comedy

, 범죄 Crime, 다큐멘터리 Documentary, 드라마 Drama, 판타지 Fantasy, 느와르 Film-Noir, 호

러 Horror, 뮤지컬 Musical, 미스터리 Mystery, 로맨스 Romance, SF Sci-Fi, 스릴러 Thriller, 전쟁 War, 서부극 Western 무비렌즈의 사용자 별점 정보는 [표 12-1], 사용자 정보는 [표 12-2], 영화 정보는 [표 12-3]과 같습니다. 표 12-1 사용자 별점 정보(u.data )의 예 사용자 ID

영화 ID

별점

데이터 생성 시간

196

242

3

881250949

186

302

3

891717742

22

377

1

878887116

표 12-2 사용자 정보(u.user )의 예 사용자 ID

나이

성별

직업

우편번호

1

24

M

기술자(technician )

85711

2

53

F

그 외(other )

94043

3

23

M

작가(writer )

32067

표 12-3 영화 정보(u.item )의 예 영화 ID

영화 정보

상영 개시일

1

Toy Story (1995 )

1-Jan - 95

304 3부 머신러닝 시스템 구현

비디오 발매일

IMDB URL

미정

액션 어드벤처

http://us.imdb.com/M/ title-exact?Toy%20 Story%20 (1995 )

0

0

0


영화 ID

영화 정보

상영 개시일

IMDB URL

미정

액션 어드벤처

2

GoldenEye (1995 )

1-Jan - 95

http://us.imdb.com/M/ title-exact?GoldenEye %20 (1995 )

0

1

1

3

Four Rooms (1995 )

1-Jan - 95

http://us.imdb.com/M/ title-exact?Four%20 Rooms%20 (1995 )

0

0

0

비디오 발매일

이 장에서는 6.4절 ‘협업 필터링’에서 공부한 특잇값 분해를 이용한 협업 필터링으로 추천 시스 템을 구현해보겠습니다.

12.2 데이터 전처리 앞 절에서 얻은 데이터를 영화 내용 간 유사도 평가 및 별점 예측을 하기 위한 형태로 가공하겠 습니다. 10.2절 ‘데이터 전처리’에서 살펴보았듯이 데이터의 전체 모습(평균, 최댓값, 최솟값 등의 기초 통계량)을 파악하여 예욋값을 삭제하고, 데이터를 제대로 활용할 수 있도록 알맞게 가공해야 합니다. 일단 데이터를 읽어 들여 전체적인 모습을 파악해봅시다. 여기서는 다음과 같은 과정을 거쳐 전 처리하게 됩니다. 1. 사용자 정보, 영화 정보를 읽어 들여 리스트로 저장 2. 사용자가 준 별점 정보를 읽어 들여 넘파이 다차원 배열에 저장 3. 사용자 별점과 영화 별점의 편차 계산

주의해야 할 점은 무비렌즈 데이터셋이 LATIN-1의 문자 인코딩을 사용한다는 것입니다. 파일 을 올바르게 읽으려면 codecs 패키지의 codecs.open 함수를 사용해서 읽어 들일 파일의 문자 코드를 지정합니다. 예제 12-1 무비렌즈의 사용자와 영화 정보 데이터 읽어 들이기

import codecs def read_data(fin, delim): info_li = [] 12장 영화 추천 시스템 만들기 - 실전 305


for line in codecs.open(fin, "r", encoding="latin-1"): line_items = line.strip().split(delim) key = int(line_items[0]) # info_li의 인덱스를 키로 사용할 것이므로 데이터 파일에 정수형으로 들어 있는 key가 # 순서대로 들어 있지 않거나 빠진 경우를 대비해서 에러 처리를 합니다. if (len(info_li) + 1) != key: print('errors at data_id') exit(0) info_li.append(line_items[1:]) print('rows in %s: %d' % (fin, len(info_li))) return(info_li)

사용자와 영화 정보 데이터의 파일명을 각각 파라미터로 주어서 read_data 함수를 호출한 결 과는 다음과 같습니다. fin_user= 'u.user' fin_movie= 'u.item' >>> user_info_dic = read_data(fin_user,'|') >>> movie_info_dic = read_data(fin_movie,'|') rows in u.user: 943 rows in u.item: 1682 >>> >>>

사용자 정보와 영화 정보를 읽었으므로 [표 6-4]와 같은 유틸리티 행렬 R 을 만들어봅시다. 행 렬 R 의 크기는 사용자 수 × 영화 수고, 각 항에는 사용자가 영화에 매긴 별점을 입력합니다. 예제 12-2 무비렌즈의 별점 정보 파일을 이용하여 유틸리티 행렬 만들기

import numpy as np # 사용자 수 m, 영화 수 n을 크기로 가지는 행렬을 만들고, 모든 요소를 0.0으로 채웁니다. R = np.zeros((len(user_info_dic), len(movie_info_dic)), dtype=np.float64) for line in codecs.open('u.data', 'r', encoding='latin-1'): user, movie, rating, date = line.strip().split('\t') # 사용자 ID와 영화 ID가 1부터 시작하므로 행렬의 인덱스에 맞추기 위해 -1을 합니다. # 사용자 1이 영화 10에 매긴 별점 정보는 R[0,9]에 들어가게 됩니다.

306 3부 머신러닝 시스템 구현


user_index = int(user)-1 movie_index = int(movie)-1 R[user_index,movie_index]= float(rating)

유틸리티 행렬에서 사용자 1이 영화 11에 매긴 점수를 보도록 합시다. 행렬의 인덱스를 참조하 기 위해 -1을 합니다. >>>

print(R[0,10])

2.0

별점이 2라는 것을 알 수 있습니다. 유틸리티 행렬을 만들었으므로 사용자가 영화에 준 별점에 편차가 있는지 살펴보겠습니다. 편차 가 심할 경우, 즉 한 사용자가 한 영화에만 높은 점수를 주고 나머지에는 낮은 점수를 준다든가 할 경우 이 데이터를 분석하기 어려울 겁니다. 이 경우엔 표준화를 하는 게 낫겠죠. 각 사용자의 평균 별점 기초 통계량과 각 영화의 평균 별점 기초 통계량을 구해보겠습니다. 10장에서 소개한 적이 있는 scipy의 stats.describe 함수를 사용합니다. 별점이 0, 즉 사용자가 아직 별점을 매기지 않은 경우에는 기초 통계 계산에 포함시키지 않는다는 것에 유의하기 바랍니다. 예제 12-3 사용자의 평균 별점 기초 통계량 구하기

from scipy import stats user_mean_li=[] for i in range(0,R.shape[0]): user_rating = [x for x in R[i] if x>0.0] user_mean_li.append(stats.describe(user_rating).mean)

결과는 다음과 같습니다. stats.describe(user_mean_li) DescribeResult(nobs=943, minmax=(1.4919540229885058, 4.8695652173913047), mean=3.5881911071848003, variance=0.19823286521146211, skewness=-0.44416521432016465, kurtosis=0.9286813229088393)

>>>

12장 영화 추천 시스템 만들기 - 실전 307


사용자의 평균 별점이 3.5고 분산이 0.19입니다. 한편 최소 평균 별점이 1.49점인데 비해 최 대 평균 별점은 4.86이네요. 즉, 어떤 사용자는 점수를 전반적으로 낮게 주고 어떤 사용자는 높 게 준 것을 알 수 있습니다. 사용자에 따른 별점의 편차가 큽니다. 영화에 대해서도 살펴볼까요? 영화의 기초 통계량을 뽑기 위해 ‘사용자 × 영화’ 행렬을 전치하여 ‘영화 × 사용자’ 행렬을 만들 어봅시다. 예제 12-4 각 영화의 평균 별점 기초 통계량 구하기

movie_mean_li=[] for i in range(0,R.shape[1]): # 유틸리티 행렬의 전치행렬을 구합니다. R_T = R.T movie_rating = [x for x in R_T[i] if x>0.0] movie_mean_li.append(stats.describe(movie_rating).mean)

결과는 다음과 같습니다. stats.describe(movie_mean_li) DescribeResult(nobs=1682, minmax=(1.0, 5.0), mean=3.0760445083251788, variance=0.61099475027975136, skewness=-0.6991282361538707, kurtosis=0.4442028070725441) >>>

평균 별점은 3.07이지만, 앞에서 사용자에 따라 편차가 컸던 것처럼, 영화별 평점도 1점에서 5점 까지 분포되어 있어 편차가 크다는 것을 알 수 있습니다.

12.3 내용 기반 영화 추천 시스템 만들기 이 절에서는 내용이 비슷한 영화를 추천하기 위해 영화의 내용 유사도를 계산합니다. 영화의 내용과 연관된 정보로는 영화 제목과 영화 플롯이 있습니다. 지금 사용하는 무비렌즈 데 이터에는 영화 플롯이 없습니다. The Open Movie Database 1라는 사이트는 영화 정보를 모

1 http://www.omdbapi.com/

308 3부 머신러닝 시스템 구현


CHAPTER

13

이미지 인식 시스템 만들기 - 실전

이 장에서는 7장에서 다룬 이론을 바탕으로 이미지 데이터를 이용하여 이미지 안의 비슷한 픽 셀을 묶는 K-평균 군집화, 고유 얼굴 검출, 손글씨로 쓴 숫자 분류 시스템을 살펴보겠습니다. 이미지 데이터를 이용한 머신러닝은 아래와 같은 흐름으로 이루어집니다. 1. 이미지 데이터를 전용 로드 함수를 이용하여 강도값으로 읽어 들이기 2. 수집한 데이터와 만들려는 시스템의 목적에 맞는 피처와 모델 선택하기 3. 파라미터를 바꾸어가며 모델을 학습 및 검증하여 최적의 파라미터 선택하기 4. 3에서 얻은 모델을 평가 데이터에 적용하여 시스템의 최종 성능 측정하기

1번 과정을 제외하고는 일반적인 머신러닝 과정과 같습니다. 이 장에서는 이미지 전용 라이브러 리와 텐서플로를 이용하여 K-평균 군집화, 주성분 분석, CNN을 구현합니다.

13.1 이미지 데이터를 이용한 K-평균 군집화 이미지 안에 어떠한 물체가 있는지 확인하려면 해당 물체와 관련된 픽셀을 묶어서 파악할 수 있어야 합니다. 이미지 분할에 사용되는 기법으로는 K-평균 군집화 외에도 윤곽선을 이용하는 지역 근접 그래프 region adjacency graph (RAG ) 방법, 사용자의 입력을 바탕으로 배경과 물체를 분 리하는 그랩컷 방법 등이 있습니다. 이 절에서는 OpenCV로 이미지 데이터를 다루는 방법을 살펴보기 위해 비슷한 색(강도값)의 픽셀들을 K-평균 군집화를 이용하여 클러스터링한 후 각

13장 이미지 인식 시스템 만들기 - 실전 333


픽셀을 클러스터의 중심점 값으로 채우겠습니다. 이렇게 하는 것으로 비슷한 색의 픽셀들을 하 나의 영역으로 묶게 됩니다. 예를 들어 픽셀을 클러스터 4개로 나눌 경우 이미지의 모든 픽셀 은 4개의 강도값 중 하나(클러스터의 중심값)를 가지게 되므로 클러스터 수가 많아질수록 사 용할 수 있는 강도값이 늘어나 원래 이미지와 비슷해진다는 것을 알 수 있습니다.

OpenCV의 kmeans 함수 원형은 다음과 같습니다(10.3절 ‘K-평균 군집화’에서 살펴본 사이킷 런의 KMeans 클래스 선언과 비교해보세요). cv2.kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])

data : 군집화를 적용할 이미지입니다. cv2는 이미지 하나를 하나의 샘플로 받습니다. 이미지는 넘파이의

float32 형의 숫자를 요소로 가지는 행렬이어야 합니다. 열 수는 피처 수와 같습니다. 예를 들어 ‘높이 10 x 넓이 20’의 픽셀을 가지는 컬러 이미지를 사용할 경우, 이 데이터는 200 (10 x 20 ) * 3 (RGB 채널 수)의 행렬이 됩니다. K : 클러스터의 개수입니다.

bestLabels : 각 데이터에 해당하는 클러스터의 인덱스를 저장하기 위한 정수형 배열입니다.

criteria : 클러스터링 종료 기준입니다. 아래와 같이 세 파라미터로 이루어진 튜플입니다.

- type : 3가지 인자를 가질 수 있습니다. ○ cv2.TERM_CRITERIA_EPS : 정확도가 주어진 epsilon과 같아지면 갱신을 종료합니다. ○ cv2.TERM_CRITERIA_MAX_ITER : 갱신 횟수가 주어진 max_iter와 같아지면 갱신을 종료합니다. ○ cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER : 위 두 조건 중 어느 한 조건을 만족

하면 갱신을 종료합니다. - max_iter : 최대 갱신 횟수(사이킷런 KMeans 클래스의 max_iter ) - epsilon : 클러스터의 정확도. 지난 업데이트와 이번 업데이트의 차이(사이킷런 KMeans 함수의 tol 참 조) attempts : 클러스터의 중심점을 몇 번이나 초기화할지 결정합니다. 사이킷런의 n_init와 같습니다.

flags : 클러스터의 중심점을 어떻게 초기화할지 결정합니다. 사이킷런의 init와 같습니다. 3가지 인자를

가질 수 있습니다. - KMEANS_RANDOM_CENTERS : 클러스터의 초기 중심점을 임의로 정합니다. - KMEANS_PP_CENTERS : kmeans++를 사용하여 초기 중심점을 정합니다. - KMEANS_USE_INITIAL_LABELS : 사용자가 지정한 클러스터 인덱스를 이용하여 초기화합니다. 복수의 초 기화를 할 경우(attempts가 1보다 클 경우) 두 번째 초기화부터는 임의로 정해진 중심점을 사용합니다.

334 3부 머신러닝 시스템 구현


다음과 같은 값을 리턴합니다. compactness : 샘플과 샘플이 속한 클러스터 중심점까지의 거리 제곱의 총합. 사이킷런의 inertia_와 같

습니다. labels : 샘플이 속한 클러스터 아이디. 사이킷런의 labels_와 같습니다.

centers : 중심점들의 리스트. 사이킷런의 cluster_centers_와 같습니다.

이미지 데이터를 다룰 때 주의할 점은 입력 데이터 행렬의 모든 요소가 반드시 넘파이의 float32 형 값이어야 한다는 것입니다. 데이터 행렬의 열 수는 피처 수와 같은데 일반적으로 R, G, B 등 의 색상 채널 수가 됩니다. 예를 들어 하나의 300 × 300 픽셀의 컬러 이미지는 맨 왼쪽 픽셀부터 한 줄씩 이미지의 맨 오른쪽 아래까지 나열한 300 × 300만큼의 요소에 3가지 색상 채널 값이 들어 있는 90,000 × 3 행렬로 바꾸어 OpenCV 함수의 입력으로 사용합니다.

OpenCV에서 주의할 점은 이미지 로딩 시 채널 순서로 RGB 값이 아닌 BGR 값을 사용한다 는 겁니다.1 matplotlib는 RGB 포맷을 사용하므로 matplotlib를 사용하여 이미지를 출력할 경우 변경할 필요가 있습니다. 코드는 다음과 같습니다. 예제 13-1 이미지 데이터의 컬러값을 이용한 K-평균 군집화

import cv2 import sys import numpy as np from matplotlib import pyplot as plt def image_kmeans(fin_img, K,fout_img): img = cv2.imread(fin_img) # 입력받은 이미지 행렬의 모양을 바꿉니다. # 가로 x 세로 x 채널 수의 입력을 가로 * 세로 * 채널 수로 바꿉니다. Z = img.reshape((-1,3)) # cv.kmeans의 입력으로 사용하기 위해 강도값을 넘파이의 float32 형으로 바꿉니다. Z = np.float32(Z)

1 과거에 윈도우 GDI ( graphics device interface ) 등과 같은 소프트웨어에서 컬러값을 구현하면서 헥사값 0x00bbggrr을 사용한 것이 유래라고 합니다.

13장 이미지 인식 시스템 만들기 - 실전 335


# 파라미터 criteria의 인자를 정합니다. 여기서는 최대 갱신 수 10, 갱신 에러 값 1.0을 이용하여 # 갱신을 종료합니다. 초기화는 10번 하겠습니다. criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) n_init = 10 ret,label,center=cv2.kmeans(Z,K,None,criteria, n_init,cv2.KMEANS_RANDOM_CENTERS) # 출력된 중심점의 값을 픽셀의 강도로 사용하기 위해 int로 바꿉니다. center = np.uint8(center) # 각 픽셀을 해당하는 중심점의 피처값(여기서는 각 채널의 강도값)으로 채웁니다. res = center[label.flatten()] # 출력을 위해 원래 이미지와 같은 모양의 행렬로 바꿉니다. res2 = res.reshape((img.shape)) plt.imshow(cv2.cvtColor(res2, cv2.COLOR_BGR2RGB)) plt.title('k=%d',K) plt.savefig(fout_img) if __name__ == '__main__': argv = sys.argv image_kmeans(argv[1],argv[2],argv[3])

다음과 같이 실행합니다.

>>>

python3 image_kmeans

<입력 파일명> <클러스터 수> <출력 파일명>

K를 바꾸어가며 픽셀의 강도값을 군집화한 결과는 다음 [그림 13-1]과 같습니다. K-평균 군집화는 픽셀의 강도값만 사용하기 때문에 픽셀이 인접해 있지 않아도 비슷한 강도값 을 가지면 같은 클러스터로 분류합니다. 이렇게 되면 한 물체를 이루는 픽셀들을 같은 클러스터 로 모으려는 이미지 분할의 목적에 맞지 않습니다. 이 경우에는 픽셀 위치 정보를 이용하는 것 이 좋습니다. 7.2.2절 ‘이미지 검출’에서 설명한 그랩컷 기법이 OpenCV의 grabCut 함수로 구현되어 있으므로 이 절에서 살펴본 OpenCV의 기본 기능(이미지 읽어 들이기 등)과 함께 이 용하면 어렵지 않게 구현할 수 있을 겁니다.

336 3부 머신러닝 시스템 구현


그림 13-1 각 K 값에 따른 K-평균 군집화 출력 이미지 K= 1

K= 4

K= 8

K= 16

13.2 주성분 분석을 이용한 사람 얼굴 인식 이 절에서는 7.3.4절 ‘주성분 분석’에서 설명한 내용을 바탕으로 고유 얼굴 검출을 구현합니다. 카테고리의 복수 이미지(예를 들면 복수의 사람 얼굴 이미지나 복수의 찻잔 이미지)로부터 주 성분을 추출함으로써 그 이미지들이 공통으로 가지는 피처(예를 들면 눈, 코, 입의 평균 위치, 찻잔의 일반적인 모양)를 추출하게 됩니다. 사이킷런의 PCA 클래스를 이용하면 이미지 분류에 주성분 분석을 쉽게 구현할 수 있습니다. 지금부터 사이킷런의 PCA 공식에서 제공하는 예제 2 를 통해 사람 얼굴을 인식하는 방법을 알아보겠습니다. 여기서는 AT&T의 얼굴 이미지 데이터셋을 이용하겠습니다. 사용할 데이터를 아래 사이트에 서 내려받으세요. http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html 2 http://scikit-learn.org/stable/auto_examples/applications/face_recognition.html

13장 이미지 인식 시스템 만들기 - 실전 337


이 데이터셋은 40명이 각각 다른 환경(어둡거나, 밝거나, 안경을 쓰거나, 눈을 감거나 등)에서 찍은 그레이스케일 이미지 10개(가로 92픽셀 × 세로 112픽셀)를 포함하고 있습니다. 따라서 이미지의 개수는 400개(40명 × 10개)입니다. 그림 13-2 AT&T 얼굴 데이터셋

338 3부 머신러닝 시스템 구현


기초부터 모델링,

이 책은 구글과 라쿠텐 머신러닝 개발자가 초보자 눈높이에서 머신러닝의 핵심 이론과 실용적인 예제를 제시합니다. 머신러닝 입문자가 이론을 바탕으로 강력한 성능을 내는 머신러닝 시스템을 구현하고 사용 할 수 있도록 하는 것이 이 책의 목표입니다. 1부에서는 머신러닝의 기초, 2부에서는 머신러닝의 주요 모델, 3부에서는 머신러닝 시스템 구현을 알려

처음 배우는 머신러닝

배경지식 없이도 머신러닝을 배우는 가장 확실한 방법

실전 예제, 문제 해결까지

줍니다. 이론, 실무 예제, 해결 방법까지 모두 담고 있어 입문자뿐 아니라 이미 머신러닝을 현업에서 다 루면서 체계적으로 실력을 다잡고자 하는 중고수에게도 최고의 선택이 될 겁니다.

김승연, 정용주 지음

복잡한 딥러닝 기법과 대용량 컴퓨팅 파워가 주류를 이루는 요즘 ‘머신러닝을 구현할 때는 기본으로 돌아가 데이터 특성을 파악하고 단순한 학습 기법에서 출발해야 한다’는 저자의 주장을 현업 데이터 과학자의 입장에서 다시 한번 강조하고 싶다. _ 김진영 PhD (스냅 데이터 과학자, 『헬로 데이터 과학』 저자)

이 책은 머신러닝을 이용하는 최신 애플리케이션들을 풍부하게 예로 들고, 수학과 통계에 대한 지식 없이도 쉽게 따라 하 며 머신러닝의 기본 개념을 익힐 수 있도록 쓰였다. 그런 점에서 실용적인 초심자용 교재에 대한 갈증을 크게 해소해줄 것 이라 기대한다.

_ 이준석 PhD (구글 리서치 소프트웨어 엔지니어)

전통적인 머신러닝에서부터 최근 열풍인 딥러닝의 활용(이미지, 자연어)까지 유기적으로 연계시킴으로써 딥러닝 입문자 들이 반드시 익혀야 할 머신러닝 기법을 습득하는 데 적합하다.

_ 반대현 PhD (삼성전자 소프트웨어 R&D 센터 책임연구원)

관련 도서 프로그래밍 / 머신러닝

밑바닥부터 시작하는 딥러닝

처음 배우는 인공지능

93000

골빈해커의 3분 딥러닝 9 791162 240045

예제 소스 https://github.com/your-first-ml-book

정가 26,000원

ISBN 979-11-6224-004-5

처음 배우는 머신러닝

김승연, 정용주 지음

처음 배우는 머신러닝 맛보기 : 기초부터 모델링, 실전 예제, 문제 해결까지  

머신러닝 기초 이론, 실전 예제, 문제 해결까지 한 번에 이 책은 구글과 라쿠텐 머신러닝 개발자가 초보자 눈높이에서 머신러닝의 핵심 이론과 실용적인 예제를 제시합니다. 머신러닝 입문자가 이론을 바탕으로 강력한 성능을 내는 머신러닝 시스템을 구현하고...

처음 배우는 머신러닝 맛보기 : 기초부터 모델링, 실전 예제, 문제 해결까지  

머신러닝 기초 이론, 실전 예제, 문제 해결까지 한 번에 이 책은 구글과 라쿠텐 머신러닝 개발자가 초보자 눈높이에서 머신러닝의 핵심 이론과 실용적인 예제를 제시합니다. 머신러닝 입문자가 이론을 바탕으로 강력한 성능을 내는 머신러닝 시스템을 구현하고...

Advertisement