​『머신러닝 실무 프로젝트』 - 맛보기

Page 1



Machine Learning at Work


| 표지 설명 | 표지 동물은 왕아르마딜로(giant armadillo )다. 피갑목, 아르마딜로과, 세띠아르마딜로아과, 왕 아르마딜로속의 포유류로, 왕아르마딜로속을 구성하는 유일한 종이다. 남미 사바나에서 열대 우림에 이르는 넓은 범위에 서식하나, 야행성이고 위험을 느끼면 굴 속에 숨어버리기 때문에 목격하기 어렵다. 큰 성체는 꼬리를 포함해 길이 150cm, 무게 50kg까지 자 란다. 등이 딱딱한 비늘로 덮여 있는데, 이는 체모가 비늘 모양으로 변화한 것이다. 흔히들 아르마 딜로는 몸을 공처럼 말아 자신을 지킨다고 알고 있지만 왕아르마딜로는 이런 습성이 없다. 숲과 그 주변 초원 등에 서식하며 물가를 좋아한다. 주로 흰개미를 먹는데, 그 밖에도 개미와 다른 곤충, 애벌레, 거미, 지렁이, 뱀, 동물의 사체, 식물 등도 먹는다. 앞발로 개미집과 땅을 파헤쳐 안에 있는 먹이를 먹는다. 일부 지역에서는 식용 등으로 남 획되면서 개체 수가 급감, 멸종 가능성이 큰 동물로 알려져 있다. 국제자연보전연맹(IUCN )의 적색 목록에는 절멸 위급(야생 에서 절멸할 가능성이 대단히 높음) 분류에 올라 있다.

머신러닝 실무 프로젝트 실전에 필요한 머신러닝 시스템 설계, 데이터 수집, 효과 검증 노하우 초판 1쇄 발행 2018년 6월 5일 지은이 아리가 미치아키, 나카야마 신타, 니시바야시 다카시 / 옮긴이 심효섭 / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제10 – 1779호 / ISBN 979 -11- 6224- 081- 6 93000 총괄 전태호 / 책임편집 김창수 / 기획ㆍ편집 이복연 디자인 표지·내지 김연정 조판 이경숙 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 송경석, 변지영 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr © 2018 Hanbit Media Inc.

Authorized Korean translation of the Japanese edition of ‘Machine Learning at Work’ © 2018 Michiaki Ariga, Shinta Nakayama, Takashi Nishibayashi. This translation is published and sold by permission of O’Reilly Japan, Inc., the owner of all rights to publish and sell the same. 이 책의 저작권은 오라일리재팬과 한빛미디어(주)에 있습니다. 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단전재와 복제를 금합니다.

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


Machine Learning at Work


지은이 소개

지은이

아리가 미치아키 有賀 康顕

전자 회사의 연구소와 레시피 서비스 회사를 거쳐, 지금은 Cloudera 소속의 필드 데이터 과학 자다. 데이터 활용과 머신러닝 지원 업무를 담당한다. ●●

https ://twitter.com/chezou

●●

https ://www.slideshare.net/chezou

●●

https ://chezo.uno/

지은이

나카야마 신타 中山 心太

일본 최대 이동통신사의 연구소, 소셜 게임 개발사, 머신러닝을 활용한 웹 마케팅 프리랜서를 거쳐, 지금은 (주)Next Int를 창업했다. 자사 서비스 개발 외에도 게임 기획과 머신러닝 기획 을 수탁한다. 머신러닝 게임 디자인, 사업 설계, 신규 사업 기획 등을 두루 수행한다. ●●

https ://twitter.com/tokoroten

●●

https ://www.slideshare.net/TokorotenNakayama

●●

https ://medium.com/@tokoroten/

지은이

니시바야시 다카시 西林 孝

독립 SIer 소프트웨어 벤더를 거쳐, 지금은 (주)VOYAGE GROUP 소속 소프트웨어 엔지니 어다. 인터넷 광고 서비스의 광고 전달 논리를 개발한다.

4

●●

https ://hagino3000.blogspot.jp/

●●

https ://speakerdeck.com/hagino3000

●●

https ://twitter.com/hagino3000


옮긴이 소개

옮긴이

심효섭 flourscent@gmail.com

연세대학교 문헌정보학과를 졸업하고 모교 중앙도서관과의 인연으로 도서관 솔루션 업체에서 일하게 되면서 개발을 시작했다. 네이버에서 웹 서비스 개발 업무를 맡았으며, 웹 서비스 외에 머신러닝에 대한 공부도 꾸준히 하고 있다. 최근 관심사는 회사에 속하지 않고도 지속 가능한 삶이다. 옮긴 책으로는 『엔지니어를 위한 블록체인 프로그래밍』(한빛미디어), 『엔지니어를 위 한 파이썬』, 『딥러닝 제대로 시작하기』, 『그림과 수식으로 배우는 통통 딥러닝』, 『그림과 수식으 로 배우는 통통 머신러닝』, 『그림과 수식으로 배우는 통통 인공지능』(이상 제이펍), 『파이썬으 로 시작하는 컴퓨터 과학 입문』(인사이트) 등이 있다.

5


옮긴이의 말

최근 참 다양한 머신러닝 책이 나오고 있다. 머신러닝 개발자가 아닌 사람마저 ‘지금 배워두지 않으면 뒤쳐지는 건 아닐까?’하는 초조함이 들 만큼 큰 화두로 떠오른 것이다. 그리하여 부랴부랴 머신러닝 이론을 익혀보지만, 이것을 또 실무에 적용해 가치를 창출하기까 지는 생각보다 간극이 크다. 이 책은 이론과 실무 사이의 이 간극을 메워줄 수 있는 책이다. 그렇다고 이론을 소홀히 하지는 않는다. 머신러닝이 무엇인지, 어떤 알고리즘이 있고 그 특징 은 무엇인지 등을 꼼꼼히 알려주어 배경지식이 부족한 독자에게도 친절한 책이다. 말하자면 머 신러닝에 익숙하지 않지만, 당장 머신러닝과 관련된 업무 지시를 받은 개발자에게 딱 맞는 책 이라고 생각한다. 이 책은 크게 두 부분으로 구성된다. 1부는 머신러닝 이론과 알고리즘 소개, 그리고 실제 머신 러닝 프로젝트에서 겪을 수 있는 시행착오를 효율적으로 할 수 있는 요령을 소개한다. 특히 학 습용 데이터를 수집하는 요령은 이론 공부만으로는 얻을 수 없는 소중한 간접 경험이 될 것이 다. 2부는 간단하지만 실무와 밀접히 연관된 사례별 연구를 다룬다. 추천 시스템을 구현해봄으 로써 원리를 파악하고, 머신러닝을 적용한 결과를 수치로 확인하여 경영진의 신뢰를 얻는 데도 도움될 것이다. 머신러닝에 관심 있는 개발자의 학습과 아직 경험이 부족함에도 당장 관련 프로젝트를 시작하 는 개발자의 시행착오를 줄여주는 데 도움이 되기를 바란다. _심효섭

6


지은이의 말

최근 들어 머신러닝 환경이 눈이 어지러울 만큼 빠르게 변하고 있다. 2년 전 이 책의 집필 을 시작한 이후로도 많은 변화가 있었다. 특히 딥러닝 쪽이 격변이었는데, 2012년 제프리 힌 튼Geoffrey Hinton이 ILSVCRThe ImageNet Large Scale Visual Recognition Challenge 대회에서 딥러닝을 적용해 큰 차이로 우승한 이후로 빠르게 확산되었다. 이와 더불어 2015년 텐서플로가 발표되면서 일반 소프트웨어 엔지니어에게도 폭발적으로 보급되기에 이른다. 한편, 기존에 딥러닝 발전에 크게 기여한 머신러닝 프레임워크인 Pylearn2나 Theano가 배포를 중지할 만큼 무섭게 발전하는 분야이기도 하다. 이제 딥러닝을 이용한 물체 인식, 음성 인식, 음성 합성, 기계 번역 등의 응용은 우리 일상에서 쉽게 접할 수 있게 되었다. 오늘날 스마트폰 없는 생활을 상상할 수 없듯, 돌이킬 수 없는 패러 다임의 변화가 일어나고 있음을 실감하는 요즘이다. 이런 현실에서 이 책을 쓰기로 한 이유는, 동료들로부터 머신러닝 관련 질문을 받을 때마다 기 존 이론서들에서는 다루지 않지만 업무에는 꼭 필요한 지식이 많다는 생각이 들었기 때문이다. 탐색적 분석에 대한 경험과 데이터 분석 업무를 수행하면서 경험적으로 익혀온 묵시적 지식 등 이 여기 해당하여, 이러한 주제의 논의가 더 많아져야 한다고 느꼈다. 굳이 딥러닝이 아닌 전통적 머신러닝만으로 책을 꾸린 이유는 우리 저자들이 매일매일 업무를 통해 쌓아온 경험을 전하고 싶었기 때문이다. 머신러닝을 독학으로 익히느라 이런 주제를 접할 기회가 없던 독자들에게 이 책이 머신러닝을 활용하는 데 미력하나마 도움이 되기를 바란다.

7


들어가며

머신러닝이 소프트웨어 엔지니어 사이에서도 많이 회자되고 있다. 일반인 사이에서도 ‘인공지 능이 사람의 직업을 빼앗을 것’이라든가 ‘나도 딥러닝을 공부해야 하나’ 같은 말도 심심치 않게 들려오는 요즘이다. 이런 상황이 된 데에는 알파고가 한몫했을 것이다. 그리고 대량의 데이터 를 쉽게 수집할 수 있게 되었고 수집한 데이터를 처리하는 하드웨어의 성능도 좋아졌으며, 최 신 알고리즘이 구현된 오픈소스 프레임워크를 간편하게 사용할 수 있게 된 영향이 크다. 이렇게 머신러닝에 대한 기대가 높아지면서, 우리에게도 머신러닝을 가르쳐달라는 요청이 많 이 들어왔다. 다행히 여러 연구자가 알고리즘과 이론에 대한 좋은 책을 많이 집필해주었고 머 신러닝 프레임워크 사용법과 구현 방법을 설명하는 책과 인터넷 자료도 많이 나왔다. 이 덕분 에 머신러닝을 도입하는 허들이 많이 낮아졌다. 최근에는 정보과학 계통 학생이 대학에서 머신러닝 이론을 배우고 연구하여, 졸업 후 소프트웨 어 엔지니어로 일하는 경우가 늘었다. 이들은 이론과 배경지식을 활용하여 머신러닝 엔지니어 로서 연구개발에 힘을 보태고 있다. 그러나 코세라Coursera 같은 온라인 강의, 책, 대학에서의 연 구만으로는 실제 비즈니스에 어떻게 적용해야 하는지, 혹은 어떤 경우에 어떤 머신러닝 기법과 데이터 분석 방법을 적용해야 하는지까지는 배우기 어렵다. 풀려는 문제를 정의하고 시스템을 설계하는 방법에 관해서도 마찬가지로 배울 기회가 좀처럼 없다.

누구를 위한 책인가 이 책은 다음과 같은 독자를 대상으로 머신러닝과 데이터 분석 도구를 어떻게 비즈니스에 활용 하는지, 그리고 불확실성이 높은 머신러닝 프로젝트를 어떻게 진행하는지를 다룬다.

8

●●

머신러닝 입문서를 떼고 실무에 활용하려는 엔지니어

●●

대학에서 배운 머신러닝을 제품에 적용하려는 주니어 엔지니어


더 자세히는 다음과 같다. ●●

머신러닝 프로젝트를 시작하는 방법

●●

기존 시스템에 머신러닝을 통합하는 방법

●●

머신러닝에 사용할 데이터를 수집하는 방법

●●

가설을 세우고 분석을 진행하는 방법

처음에는 머신러닝 입문서로 시작했는데, 결국 이론을 어느 정도 익힌 소프트웨어 엔지니어에 게 적합한 실무서가 되었다. 알고리즘을 다루는 책은 이미 많이 나왔으므로, 이 책에서는 머신러닝 프로젝트를 처음 시작 하는 방법, 시스템 구성 방법, 학습 데이터 수집 방법처럼 실무에 유용한 내용을 중점적으로 다룬다. 이 책의 역할

대학의 연구 도서

비즈니스 •시스템 구축 •효과 검증 •사업 추진

코세라 강의

아카데믹

실무

‘인공지능으로 괜찮은 성과를 내보라’는 회사 요구에 대처하는 방법을 직접 다루는 것은 아니 다. 그러나 이 책을 읽고 나면 어떻게 대응해야 할지 어느 정도는 감이 올 것이다.

9


누구를 위한 책이 아닌가 이 책은 다음 내용을 다루지 않는다. ●●

머신러닝 이론과 알고리즘, 특히 딥러닝

●●

프로그래밍 기초

●●

미적분, 행렬, 확률 등 고등학교 수준 수학

그러므로 다음과 같은 사람에게는 적합하지 않다. ●●

머신러닝 연구자

●●

머신러닝 이론을 배우려는 사람

●●

사이킷런이나 텐서플로 같은 머신러닝 프레임워크 사용법을 배우려는 사람

●●

머신러닝 프레임워크를 구현해보고 싶은 사람

전제와 추천 자료 일부 장을 제외하면 수식 사용을 자제했지만, 그래도 어느 정도의 수학 지식과 머신러닝 기 초가 있어야 쉽게 이해할 수 있다. 머신러닝 강의( https ://www .coursera .org /learn /

machine-learning )를 듣거나 『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017 )과 같은 책 을 참고하면 도움이 될 것이다. 또, 이 책에서는 파이썬과 사이킷런을 사용한 코드를 위주로 설명하지만 파이썬, 사이킷런, 주 피터 노트북의 사용법을 다루지는 않는다. 이에 대한 자세한 사항은 다음 자료를 참고하기 바 란다.

10

●●

사이킷런의 참조 문서: http ://bit.ly/2JKBD4G

●●

『파이썬 라이브러리를 활용한 머신러닝』(한빛미디어, 2017 )

●●

『핸즈온 머신러닝: 사이킷런과 텐서플로를 활용한 머신러닝, 딥러닝 실무』(한빛미디어, 2018 )

●●

『파이썬 머신러닝』(지앤선, 2017 )

●●

​(일서) 『PythonユーザのためのJupyter[実践]入門』(기술평론사, 2017 )


이 책의 구성 이 책은 머신러닝 프로젝트를 수행하려면 알아야 할 지식을 정리한 1부와, 실제 사례 연구를 정리한 2부로 나뉜다.

1부는 실무에서 머신러닝을 사용하기 위한 기본적인 지식을 다룬다. ●

1장은 머신러닝 프로젝트가 어떤 과정을 거쳐 수행되는지 정리한다. 그리고 머신러닝 기 초를 복습한 다음, 머신러닝이 적용된 시스템에서만 맞닥뜨릴 수 있는 어려움에 관해 설명 한다.

2장은 머신러닝으로 할 수 있는 일과 다양한 머신러닝 알고리즘을 소개한다. 각 알고리즘 의 특성을 카탈로그 형태로 정리하였다. 다양한 알고리즘에 익숙하지 않다면, 2장을 통해 알고리즘 선택 요령과 알고리즘들의 결정 경계 모양 등을 쉽게 확인할 수 있다.

3장은 스팸 메일 분류를 예로 들어 오프라인으로 예측 모델을 평가하는 방법을 알아본다.

● 4장은 기존 시스템에 머신러닝을 통합하는 주요 패턴을 정리한다. 이와 함께 학습에 사용 할 로그를 설계하는 방법도 다룬다. ●

5장은 머신러닝의 분류 문제에 사용할 정답 데이터를 수집하는 방법을 다룬다. 6장은 도입한 정책이 실제로도 효과가 있는지를 검증하는 통계 검정, 인과효과 추정, A/B

테스트를 소개한다. 앞서 3장에서 예측 모델을 오프라인으로 평가하는 방법을 다뤘는데, 여기서는 실제 도입된 상황에서 평가하는 방법을 다룬다. 매우 중요한 내용이지만 1부의 다른 장보다 수학과 통계 지식이 더 많이 필요하다. 이해하기 어렵다면 건너뛰어도 무방 하다.

2부는 더 실무에 가까운 주제로 구성된다. ●

7장은 영화 추천 기능을 예로 들어 예측 시스템을 만드는 방법을 소개한다.

11


8장은 탐색적 분석 과정 사례를 소개하고, 이를 기초로 작성한 보고서를 함께 실었다. 1장

에서 언급한 ‘머신러닝이 굳이 필요없는 예’ 중 하나이며, 분석 결과를 정리하는 방법에 대 한 힌트도 얻을 수 있다. ●

9장은 업리프트 모델링을 사용하여 마케팅의 효율을 개선하는 방법을 알아본다.

머신러닝 역시 데이터를 활용하는 한 가지 방법에 지나지 않는다. 맹목적으로 적용할 것이 아니 라, 무엇을 왜 하는지 확실히 인지하며 업무를 수행하는 데 이 책이 도움이 되기를 바란다.

예제 소스 내려받기 이 책의 코드가 실린 Jupyter Notebook은 다음 저장소에서 내려받을 수 있다. ●●

12

https ://github.com/flourscent/ml -at -work


감사의 말 이 책을 쓰면서 많은 분의 도움을 받았다. 코미야 아츠시는 인터넷 광고 실무 경험을 기초로 이 책을 검토해주었다. 신고도 A/B 테스트 의 효과 검증에 대해 가르침을 주었다. 파이썬 관련 회사 워크숍으로 인연을 맺은 PySpa 커뮤니티의 니시오 히로카즈, 우에니시 코 타, 오쿠다 준이치, 시부카와 요시키, 와카야마 시로, 야마모토 하야토, 타카보우, d1ce _가 책 을 검토해주었다. 특히 니시오는 이론과 역사적인 면을, 오쿠다는 수학적인 내용을, 우에니시 는 대상 독자인 소프트웨어 엔지니어의 관점을 이해하는 데 큰 도움을 주었다. 이분들과의 논 의로 이 책이 더 나아질 수 있었다. 이 책은 2017년 4월에 개최된 <기술서전 2 >라는 동인지 전시 즉매회에 배포한 「BIG MOUSE

DATA 2017 SPRING」을 바탕으로 했다. 당시 아리가가 집필한 책의 출판이 좀처럼 성사되지 않고 있었기 때문에 ‘이왕이면 우리 모두가 가진 비장의 분석 결과를 모아 동인지로 내보자’는 가벼운 마음으로 시작한 프로젝트였다. 이 동인지는 꽤 많은 호응을 얻어서 오라일리재팬으로 부터 제의를 받아 출판이 성사될 수 있었다. <기술서전>을 주최한 TechBooster, 타츠진출판 회 여러분, 운영 스태프들, 동인지판의 출판에 도움을 준 츠보이 소고, 히레코케에게도 감사의 말을 전한다. 기획부터 편집, 그림, 저자 케어까지 많은 부분에서 도움을 준 오라일리재팬의 타키자와 덕분 에 무사히 이 책이 출판될 수 있었다. 또, SB 크리에이티브의 스기야마에게도 감사드린다. 긴 집필 기간 동안 밝은 모습으로 저자 아리가를 응원해준 아리가 에리코, 유이카, 카오리에게 도 감사를 전한다.

13


CONTENTS

PART

지은이 소개 ........................................................................................................................

4

옮긴이 소개 ........................................................................................................................

5

옮긴이의 말 ........................................................................................................................

6

지은이의 말 ........................................................................................................................

7

들어가며 ............................................................................................................................

8

1 머신러닝 실무 노하우

CHAPTER

1 머신러닝 프로젝트 처음 시작하기 1.1 머신러닝은 어떻게 동작하는가 ...................................................................................... 23 1.2 머신러닝 프로젝트의 과정 ............................................................................................ 25 1.2.1 문제 정의하기 ................................................................................................... 26 1.2.2 머신러닝을 사용하지 않는 방법 검토하기 ............................................................... 27 1.2.3 시스템 설계하기 ................................................................................................ 29 1.2.4 알고리즘 선택하기 ............................................................................................. 31 1.2.5 특징, 정답 데이터, 로그 설계하기 .......................................................................... 31 1.2.6 데이터 전처리 ................................................................................................... 32 1.2.7 학습 및 파라미터 튜닝 ........................................................................................ 33 1.2.8 시스템에 통합하기 ............................................................................................. 35

1.3 운영 시스템에서 발생하는 머신러닝 문제 대처 방법 .......................................................... 36 1.3.1 사람이 작성한 황금기준을 사용하여 예측 성능 모니터링 ........................................... 37 1.3.2 예측 모델을 모듈화하여 알고리즘에 대한 A/B 테스트 수행 ....................................... 37 1.3.3 모델 버전관리를 통한 자유로운 롤백 ..................................................................... 37 1.3.4 데이터 처리 파이프라인 저장 ............................................................................... 38

14


1.3.5 개발 시스템과 운영 시스템의 언어 및 프레임워크 일치 ............................................. 39

1.4 머신러닝 시스템을 성공적으로 운영하려면 ...................................................................... 40 1.5 정리 ......................................................................................................................... 42

CHAPTER

2 머신러닝으로 할 수 있는 일 2.1 머신러닝 알고리즘 선택 방법 ........................................................................................ 43 2.2 분류 ......................................................................................................................... 45 2.2.1 퍼셉트론 .......................................................................................................... 46 2.2.2 로지스틱 회귀 ................................................................................................... 54 2.2.3 서포트 벡터 머신 ............................................................................................... 59 2.2.4 신경망 ............................................................................................................. 63 2.2.5 k-최근접 이웃 .................................................................................................. 65 2.2.6 결정 트리, 랜덤 포레스트, GBDT ......................................................................... 68

2.3 회귀 ......................................................................................................................... 72 2.3.1 선형 회귀의 원리 ............................................................................................... 73

2.4 군집화와 차원 축소 ..................................................................................................... 74 2.4.1 군집화 ............................................................................................................. 74 2.4.2 차원 축소 ......................................................................................................... 75

2.5 그 외 ........................................................................................................................ 76 2.5.1 추천 ................................................................................................................ 76 2.5.2 이상 탐지 ......................................................................................................... 76 2.5.3 패턴 마이닝 ...................................................................................................... 77 2.5.4 강화 학습 ......................................................................................................... 77

2.6 정리 ......................................................................................................................... 78

15


CONTENTS

CHAPTER

3 학습 결과 평가하기 3.1 분류 결과에 대한 평가 행렬 .......................................................................................... 79 3.1.1 그냥 정확도를 사용하면 될까? ............................................................................. 80 3.1.2 데이터 분포가 치우친 경우를 위한 지표 - 정밀도와 재현율 ....................................... 80 3.1.3 균형 잡힌 성능을 평가하는 F-점수 ....................................................................... 81 3.1.4 혼동행렬 따라잡기 ............................................................................................. 82 3.1.5 다중 클래스 분류의 평균 구하기 - 마이크로 평균과 매크로 평균 ................................ 84 3.1.6 분류 모델 비교하기 ............................................................................................ 85

3.2 회귀 모델 평가하기 ..................................................................................................... 86 3.2.1 평균제곱근오차 ................................................................................................. 86 3.2.2 결정 계수 ......................................................................................................... 87

3.3 머신러닝 시스템의 A/B 테스트 ..................................................................................... 88 3.4 정리 ......................................................................................................................... 89

CHAPTER

4 기존 시스템에 머신러닝 통합하기 4.1 기존 시스템에 머신러닝을 통합하는 과정 ........................................................................ 91 4.2 시스템 설계 ............................................................................................................... 92 4.2.1 헷갈리기 쉬운 ‘배치 처리’와 ‘배치 학습’ . ................................................................ 92 4.2.2 배치 처리로 학습 + 예측 결과를 웹 애플리케이션에서 직접 산출(예측을 실시간 처리) ..... 94 4.2.3 배치 처리로 학습 + 예측 결과를 API를 통해 사용(예측을 실시간 처리) ........................ 97 4.2.4 배치 처리로 학습 + 예측 결과를 DB에 저장하고 사용(예측을 배치 처리) ...................... 98 4.2.5 실시간 처리로 학습 .......................................................................................... 101 4.2.6 각 패턴의 특성 ................................................................................................ 101

16


4.3 로그 설계 ................................................................................................................ 103 4.3.1 특징과 훈련 데이터에 사용되는 정보 ................................................................... 103 4.3.2 로그 저장하기 ................................................................................................. 104 4.3.3 로그 설계 시의 주의점 ...................................................................................... 105

4.4 정리 ....................................................................................................................... 107

CHAPTER

5 학습 데이터 수집하기 5.1 학습 데이터를 얻는 방법 ............................................................................................ 109 5.2 공개된 데이터셋이나 모델 활용 ................................................................................... 111 5.3 개발자가 직접 만드는 데이터셋 ................................................................................... 112 5.4 동료나 친구에게 데이터 입력을 부탁 ............................................................................ 113 5.5 크라우드소싱 활용 .................................................................................................... 114 5.6 서비스에 수집 기능을 넣고 사용자가 입력하게 함 ........................................................... 116 5.7 정리 ....................................................................................................................... 116

CHAPTER

6 효과 검증하기 6.1 효과 검증 ................................................................................................................ 117 6.1.1 효과 검증까지 거쳐야 할 과정 ............................................................................ 118 6.1.2 오프라인에서 검증하기 어려운 부분 .................................................................... 119

6.2 가설 검정 ................................................................................................................ 121 6.2.1 동전이 찌그러지진 않았을까 .............................................................................. 121 6.2.2 두 그룹의 모비율의 차를 이용한 검정 .................................................................. 123 6.2.3 거짓 양성과 거짓 음성 ...................................................................................... 126

17


CONTENTS

6.3 가설 검정에서 주의할 점 ............................................................................................ 126 6.3.1 반복해서 검정하는 경우 .................................................................................... 126 6.3.2 유의한 차이와 비즈니스 임팩트 .......................................................................... 128 6.3.3 동시에 여러 가설 검정하기 ................................................................................ 130

6.4 인과효과 추정 .......................................................................................................... 132 6.4.1 루빈 인과모형 ................................................................................................. 132 6.4.2 선택 편향 ....................................................................................................... 133 6.4.3 무작위 대조시험 .............................................................................................. 134 6.4.4 과거와의 비교는 어렵다 .................................................................................... 135

6.5 A/B 테스트 ............................................................................................................. 136 6.5.1 그룹 선정과 표본 크기 ...................................................................................... 137 6.5.2 A/A 테스트로 그룹의 균질성 확인 ...................................................................... 138 6.5.3 A/B 테스트를 위한 구조 만들기 ......................................................................... 138 6.5.4 테스트 종료 .................................................................................................... 138

6.6 정리 ....................................................................................................................... 139

PART

2 머신러닝 실무 프로젝트

CHAPTER

7 프로젝트 1: 영화 추천 시스템 만들기 7.1 시나리오 ................................................................................................................. 143 7.1.1 추천 시스템이란 .............................................................................................. 144 7.1.2 응용 분야 ....................................................................................................... 144

7.2 추천 시스템 제대로 알기 ............................................................................................ 145 7.2.1 데이터 설계와 데이터 입수 ................................................................................ 145

18


7.2.2 명시적 데이터와 묵시적 데이터 .......................................................................... 147 7.2.3 추천 시스템의 알고리즘 .................................................................................... 148 7.2.4 사용자 기반 협업 필터링 ................................................................................... 148 7.2.5 아이템 기반 협업 필터링 ................................................................................... 151 7.2.6 모델 기반 협업 필터링 ...................................................................................... 152 7.2.7 내용 기반 필터링 ............................................................................................. 153 7.2.8 협업 필터링과 내용 기반 필터링의 장단점 ............................................................ 154 7.2.9 평가 척도 ....................................................................................................... 154

7.3 무비렌즈 데이터 분석하기 .......................................................................................... 155 7.4 추천 시스템 구현하기 ................................................................................................ 160 7.4.1 인수분해 머신을 이용한 추천 ............................................................................. 160 7.4.2 인수분해 머신을 이용한 본격적인 학습 ................................................................ 163 7.4.3 사용자와 영화 외의 정보 추가하기 ...................................................................... 167

7.5 정리 ....................................................................................................................... 170

CHAPTER

8 프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지 8.1 킥스타터 API 찾아보기 ............................................................................................. 172 8.2 킥스타터 크롤러 만들기 ............................................................................................. 172 8.3 JSON 데이터를 CSV로 변환하기 ............................................................................... 174 8.4 엑셀로 데이터 훑어보기 ............................................................................................. 175 8.5 피벗 테이블로 데이터 분석하기 ................................................................................... 179 8.6 목표액 달성 후 취소된 프로젝트 살펴보기 ..................................................................... 184 8.7 국가별로 살펴보기 .................................................................................................... 185 8.8 보고서 작성하기 ....................................................................................................... 187 8.9 이 다음에 할 일 ........................................................................................................ 194 8.10 정리 .................................................................................................................... 196

19


CONTENTS

CHAPTER

9 프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기 9.1 업리프트 모델링의 사분면 .......................................................................................... 198 9.2 A/B 테스트를 확장한 업리프트 모델링 ......................................................................... 199 9.3 업리프트 모델링에 사용할 데이터셋 만들기 ................................................................... 200 9.4 두 가지 예측 모델을 이용한 업리프트 모델링 ................................................................. 203 9.5 AUUC로 업리프트 모델링 평가하기 ............................................................................ 207 9.6 실제 문제에 적용하기 ................................................................................................ 212 9.7 업리프트 모델링을 서비스에 적용하기 .......................................................................... 219 9.8 정리 ....................................................................................................................... 221 찾아보기 ........................................................................................................................

20

222


Part

I

머신러닝 실무 노하우

1부에서는 머신러닝 초심자를 위한 내용을 다룬다. 애초에는 머신러닝 입문서를 쓰려 했는데, 결국 이론을 어 느 정도 익힌 소프트웨어 엔지니어에게 적합한 실무서가 되었다. 이 책은 다른 책에서 주로 다루는 머신러닝 이론과 알고리즘 대신, 머신러닝 프로젝트를 처음 시작하는 방법 과 시스템 구성 방법, 학습 데이터 수집 방법처럼 실무에 유용한 내용을 중점적으로 다룬다. 수식은 최소화했으나, 머신러닝 핵심 개념인 분류, 신경망, SVM, K-최근접 이웃 알고리즘 등을 집중해 다루 는 2장 내용은 머신러닝 입문자에게는 조금 어려울 수도 있다. 잘 이해되지 않을 때는 절 제목을 주욱 훑어본 다음, 각 장의 앞부분에 나오는 흐름도를 보면 도움이 될 것이다. 코세라의 머신러닝 강의1를 수강하거나 『밑바 닥부터 시작하는 딥러닝』(한빛미디어, 2017)과 같은 책을 참고하면 더 쉽게 이해할 수 있을 것이다. 이 책에서는 파이썬 머신러닝 라이브러리인 사이킷런scikit-learn2을 사용한다. 1 https://www.coursera.org/learn/machine-learning 2 http://scikit-learn.org/stable/

0장 들어가며

21


Part I

머신러닝 실무 노하우

1장

머신러닝 프로젝트 처음 시작하기

2장 머신러닝으로 할 수 있는 일 3장

학습 결과 평가하기

4장 기존 시스템에 머신러닝 통합하기 5장

학습 데이터 수집하기

6장

효과 검증하기

22

우아한 사이파이


CHAPTER

1

머신러닝 프로젝트 처음 시작하기

이번 장에서는 새 머신러닝 프로젝트를 시작하는 방법을 살펴본다. 머신러닝 프로젝트는 일반적인 시스템 개발과 달리 예측 성능을 측정하는 등의 작업에서 수없 이 시행착오를 거치며 재작업하는 비율이 높다. 그래서 중요한 부분을 확실히 짚어가며 진행해 야 한다. 먼저 머신러닝의 개요, 프로젝트 수행 과정, 머신러닝 특유의 문제, 성공적인 프로젝 트를 위한 팀 꾸리기 등을 소개하겠다.

1.1 머신러닝은 어떻게 동작하는가 먼저 머신러닝이 학습과 예측을 수행하는 원리를 간단히 살펴보자. 머신러닝은 과거의 경험(데이터)을 기반으로 새로운 데이터에 대한 예측을 내리는 데 주로 사 용된다. 예를 들어 지메일에서 제공하는 ‘스팸 메일 필터링’이나 아마존에서 제공하는 (같은 상 품을 구입한 고객이 구입한 다른) 상품 ‘추천 서비스’는 대규모 과거 데이터로 학습해 새로운 데이터에 대한 예측을 수행한다. 비즈니스에서는 아직 알지 못하는 새로운 데이터에 대한 예측에 지도 학습 supervised learning을 많이 사용한다. [그림 1-1]은 지도 학습의 대략적인 흐름이다. 간단하게 말하면 지도 학습은 이미 알고 있는 데이터에 어떤 알고리즘을 적용하여 입력 데이터와 출력 데이터 사이의 관계를 파

1장 머신러닝 프로젝트 처음 시작하기

23


악하고, 그 결과(모델)를 이용해 새로운 데이터에 대한 예측을 수행하는 방식이다. 입력 데이 터로는 이미지의 RGB 값, 날짜, 기온과 같은 수치를 ‘벡터화한 것’1을 예로 들 수 있으며, 출력 데이터로는 개, 고양이 등의 ‘유형’이나 강수량과 같은 ‘수치’를 들 수 있다. 모델이란 입력 데이터와 출력 데이터 사이의 드러나지 않은 관계를 수식이나 규칙을 이용하여 근사 한 것을 말한다. 학습된 모델은 학습에 사용된 ‘알고리즘’과 데이터로부터 얻은 ‘파라미터’로 구성된다.

그림 1-1 머신러닝(지도 학습)의 얼개 학습 데이터

출력 (정답) 모델 학습 단계 입력

예측 단계

입력

모델

출력 (예측 결과)

새로운 데이터

지도 학습은 다시 기존 데이터의 입력과 출력(정답)의 관계를 파악하는 학습 단계와 모델을 통 해 새로운 입력 데이터에 대한 예측을 수행하는 예측 단계로 이뤄진다. 모델, 다시 말해 입력과 출력의 관계를 나타내는 파라미터를 구함으로써 새로운 데이터에 대해서도 일정 수준의 예측 을 할 수 있게 된다. 이를테면 사람은 단순한 작업이라도 철야를 하게 되면 판단이 흔들릴 수 있지만, 학습이 완료된 머신러닝의 예측은 전혀 흔들리지 않는다. 따라서 많은 양의 데이터도 사람보다 안정적으로 처리할 수 있다. 이 외에도 입력 데이터만으로 데이터의 구조를 파악해 예측 모델을 만들어내는 비지도 학 습unsupervised learning, 바둑이나 장기 같은 게임에서 어떤 행동을 취해야 하는지에 대한 전략을 1 옮긴이_ 여러 가지 데이터를 한 배열에 넣은 모양을 뜻한다.

24

1부 머신러닝 실무 노하우


학습하는 강화 학습reinforcement learning 등이 있다(자세한 내용은 2장에서 소개하겠다).

1.2 머신러닝 프로젝트의 과정 실무 머신러닝 프로젝트 과정은 대체로 다음과 같다. 1 문제를 정의한다. 2 머신러닝을 사용하지 않는 방법은 없는지 검토한다. 3 시스템을 설계한다. 4 사용할 알고리즘을 선택한다. 5 특징과 정답 데이터, 로그를 설계한다. 6 데이터를 전처리한다. 7 학습을 수행하고 파라미터를 튜닝한다. 8 시스템에 통합한다.

이 과정을 크게 묶으면 ① 해결하려는 문제를 머신러닝으로 풀 수 있는 문제로 바꾸기(1과 2 ), ② 문제를 풀기 위한 도구 선택 및 전처리(3부터 6 ), ③ 모델 구축하기(7 ), ④ 기존 서비스에 통합하기(8 )로 볼 수 있다. 특히 ①~② 과정(문제 정의 및 전처리)이 중요하다. 데이터가 아 무리 많아도 적절히 전처리하지 않으면 성능이 나오지 않는다. 해결하려는 문제 자체가 사람도 하기 어려운 일이라면 머신러닝으로 해결하는 것 역시 어렵다. 머신러닝, 특히 ‘지도 학습’에서 는 ‘정답’이 무엇인지를 사람이 기계에게 알려주어야 하기 때문이다. 다시 말해 사람이 답을 낼 수 없는 문제라면 기계가 풀도록 할 수도 없다. 머신러닝으로 해결한 사례를 찾으면 먼저 다음 세 가지 사항을 중점적으로 살펴보길 바란다. 1 어떤 알고리즘을 사용했는가? 2 어떤 데이터를 특징으로 사용했는가? 3 머신러닝 부분을 어떻게 통합했는가?

이런 방법으로 통찰을 쌓아가다 보면, 점차 어떤 것이 가능하고 가능하지 않은지 판단할 수 있 게 될 것이다. 2번에서 언급한 특징에 대해서는 뒤에서 자세히 설명하겠다. 여기서는 입력 정 보라는 뜻으로 보면 된다.

1장 머신러닝 프로젝트 처음 시작하기

25


이런 통찰이 없다면 머신러닝으로 뭔가 대단한 일을 해보려는 상사가 등장했을 때, 무엇을 해 야 할지부터 머리를 쥐어짜내야 한다. 그럼 자연스럽게 프로젝트 실패 확률도 커진다. 여기서 중요한 것은 머신러닝으로 해결 가능한 것과 그렇지 않은 것을 구분하는 능력과 이를 실제로 구현하는 일(이 과정에는 매우 귀찮은 일이 포함된다)이다. ‘데이터 분석의 80%는 전처리’라 고 할 만큼, 형식이 흐트러진 CSV를 파싱하거나 웹 로그에서 필요한 정보를 추출하는 작업처 럼 데이터를 분석 가능한 상태로 만드는 시간이 큰 비중을 차지한다. 머신러닝 시스템 개발은 시행착오를 반복하는 과정이다. 특히, 앞서 언급한 과정 중 4~7번을 반복해서 시험해보고 수정한다고 보면 된다. 머신러닝 이론 연구는 4~7번 과정을 중심으로 다 루는 반면, 비즈니스에서는 1~8번 전 과정을 다룬다. 그렇기 때문에 이 시행착오를 효율적으 로 하는 것이 무엇보다 중요하다. 그럼 각 과정의 절차를 순서대로 설명해보겠다.

1.2.1 문제 정의하기 일반적인 문제를 해결할 때와 마찬가지로, 먼저 문제 자체를 규정해야 한다. 이때 목적을 명 확히 정의하는 게 중요하며, 해결하려는 문제에 대한 가설을 세우고 무엇을 해야 할지도 명확 하게 해야 한다. 애초에 ‘매상 개선’, ‘유료회원 증가’, ‘생산비용 절감’ 같은 비즈니스 목적이 있 어 머신러닝 시스템을 만들기 마련이다. 예를 들어 ‘생산비용 절감’이 목적이라면 ‘수율을 개선’ 해야 한다. 수율을 개선하려면 ‘머신러닝을 이용해 불량이 발생하는 원인(지점)을 찾는다’처럼 구체적이고 실천할 수 있는 수준까지 쪼개어 가도록 한다. 이렇게 구체적으로 분해해가는 과정에서 매출목표나 일일 유료회원 증가수 같은 소위 KPIkey performance indicator

(핵심성과지표)가 정해지게 마련이다. 이는 예측 모델의 성능과는 다른 축에서

중요한 목표가 된다. KPI 자체는 사업의 단계에 따라 바뀔 수도 있지만, 처음 구체화해나갈 때 임시로라도 한 가지를 정해놓으면 좋다. 그리고 KPI를 어떻게 정하는지 그리고 목적과 과제를 어떻게 설정해야 하는지에 대해서는 『린 스타트업』(한빛미디어, 2012 )이나 『린 분석』(한빛미 디어, 2014 ) 같은 책을 참조하는 것이 좋다. 머신러닝을 위한 문제 설정에는 예를 들어 ‘사용자마다 추천 상품을 제시해 온라인 쇼핑몰 매출 을 늘린다’든가, ‘소비전력을 예측해 공장 전력소비 최적화에 활용한다’와 같이 프로젝트의 목적

26

1부 머신러닝 실무 노하우


과 해법을 함께 고려한다. ‘유료회원을 늘리고 싶다’처럼 무엇을 해야 하는지가 명확하지 않은 목표나 ‘딥러닝으로 뭔가 대단한 일을 하자’처럼 구체적이지 못한 목표는 좋지 않은 문제 설정의 예다. 경영진이 이런 요구를 하더라도 적어도 현장에서는 더 구체화시켜야 한다. 가설을 세우고 검증하는 방법은 쿡패드 개발자 블로그의 「가설 검증과 샘플 크기의 기초」2라는 글이 유용하다.

1.2.2 머신러닝을 사용하지 않는 방법 검토하기 그다음에는 머신러닝을 정말 꼭 사용해야 하는지를 검토한다. 머신러닝 프로젝트를 시작하는 방법에 머신러닝을 사용하지 않는 방법을 검토해야 한다니 이상한 주장 같지만, “머신러닝은 기술부채 중 이자율이 매우 높은 신용카드다”라고 주장한 논문3이 있을 만큼, 머신러닝 시스템 은 다른 시스템에 비해 기술부채가 쉽게 누적된다.4 머신러닝을 사용하는 시스템을 구축할 때는 다음과 같은 어려움을 겪을 수 있다. 1 확률적인 부분이 있어 자동 테스트가 어렵다. 2 오래 운용하면 사용자 경향이 변해 입력 경향도 바뀐다. 3 처리 파이프라인이 복잡해진다. 4 데이터 의존관계가 복잡해진다. 5 실험 코드 혹은 파라미터가 포함되기 쉽다. 6 개발 시스템과 운영 시스템 간의 언어/프레임워크가 제각각이기 쉽다.

이같은 어려움에 대처하는 방법은 ‘1.3 운영 시스템에서 발생하는 머신러닝 문제 대처 방법’ 에서 설명한다. 특히 입력 경향이 변하면 심각한 문제가 된다. 예를 들어 텍스트를 읽어 긍정/ 부정에 대한 감성 분석sentiment analysis을 한다고 가정해보자. ‘옥동자’라는 단어는 이전에는 긍정 적으로 쓰였지만 최근에는 (외모에 대한) 부정적인 의미로 바뀌었다. 이 외에도 과거에 ‘자바’ 는 특정 지역의 지명이었는데 이제는 프로그래밍 언어로 인식한다. 신조어가 용법의 경향을

2 http://techlife.cookpad.com/entry/2016/09/26/111601 3 Sculley, D., Todd Phillips, Dietmar Ebner, Vinay Chaudhary, and Michael Young Machine learning: The high-interest credit card of technical debt 2014. 4 기술부채란 출시를 서두르기 위해 미처 해결하지 않고 남겨둔 문제를 말한다. 문서화나 테스트 코드 미작성, 어설픈 설계, 컴파일러 경고 등이 여기 해당한다. https://en.wikipedia.org/wiki/Technical_debt

1장 머신러닝 프로젝트 처음 시작하기

27


바꾼 것이다. 예측 모델을 오래 사용하면 입력 데이터의 경향이 변화해 예측 정확도가 낮아져서 의도하지 않 게 행동할 가능성이 있다. 이를 방지하려면 정기적으로 새로운 데이터로 모델을 갱신하거나, 필요에 따라 특징을 재검토해야 한다. 즉 모델 역시 유지보수가 필요하다. 또, 많은 머신러닝 알고리즘이 난수를 사용해 확률적으로 처리하는 코드를 포함하므로 규칙 기 반으로 처리할 때처럼 시스템의 행동이 결정론적으로 정해지지 않는다. 더욱이 다양한 데이터 에 대한 반응 모두를 미리 확인하기는 불가능하다. 애초에 머신러닝은 사람이 모두 확인할 수 없는 대량의 데이터를 처리하는 데 사용되므로 생각하지 못한 예측 결과를 출력할 위험은 항상 존재한다. 예전에 구글 포토에서 아프리카계 사람을 고릴라로 인식하여 인종차별 문제로 비화 된 적이 있다.5 당시 문제는 ‘고릴라’라는 태그를 제거해 해결됐지만, 이처럼 생각하지 못한 문 제가 나타날 가능성은 항상 있다. 그러니 의도하지 않은 예측 결과가 나왔을 때 (특정 레이블 을 블랙리스트에 등록해 제거하는 등) 사후에 개입할 수 있는 준비를 해두어야 한다. 그럼 어떤 비즈니스 문제에 머신러닝을 적용하면 좋을까? 필자는 다음 조건을 만족해야 한다 고 본다. ●●

대량의 데이터에 대해 고속으로 안정된 판단을 내려야 한다.

●●

예측 결과에 일정 수준의 오류가 용인된다.

사람은 피로도에 따라 판단이 흔들릴 수 있지만, 머신러닝의 예측은 대량의 데이터를 항상 같 은 기준으로 처리할 수 있다. 반면, 예측 결과가 100% 정확할 수는 없으므로 운영 쪽에서 이 오류에 대응할 수 있는 구조를 반드시 갖춰야 한다. 이상의 조건을 갖췄다면 우선 MVPminumum viable product (최소 기능 제품)를 만들어본다. MVP란 ‘린 스타트업’에서 많이 다루는 주제로서 고객가치를 창출할 수 있는 최소한의 제품을 의미한 다. 그렇다면 머신러닝에서 MVP란 무엇일까? 예를 들어 성별이나 나이 등 사용자의 속성에 기초해 사용자 세그먼트를 분할하고, 세그먼트마다 규칙에 기초해 추천한다고 해보자. 솔라 나 일래스틱서치ElasticSearch 등 기존 모듈에도 존재하는 ‘More Like This’ 같은 기능을

Apache Solr

조합해도 되지 않을까? 이처럼 통계 처리나 기존 모듈의 기능만으로 간단히 구현할 수 있는 것 을 MVP로 삼을 수 있다. 물론, MVP 원칙을 따른다면 사람이 직접 제대로 된 콘텐츠를 만들

5 http://bit.ly/2JhZfhw

28

1부 머신러닝 실무 노하우


고, 이를 간단한 규칙으로 적당히 나누는 정도로도 충분할 수 있다. 필자 역시 MVP만으로도 충분한 상황을 왕왕 경험했다. 처음 세운 가설이 맞는지를 판단하여 MVP를 검증해볼 수 있다. 머신러닝은 문제 설정에서 가 설 검증에 이르는 주기가 일반적인 시스템의 개발 주기보다 긴 편이다. 애초의 목표 자체가 틀 렸다면 시스템 구축과 테스트까지 마치고도 다시 문제 설정으로 돌아가야 하는 경우도 생긴다. 그러므로 고객에게 정말 필요한 게 무엇인지, 개념은 정확히 설정했는지를 미리 검증해두는 일 이 머신러닝을 사용하는 제품이 그렇지 않는 제품에서보다 중요하다. 처음부터 머신러닝을 적용하자고 마음먹고 시작한 프로젝트라도 머신러닝을 사용하지 않는 방 향으로 전환하는 것을 두려워해서는 안 된다. 이렇듯 머신러닝에 적합한 과제인지를 확인하고 MVP를 만들어 개념을 검증한 다음 시스템 설 계를 진행한다.

1.2.3 시스템 설계하기 문제 정의와 MVP 검증이 끝났다면 머신러닝 시스템을 설계해야 한다. 설계에서 중요한 핵심 은 다음 두 가지다. 1 예측 결과를 어떻게 이용할 것인가? 2 예측 오류의 영향을 어떻게 흡수할 것인가?

첫째, 예측 결과를 어디에 이용할지를 먼저 살펴보자. 예측 처리를 배치로 수행한 다음 그 결과 를 RDB (관계형 데이터베이스)에 배포하는 방법과, 웹서비스나 애플리케이션에서 사용자 액 션마다 비동기적으로 예측하는 방법 등 구체적으로 차이를 둘 수 있다. 예측 결과를 전달하는 방법은 4장을 참조하기 바란다. 머신러닝에서 100% 정확한 알고리즘은 없다. 따라서 이 오류에 시스템이 어떻게 대처할지를 정하는 일 역시 머신러닝 시스템을 설계할 때 고려해야 한다. 이 점을 명확히 인지하고, 시스템 전체에서 위험 요소를 어떻게 통제할지를 결정해야 한다. 예를 들면 예측 결과를 사람이 직접 확인하는 단계를 두거나, 잘못된 예측이 큰 악영향을 줄 수 없는 경우에만 애플리케이션에 적 용하는 방법을 생각해볼 수 있다.

1장 머신러닝 프로젝트 처음 시작하기

29


이 단계를 지나면 실제 작업(데이터 수집, 모델 작성, 시스템 구축)으로 들어가므로 이 시점에 서 목표 성능과 포기 지점을 설정한다. 머신러닝 모델을 개발할 때 ‘조금만 더’라는 생각에 예측 모델을 끝없이 개선하는 늪에 빠지곤 한다. 그리고 학습 데이터를 수집하고 정답 데이터를 작성 하는 과정에서 일정 수준의 도메인 지식을 얻게 되어, 근거없는 자신감으로 더 개선할 수 있다 고 믿어버리기도 쉽다. 그러나 현실은 문제 설정 단계까지 되돌아가 반복하며 개선해야 하는 경 우가 많다. 이런 매몰비용에 사로잡히기 전에 ‘2개월 안에 90% 예측 성능 달성’ 같은 구체적인 목표 성능과 포기 지점을 정해두어야 한다. 예측 성능을 결정하는 방법은 3장에서 설명한다. 그림 1-2 스캐터플롯 매트릭스의 예

30

1부 머신러닝 실무 노하우


1.2.4 알고리즘 선택하기 머신러닝 알고리즘을 선택하는 방법을 알아보자(2장도 함께 참고하기 바란다). 과거에 비슷한 문제를 어떻게 풀었는지 조사해보면 대강의 후보를 정할 수 있다. 데이터의 특 성을 모른다면 군집화clustering 같은 비지도 학습(2장에서 설명한다)이나 스캐터플롯 매트릭스 (그림 1-2 )로 시각화해보고 어떤 방법으로 문제를 풀지 생각해본다. 또, 데이터양을 예상해보고 온라인 학습online learning과 배치 학습batch learning (4.2.1절 참조) 중 어 느 쪽이 적합한지 가늠해본다.

1.2.5 특징, 정답 데이터, 로그 설계하기 알고리즘 후보를 골랐다면 어떤 정보를 사용할지도 설계해야 한다. 특징feature은 머신러닝의 예측 모델에 입력될 정보다. 머신러닝에서는 입력 정보를 수치 벡터

로 만들어야 한다. 예를 들어 내일 눈이 올지를 예측하는 데 오늘의 기온(섭씨 1.0도), 강수량 (0.8mm ), 풍속(0m/s ), 적설량(2cm ), 날씨(흐림) 정보를 사용한다면, 이들 값을 각각 수 치화한 리스트인 [1.0, 0.8, 0.0, 2.0, 1]이 입력 벡터가 된다. 이때 ‘흐림’ 같은 특징을 범주형 변수categorical variable라고 하는데 ‘맑음’은 0, ‘흐림’은 1처럼 수치 데 이터로 변환하여 처리한다. 이렇게 수치로 변환한 데이터를 더미 변수dummy variable6라고 한다. 사 이킷런의 LabelEncoder 클래스나 OneHotEncoder 클래스를 사용하면 범주형 변수를 더미 변수로 변환할 수 있다. 고전 머신러닝에서는 어떤 특징을 선택하는지가 핵심이었다.7 여기서는 사용자 액션 로그, 구 매이력, 공장의 센서 데이터 등 머신러닝에 입력될 특징이 예측에 필요한 정보를 포함하는지를 도메인 전문가에게 미리 확인한다. 예를 들면 과거 경험을 기반으로 망치로 두들겨 나는 소리 정보를 수집하여 터빈의 고장 여부를 검출한 사례도 있다. 도메인 전문가의 협조를 얻어 이 정 보 중 관심 대상이 되는 현상에 영향을 줄 만한 것이 무엇인지 확인한다. 나중 단계에서 불필요 한 정보를 제거할 수는 있지만, 필요한 정보를 나중에 얻는 것은 불가능하다. 6 옮긴이_ 머신러닝에서 범주형(categorical)의 상대 개념은 수치형(numeric)이지만, 원래부터 수치형인 것과 범주형을 편의상 수치 데 이터로 바꾼 것을 명확히 구분하기 위해 더미라 부른다. 7 딥러닝에서는 특징보다는 신경망의 구조를 어떻게 설계하는지가 더 중요하다.

1장 머신러닝 프로젝트 처음 시작하기

31


특징을 정한 다음에는 입력 데이터로 쓸 정답 데이터를 준비한다. 정답 데이터는 여러 범주 중 하나를 예측하는 지도 학습에서 필요한 정답 범주 레이블(정답 레이블)과 그 정답의 입력 데 이터의 쌍을 말한다. 예를 들어 물체 인식object detection이라면 ‘자동차’나 ‘개’와 같은 정답 범주(정 답 레이블)를 해당 이미지에 미리 달아놔야 한다. 범주를 머신러닝에서는 클래스class라고 하는 데, 프로그래밍 언어에서 말하는 클래스와는 의미가 다르므로 주의가 필요하다. 비즈니스에서 는 지도 학습을 이용하여 무언가를 분류하는 사례가 많다. 지도 학습에서는 품질이 높은 정답 레이블을 얼마나 확보하느냐가 중요하다. 정답 레이블의 품 질이 문제 해결력을 좌지우지할 수도 있다. 정답 데이터의 레이블을 수집하는 방법은 5장을 참 고하기 바란다. 또, 웹 애플리케이션의 로그로부터 정답 데이터를 만들기도 한다. 특징 추출에 적합한 로그 설 계 방법은 ‘4.3 로그 설계’에서 자세히 다룬다. 로그를 설계할 때 생각나는 특징을 모두 포함시 켜야 한다. 로그 수집은 한 번 시작하면 바꾸기 어려우며, 바꾼다 하더라도 그 전 데이터는 쓸 모없어지기 때문이다.

1.2.6 데이터 전처리 데이터 전처리 방법은 해결하려는 문제에 따라 많이 달라지므로 여기서는 자세히 다루지 않는 다. 전처리는 불필요한 정보를 발라내고, 데이터를 머신러닝에 사용할 수 있는 형태로 바꾸는 과정이 주다. 앞서 특징에서도 설명했지만, 머신러닝에 입력되는 데이터는 관계형 데이터베이 스로 나타낼 수 있는 표 형식을 취한다. 그러나 실제 웹 로그 같은 날것 상태의 데이터는 텍스 트 형식 등을 취하고 있어 곧바로 사용할 수 없다. 수치 데이터 역시 누락값이나 정상 범위를 벗어난 이상값을 처리하고, 값의 변동폭으로 인한 영향을 줄이는 정규화 등의 작업을 거쳐야 한다. 텍스트 데이터는 단어별 빈도를 세거나, 빈도가 낮은 단어를 제거한다. 앞서 설명한 범주 형 변수를 더미 변수로 변환하는 작업도 여기에 포함되며, 전처리 중 첫 번째로 처리하는 중요 한 단계다. 아무리 뛰어난 알고리즘을 사용해도 적절히 정제 혹은 가공하지 않은 데이터로는 원하는 결과 를 얻을 수 없다. 실세계의 문제를 해결하는 경우라면 이 과정에 많은 시간이 소요된다.

32

1부 머신러닝 실무 노하우


1.2.7 학습 및 파라미터 튜닝 드디어 실제로 학습을 수행하는 단계다. 학습 알고리즘은 앞 단계에서 정했으니, 머신러닝 알 고리즘을 조정하는 파라미터를 시행착오를 거쳐가며 수정해보고 결과가 더 나은 값을 찾는다. 우선 사람이 직접 부여한 정답이나 규칙 기반으로 예측한 성능을 기준치로 하여 이를 뛰어넘는 것을 목표로 삼는다. 첫 단계로 로지스틱 회귀 같은 비교적 간단한 알고리즘과 기존 라이브러리 및 프레임워크를 사 용하여 간단한 예측 모델을 만들어본다. 대부분의 경우 일부 데이터가 누락되는 등 데이터 자 체에 버그가 잠재되어 있을 수 있다. 이 때문에 문제를 쪼개어 우선 간단한 방법으로 예측 모델 을 만들어보는 것이다. 첫 번째 예측 모델에서 바로 (99.9% 같이) 아주 높은 성능이 나온다면 어딘가 실수가 있었는 지를 의심해봐야 한다(작성한 코드가 단 한 번에 모든 테스트를 통과했을 때 비슷한 기분이 들 것이다). 이런 경우 대부분은 훈련 데이터에서만 성능이 좋고 처음 보는 데이터는 잘 예측하지 못하는 과적합이나, 훈련 데이터에 테스트 데이터가 일부 섞이면서 발생하는 데이터 유출이 생 긴 것이다.

과적합과 데이터 유출 과적합overfitting된 모델이란 간단하게 말하면 훈련 데이터에 대한 예측 성능은 높지만, 처음 보는

데이터에 대한 예측은 훨씬 뒤쳐지는 모델이다. 즉, 이미 본 데이터에만 지나치게 최적화되어 처 음 보는 데이터를 제대로 예측하지 못하는 상태다. 예전에 필자가 센터 시험8을 치던 해에 영어 과목의 출제 경향이 갑자기 크게 바뀌었다. 입시 학원에서 쪽집게 수업을 듣던 친구가 “올해는 경향이 바뀌는 바람에 시험을 망쳤어. 다른 사람들도 어려웠을거야”라고 말하고 다녔는데, 지금 생각해보면 이것도 일종의 과적합이었을지도 모르겠다. 반대로, 처음 보는 데이터를 잘 처리하 는 모델은 ‘일반화 generalization 성능이 높다’고 한다. 데이터 유출 data leakage에 대한 예도 살펴보자. 데이터 과학자 커뮤니티 캐글Kaggle에서 진행한 <암 예

측 콘테스트>에서 제공한 데이터에 전립선 수술을 받았는지가 표시된 필드가 포함된 적이 있었 다. 이 정보를 사용한 예측 모델은 성능이 매우 좋았지만, 이 정보 자체가 ‘전립선암을 앓는 환자

8 옮긴이_ 우리의 수학능력시험에 해당한다.

1장 머신러닝 프로젝트 처음 시작하기

33


가 암을 진단받은 후 수술을 받았다’는 뜻이므로 암 진단을 새로이 예측하는 데는 의미 없는 모델 이 되어버렸다. 시계열 데이터 예측에서 테스트 데이터와 검증 데이터를 무작위로 분할하는 바 람에 학습 데이터에 테스트 데이터가 포함되는 사례는 종종 발생한다.

이러한 점을 주의하면서 학습 및 파라미터 튜닝을 진행한다. 성능을 개선할 때는 오답을 낸 예 측 결과를 실제로 살펴보며 원인이 무엇인지, 이들 사이의 공통점은 없는지 오류 원인을 분석 해야 한다. 이 단계에서 원하는 결과를 얻지 못했다면 단계 4로 돌아가 알고리즘 검토부터 다 시 진행한다.

과적합 방지하기 다음은 어떤 알고리즘에든 적용할 수 있는 과적합 방지 방법이다. 1 교차검증으로 파라미터를 튜닝한다. 2 규제화를 적용한다. 3 학습곡선을 살핀다. 교차검증cross validation이란 학습용 훈련 데이터training data와 모델 검증용 검증 데이터validation data를 분할하

여 특정 데이터에 의존성이 낮은, 즉 일반화 성능이 좋은 모델을 학습시키는 방법이다. 예를 들 어 데이터를 10개 그룹으로 나눠 그중 9개를 훈련 데이터로 삼아 모델을 학습한 다음, 남은 하나 를 검증 데이터로 사용하여 성능을 측정한다. 이런 과정을 검증 데이터용 그룹을 바꿔가며 10번 반복하면서 평균 성능이 높은 하이퍼파라미터hyper-parameter를 선택한다.9 하이퍼파라미터란 신경망 의 은닉층 개수나 로지스틱 회귀의 문턱값처럼 모델의 성능을 좌우하는 파라미터를 말한다. 실제 절차에서는 먼저 한 그룹 정도의 데이터를 미리 빼서 마지막 성능 평가에만 사용하여, 하이 퍼파라미터 튜닝과 독립적으로 성능을 평가한다. 이때 미리 빼둔 데이터를 테스트 데이터test data라 고 한다. 그리고 이 책에서는 훈련 데이터와 검증 데이터를 합하여 개발 데이터development data라고 부르겠다.

9 사이킷런은 간단히 교차검증을 할 수 있게 해주는 cross_val_score () 함수와 GridSearchCV 클래스를 제공한다.

34

1부 머신러닝 실무 노하우


전체 데이터

개발 데이터

훈련 데이터

테스트 데이터

검증 데이터

과적합을 방지하고 일반화 성능을 향상시키는 기법으로 규제화regularization가 사용되기도 한다. 간 단히 말하면 규제화는 모든 데이터를 정확하게 분류하는 대신, 약간 잘못 분류하는 데이터가 생 기더라도 새로운 데이터를 더 적절히 처리하는 방법이다. 자세한 내용은 ‘2.2.2 로지스틱 회귀’에 서 설명하겠다. 학습곡선learning curve은 데이터 규모나 학습 반복 횟수에 따른 훈련 데이터와 검증 데이터의 손실값

(또는 예측 정확도)의 추이를 그래프로 그린 것을 말한다. 손실값에 대해서는 2장을, 학습곡선에 대해서는 필자가 쓴 「과적합 상태인지, 학습이 덜 된 상태인지 궁금하다면」10을 참조하기 바란다.

1.2.8 시스템에 통합하기 축하한다. 지금까지 잘 진행했다면 성능 좋은 모델을 얻었을 것이다. 이제 머신러닝 기능을 기 존 시스템에 통합하는 일이 남았다. 이때 주의할 점은 예측 성능과 그에 따른 비즈니스 성과(예를 들면 상품 구매로 이어지는 비 율)를 모니터링하는 것이다. 시스템 통합은 비즈니스 관점에서 보면 가설 검증을 위한 단계에 지나지 않는다. 예측 성능 모니터링에는 미리 사람이 작성한 데이터와 정답 레이블의 쌍으로 이뤄진 데이터셋을 이용하여 성능을 측정한다. 이런 데이터셋을 황금기준gold standard(혹은 황금표준)이라고 한다.

10 http://bit.ly/2JkHjTr

1장 머신러닝 프로젝트 처음 시작하기

35


예측 모델 개발에 주력하다 보면 본래 목표를 잊기 쉽다. 본래 목표는 예측 모델을 만들어서 매 출이나 유료회원 증가 같은 비즈니스 지표를, 다시 말해 KPI를 개선하는 것이다. 그러니 이 지 표들의 추이를 지켜보면서 필요에 따라 성능을 개선해가도록 한다. ‘1.2.2 머신러닝을 사용하지 않는 방법 검토하기’에서도 밝혔듯, 머신러닝 시스템을 오래 운영 하다 보면 입력의 경향이 바뀔 수 있다. 이로 인해 예측 성능이 서서히 혹은 급격히 저하되는 일이 흔하다. KPI가 악화되면 과정 5부터 7까지를 반복하며 이를 개선해야 한다. 입력의 경향 변화에 잘 대처하려면 ‘시스템 통합이 완료되면 끝’이라 생각하지 말고 지속해서 비즈니스에 기 여할 수 있도록 꾸준히 개선해야 한다.

1.3 운영 시스템에서 발생하는 머신러닝 문제 대처 방법 ‘1.2.2 머신러닝을 사용하지 않는 방법 검토하기’에서도 밝혔듯 머신러닝을 적용한 운영 시스 템에는 다음의 문제가 발생할 수 있다. A 확률적인 부분이 있어서 자동 테스트가 어렵다. B 오래 운용하면 사용자 경향이 변해 입력 경향도 바뀐다. C 처리 파이프라인이 복잡해진다. D 데이터 의존관계가 복잡해진다. E 실험 코드 혹은 파라미터가 포함되기 쉽다. F 개발 시스템과 운영 시스템 간의 언어/프레임워크가 제각각이기 쉽다.

정리하자면 예측 성능만을 추구하며 모델을 갱신하기가 어렵게 되며, 시스템이 계속 복잡해져 유지보수하거나 변화에 대응하기 어렵게 된다고 할 수 있다. 이런 문제에 잘 대처하려면 다음 과 같은 점을 중시하며 처음부터 변화를 전제로 설계해야 한다. 1 사람이 직접 작성한 황금기준을 사용하여 예측 성능을 모니터링한다(A, B, D ). 2 예측 모델을 모듈화하여 알고리즘에 대한 A/B 테스트를 실시한다(B ). 3 모델을 버전관리하여 언제든 원하는 시점으로 돌아갈 수 있도록 한다(D, E ). 4 데이터 처리 파이프라인 자체를 저장한다(C, E ). 5 개발 시스템과 운영 시스템 간의 언어/프레임워크를 일치시킨다(F ).

36

1부 머신러닝 실무 노하우


지금부터 이 다섯 가지 사항에 대해 설명하겠다.

1.3.1 사람이 작성한 황금기준을 사용하여 예측 성능 모니터링 황금기준을 확보하는 방법은 ‘1.2.8 시스템에 통합하기’에서 설명했으니 참고하기 바란다. 머 신러닝의 처리 과정에는 확률적인 부분이 있어 그 예측 결과를 자동 테스트로 검증하기가 어렵 다. 그러므로 미리 확보한 데이터와 그 정답을 이용해 예측 성능을 측정하고 이 성능의 추이를 모니터링한다. 이런 방법을 통해 자동 테스트가 어렵다는 단점을 보완할 수 있다. 또, 예측 성 능에 문턱값 알림을 설정해두면 장기 운영 시의 입력 경향 변화를 쉽게 알아챌 수 있다. 네 번 째 항목인 데이터의 의존관계는, 예를 들어 예측 모델과 단어 분절용 사전을 동시에 갱신했는 데 운영 환경에서는 예측 모델만 반영한 경우를 가정해볼 수 있다. 이러한 문제 역시 예측 성능 을 모니터링하여 보완할 수 있다.

1.3.2 예측 모델을 모듈화하여 알고리즘에 대한 A/B 테스트 수행 예측 모델을 모듈화하는 방법은 다음과 같다. 예측 성능을 개선하는 작업을 이어가다 보면 하 나의 알고리즘만으로는 금세 한계에 봉착한다. 이럴 때를 위해 예측 모델을 모듈화해두면 여러 모델을 병렬로 두고 바꿔가며 A/B 테스트를 할 수 있다. 모듈화를 통해 여러 모델을 쉽게 비교 할 수 있는 시스템을 만들어두면 특징이나 알고리즘을 변경한 모델을 동시에 운영하면서 비교 할 수 있다. 또한, 입력 경향 변화에 대해서도 현행 모델을 가동하면서 새로운 모델을 투입하기 가 쉬워진다.

1.3.3 모델 버전관리를 통한 자유로운 롤백 머신러닝 시스템을 장기간 운영하다 보면 언제 어떤 원인으로 예측 성능이 떨어질지 예상하기 어렵다. 입력 데이터의 형식이 바뀌었을 수도 있고 처리 과정에 무언가 차이가 발생했을 수도 있다. 이중 모델 갱신이 원인일 가능성을 배제하기 위해서라도 이전 버전 모델로 롤백할 수 있 도록 해야 한다. 소스 코드는 당연히 버전관리를 하겠지만, 가능하다면 과거 모델로 롤백했을 때와 확실히 비교할 수 있도록 데이터 역시 버전관리하는 편이 바람직하다. 소스 코드, 모델, 데이터 모두를 버전관리하는 것이 가장 이상적이다.

1장 머신러닝 프로젝트 처음 시작하기

37


모델 버전관리와 함께 어떤 데이터로 모델을 생성했는지를 문서화해두면 데이터 의존관계도 관리하기 쉬워진다. 그리고 실험 코드나 알고리즘 파라미터가 코드 이곳 저곳에 흩어져 있는 문제도 모델의 버전관리를 통해 정리될 것이다.

1.3.4 데이터 처리 파이프라인 저장 이번에는 데이터 처리 파이프라인을 저장하는 방법을 알아보자(그림 1-3 ). 예측 모델을 생성할 때 예측 모델 자체의 하이퍼파라미터도 튜닝하지만, 그 앞의 전처리 과정 에도 파라미터가 있는 경우가 많다. 예를 들어 텍스트 처리에서 단어를 분절하고 단어가 출현 하는 빈도를 세어 빈도가 낮거나 높은 단어를 제거하는 경우가 있다. 이때 빈도의 많고 적음을 정의하는 문턱값도 튜닝의 대상이 된다. 파라미터 수가 많아지고 데이터가 복잡해지면 개발 시스템과 운영 시스템의 파라미터가 제각 각이 되어 기대한 성능이 나오지 않는 일이 벌어진다. 이런 일을 방지하기 위해서도 전처리와 예측 모델 구축을 포함하여 데이터 처리 파이프라인 전체를 저장해둬야 한다. 사이킷런의 처리는 잘 추상화되어 있어서 데이터 처리를 파이프라인으로 만들기 유리하다. 이 에 영향을 받은 스파크Spark 등의 머신러닝 라이브러리 역시 파이프라인을 통해 처리 과정을 재 사용할 수 있도록 되어 있다. 그림 1-3 데이터 처리 파이프라인 저장하기

특징 추출

학습 단계

이미 본 데이터

단어 분절

단어 빈도 측정

학습 데이터

예측 모델 로지스틱 회귀

예측 데이터

예측 모델 예측 단계

새로운 데이터

단어 분절

단어 빈도 측정

로지스틱 회귀

최적의 파라미터와 함께 저장해두면 재사용할 수 있다.

38

1부 머신러닝 실무 노하우

예측 데이터


파이프라인 전체를 저장하면 해당 코드 역시 정리되므로 세 번째 문제인 처리 파이프라인이 복 잡해진 경우에도 파악하기 쉬워진다. 또, 실험 코드나 알고리즘 파라미터도 한 곳에서 관리할 수 있게 되는 효과가 있다.

1.3.5 개발 시스템과 운영 시스템의 언어 및 프레임워크 일치 마지막으로, 개발 시스템과 운영 시스템의 언어와 프레임워크를 일치시키는 방법을 알아보자. 예측 모델은 R로 개발하고, 애플리케이션에서는 자바로 재구현한 상황을 가정해보자. 이런 경 우 두 가지 언어로 모두 구현해야 하므로 알고리즘 변경 비용이 크게 상승한다. 모처럼 R로 빠 르게 프로토타입을 작성했는데 운영에 반영하는 데 시간이 걸린다거나, 상황에 따라서는 반영 자체가 안 되기도 한다. 예측 모델을 개발하려면 실험을 여러 번 반복해야 하는 경우가 많으며, 코드 역시 정돈되지 않 은 경우가 많다. 실험에 쓰인 코드로부터 운영 환경에 배포될 코드로 진행하는 일 역시 똑같은 프레임워크를 사용한다면 마이그레이션과 커뮤니케이션 비용을 줄일 수 있을 것이다. 또한 시 스템의 복잡성을 낮추는 장점도 누릴 수 있다. 다만, 최근에는 마이크로서비스11라고 해서 시스템을 구성하는 각 기능이나 서비스가 서로 API 나 메시지 큐를 이용해 통신하는 구조를 택하는 사례가 늘고 있다. 한 덩어리로 된 커다란 애 플리케이션을 작성하는 모놀리식 설계와 비교할 때, 마이크로서비스는 시스템을 잘게 분할한 다는 점에서 머신러닝 부분을 따로 다루기 편리하다. 이런 설계 사상에 따라 머신러닝을 위한

REST 혹은 gRPC API 서버를 두는 경우도 늘고 있다. 도커Docker 같은 컨테이너 기술과 이를 배포하기 유리한 클라우드 서비스가 등장하면서 머신러닝에서 학습과 예측 기능을 별도의 API 서버로 구축하기도 쉬워졌다. 특히, 구현 언어 선택은 개발팀의 스킬셋에도 영향을 주므로 전 체 시스템의 설계와 개발팀 구성원의 스킬셋을 고려하여 판단해야 한다. 이렇듯 운영 시스템에 적용할 머신러닝 제품은 여러 변화에 대응할 수 있는 준비를 갖춰야 한 다. 이와 관련한 우수 실무 사례가 궁금하다면 「Rules of Machine Learning: Best Pratices

for ML Engineering」12을 참고하기 바란다.

11 마틴 파울러, https://martinfowler.com/articles/microservices.html 12 http://bit.ly/2q8q0x2

1장 머신러닝 프로젝트 처음 시작하기

39


사이킷런이 머신러닝에서 사실상 표준으로 쓰이는 이유 사이킷런은 딥러닝이 부상하기 전의 머신러닝에서는 사실상 표준이라고 볼 수 있다. 그 첫 번째 이유는 일관된 API다(학습 함수는 fit ( )으로, 예측 함수는 predict ( )로 통일). 일관된 API 덕분 에 사이킷런에는 교차검증을 위한 cross_val_score ( ) 같은 보조 함수나 클래스를 다양한 알고 리즘에 적용할 수 있다. 또한, 여러 알고리즘을 갈아 끼우기도 쉽다. 다른 라이브러리는 하나 혹은 단 몇 개의 제한된 알 고리즘만 구현하고 있어서 알고리즘들의 성능을 비교하는 비용이 큰 경우가 많다. 그러나 사이 킷런은 깔끔하게 추상화된 API 덕에 전처리에 쓰일 문턱값 목록만 만들면 파라미터를 탐색할 수 있고, 학습 알고리즘 목록만 만들면 파라미터와 알고리즘을 간단하게 탐색할 수 있다. 전처리와 알고리즘을 파이프라인으로 만들어 그중 성능이 가장 좋은 조합을 찾아 저장해둘 수도 있다. 예측을 수행할 때 저장해둔 파이프라인 설정을 재사용하는 것도 간단하다. 이러한 기능을 일률적으로 다룰 수 있다는 장점 덕분에 스파크 같은 다른 라이브러리도 비슷한 설계를 채택하는 사례가 늘고 있다.

1.4 머신러닝 시스템을 성공적으로 운영하려면 머신러닝을 적용한 시스템을 만드는 데는 어느 정도 도박적인 요소가 있다. 일반적인 시스템은 설계만 적절히 이뤄진다면 어떻게든 동작은 할 것이다(물론 그저 동작하는 것만으로는 의미가 없으며, 사용자에게 가치를 전달하기에 이르는 것은 쉽지 않다). 그러나 머신러닝 시스템은 최 악의 경우 수 주 혹은 수 개월 후에도 의미 있는 결과물이 나오지 않을 수 있다. 기껏 만든 분류 모델이 무작위 출력보다 성능이 떨어지는 일도 흔하다. 머신러닝 시스템을 개 발할 때는 일반적인 웹 서비스처럼 개발주기를 한두 주 정도로 짧게 잡기가 어려우며, 이 주기 가 수 개월에 이르는 경우도 드물지 않다. 그럼 머신러닝 제품을 사업적으로 성공시키려면 어떤 사람이 중요할까? 필자는 다음의 4가지 역할이 중요하다고 본다.13

13 4가지 역할이 모두 다른 사람일 수도 있으며 한 사람이 둘 이상을 수행할 수도 있다. 그러나 만능인 사람 한 명이 다 처리한다면 그 사람 에 너무 의존하게 되어 제품을 지속해서 관리하기 어려울 수 있으니 주의하기 바란다.

40

1부 머신러닝 실무 노하우


1 제품에 대한 도메인 지식을 갖춘 사람 2 통계와 머신러닝을 잘 아는 사람 3 데이터 분석 인프라를 구축할 수 있는 엔지니어링 능력을 갖춘 사람 4 실패에 대한 위험을 짊어질 수 있는 책임자

도메인 전문가는 매우 중요하다. 해결할 문제가 무엇인지, 제품의 어떤 부분에 머신러닝을 적 용할지를 고려할 때 도메인 지식이 없다면 전혀 엉뚱한 결과를 낳을 수밖에 없다. 그리고 특징 을 결정하거나 데이터를 수집할 때도 도메인 지식이 중요한 열쇠가 된다. 머신러닝을 잘 아는 사람은 아마도 독자 여러분의 지향점일 것이다. 이 역할의 사람에게는 구 현 능력과 더불어 문제를 설정하는 의사소통 능력도 요구된다. 최근에는 데이터를 활용할 수 있도록 분석 인프라를 만드는 엔지니어가 데이터 엔지니어라는 이름으로 각광받고 있다. 이런 사람들과도 협력하면서 머신러닝 인프라를 어떻게 갖춰야 하는 지를 모색한다. 마지막으로 위험을 짊어질 수 있는 책임자도 중요하다. 책임자는 머신러닝이 실패 확률이 높은 투자라는 사실을 명확히 인식하고, 그럼에도 머신러닝을 통해서만 얻을 수 있는 가치를 만들기 위해 사람들을 설득하는 존재다. 가능하다면 머신러닝과 데이터 분석 경험자가 이 역할을 맡아 야 위험요소를 잘 파악하고 의사결정에 드는 시간을 줄여 실무자가 실무에 집중할 수 있다. 그 렇지 못하면 실무자가 위험요소를 짊어지고 직접 필요성을 설득할 수밖에 없다. 때로는 이 책 임자가 불확실성을 무릅쓰고 직권으로 머신러닝에 투자해야 할 때도 있다. 개발을 진행하면서 든든한 버팀목이 되어줄 사람을 찾아보도록 하자. 머신러닝 프로젝트를 진행할 때 다음 자료가 도움이 될 것이다. 일반적인 프로젝트 관리와의 유사 점과 차이점을 참고하기 바란다. ●

http://www.slideshare.net/shakezo/mlct4

http://www.slideshare.net/TokorotenNakayama/2016-devsumi

1장 머신러닝 프로젝트 처음 시작하기

41


1.5 정리 이번 장에서는 머신러닝 프로젝트를 진행하는 과정과 이 과정의 핵심을 알아보았다. ●●

해결하려는 문제에 대한 가설을 세우고 MVP를 만들어 개념 검증을 최우선으로 한다.

●●

머신러닝 외의 방법으로 해결할 수 있다면, 이를 두려워하지 말라.

●●

머신러닝에 적합한 문제인지 파악한다.

●●

예측 성능과 KPI 모두를 모니터링하면서 꾸준히 개선해간다.

머신러닝 프로젝트는 특성이나 예측 결과를 아직 알 수 없는 새로운 데이터에 대해 탐색적인 방법으로 시행착오를 거치므로, 일반적인 프로젝트보다 재작업이 발생하기 쉽다. 비즈니스 목 적을 명확히 하고, 가설을 확립한 뒤, 가치를 창출할 수 있는 방법을 고려하며 프로젝트를 진행 하도록 한다.

42

1부 머신러닝 실무 노하우


CHAPTER

2

머신러닝으로 할 수 있는 일

머신러닝으로는 어떤 일을 할 수 있을까? 이번 장에서는 머신러닝을 분류, 회귀, 군집화, 차원 축소로 나눠 설명한다. 그 전에 잠시, 머신러닝 알고리즘을 선택하는 방법부터 살펴보자.

2.1 머신러닝 알고리즘 선택 방법 적절한 알고리즘을 선택하려면 각 알고리즘의 특성을 파악해야 한다. 우선, 머신러닝의 종류를 간략히 알아보자. ●●

분류 : 정답이 비연속적인discrete 클래스(카테고리)이며, 정답과 입력 데이터의 조합을 학습하여 새로운 데이터 의 클래스를 예측한다.

●●

회귀 : 정답이 수치다. 정답과 입력 데이터의 조합을 학습하여 새로운 데이터에서 연속하는continuous 값을 예측 한다.

●●

군집화 : 어떤 기준에 따라 데이터를 그룹으로 묶는다.

●●

차원 축소 : 시각화 또는 계산량 절감을 목적으로 고차원 데이터를 저차원 공간에 매핑한다.

●●

그 외

-추 천 : 사용자가 선호할 만한 품목, 혹은 열람한 것과 비슷한 품목을 제시한다. -이 상 탐지 : 수상한 접근 등 평소와 다른 행동을 검출한다. -고 빈도 패턴 마이닝 : 데이터 안에서 발생 빈도가 높은 패턴을 추출한다. -강 화 학습 : 바둑이나 장기처럼 정답이 불명확한 환경에서, 앞으로 취할 행동을 선택하는 방법을 학습한다.

2장 머신러닝으로 할 수 있는 일

43


이렇게 종류가 많기 때문에 어떤 것을 선택할지 망설여질 수 있는데, 다행히 사이킷런 튜토리 얼에는 이럴 때 편리하게 사용할 수 있는 흐름도1가 실려있다. 이제부터 이 흐름도를 따라 알고 리즘을 선택하는 요령을 살펴볼 것이다(단, 추천, 이상 탐지, 고빈도 패턴 마이닝, 강화 학습은 제외한다). [그림 2-1]에 이 기준을 정리하여 실었다. 그림 2-1 알고리즘을 선택하는 요령 시작

데이터가 50건 이상인가?

아니오

데이터 추가 수집

예측 대상이 범주형인가? 예 아니오

군집화

정답 레이블이 있는가? 예

SGDClassifier/ GBDT (XGBoost)

아니오

데이터가 10만 건 이하인가? 예

선형 SVM

잘 안 된다면

아니오

예측 대상이 수치 인가?

아니오

회귀

데이터가 아니오 10만 건 이하인가?

SGDRegressor

데이터가 희소한가?

아니오

릿지 회귀 / SVR(선형 커널)

라쏘 회귀 / 일래스틱넷 SVM/ 랜덤 포레스트

차원 축소 시각화

잘 안 된다면

SVR (RBF 커널) / 랜덤 포레스트 회귀

학습에 사용하는 데이터 수, 예측 대상이 비연속적인지(클래스), 정답 레이블이 존재하는지 1 http://scikit-learn.org/stable/tutorial/machine_learning_map/

44

1부 머신러닝 실무 노하우


등의 정보가 핵심이다. 특히, 데이터 수가 너무 많을 때는 뒤에 설명할 온라인 학습 알고리즘을 사용할 수 있다.

사이킷런이 제공하는 온라인 학습 알고리즘 사이킷런은 분류용 클래스인 SGDClassifier와 회귀용 클래스인 SGDRegressor를 제공한다. 이 둘은 어떤 손실 함수와 규제화항을 선택하느냐에 따라 SVM, 로지스틱 회귀, SVR과 비슷한 성능으로 분류와 회귀를 수행할 수 있다. 그리고 온라인 학습이 가능한 선형 분리기로 Passive

Agressive 알고리즘은 제공하지만, SCWexact Soft Confidence Weight나 AROWAdaptive Regularization of Weight Vectors

같은 비교적 최신 알고리즘은 아직 제공하지 않는다.2 그 외의 알고리즘은 직접 구현하거

나 다른 프레임워크를 사용해야 한다.

2.2 분류 분류classification란 지도 학습의 한 종류로 카테고리와 같은 비연속적인 값을 예측한다. 예를 들어

이메일의 스팸 여부나 사진 속 물체를 검출하는 것처럼 비연속값으로 나타낼 수 있는 대상을 예측하는 경우에는 분류 모델을 만들어야 한다. 클래스 수가 2개면 이진 분류라고 하며, 3개 이상이면 다중클래스 분류multiclass classification라고 한다. 이번 장에서는 편의상 이진 분류를 예로 설명하지만, 다중클래스 분류도 기본 원리는 같다. 사이킷런의 공식 사이트에 다중클래스 분류 가 잘 설명되어 있으니 참고하기 바란다.3 이번 절에서는 다음 분류 알고리즘들을 소개한다. ●●

퍼셉트론

●●

로지스틱 회귀

●●

서포트 벡터 머신(SVM )

●●

신경망

●●

k -최근접 이웃(k -NN )

●●

결정 트리

2 0.18.0 버전부터 신경망용 ADAM 구현이 추가되었으며, MLPClassifier 클래스에서 최적화 방법의 하나로 이를 사용할 수 있다. 3 http://scikit-learn.org/stable/modules/multiclass.html

2장 머신러닝으로 할 수 있는 일

45


●●

랜덤 포레스트

●●

경사 부스팅 결정 트리(GBDT )

퍼셉트론, 로지스틱 회귀, SVM과 신경망은 두 클래스의 경계면에 대한 함수를 학습한다. 여기 서 말하는 함수란 이 경계면을 나타내는 수식이라 생각해도 무방하다. 물론, 이 알고리즘들로 다중클래스를 분류할 수도 있다. 이렇게 두 클래스를 분류하는 초평면(2.2.1절에서 설명)을 결정 경계decision boundary라고 한다.

k-최근접 이웃은 (이름에서 짐작할 수 있듯) 학습된 데이터와의 ‘거리’를 기준으로 판단한다. 결정 트리, 랜덤 포레스트, GBDT는 트리 구조로 표현된 규칙의 집합을 학습한다. 또, 이번 장에서는 자세히 다루지 않지만 텍스트 분류에 많이 사용되는 나이브 베이즈Naive Bayes나 음성인식에서 오랫동안 사용된 은닉 마르코프 모델hidden Markov model (HMM ) 등도 있다. 이 알고리 즘들은 데이터에 잠재된 확률분포를 추정하는 방법으로 데이터를 모델화한다. 대부분의 분류 문제는 뒤에 설명할 목적 함수와 결정 경계를 이해하면 쉽게 그 차이를 이해할 수 있다. 수식을 가능한 한 줄였으므로 그래프를 중심으로 읽어주기 바란다. 그럼 각각의 알고리즘을 알아보자.

2.2.1 퍼셉트론 퍼셉트론perceptron (단순 퍼셉트론)은 입력 벡터와 학습한 가중치 벡터를 곱한 값을 합한 값이

0 이상일 때는 클래스 1로, 0 미만일 때는 클래스 2로 분류하는 간단한 알고리즘이다.4 그림 2-2 퍼셉트론 곱셈합

이진화

숫자값

숫자값 / 이산값

4 여기서는 퍼셉트론의 활성화 함수(뒤에 설명함)로 계단 함수를 사용하였으나, 다른 함수를 사용할 수도 있다.

46

1부 머신러닝 실무 노하우


CHAPTER

3

학습 결과 평가하기

시스템에 머신러닝을 적용할 때 처음부터 만족할 만한 결과를 얻는 경우는 드물다. 그렇다면 결과가 만족할 만한지는 어떻게 측정할까? 이번 장에서는 머신러닝의 학습 결과를 평가하는 방법을 알아보겠다.

3.1 분류 결과에 대한 평가 행렬 이번 절에서는 스팸 분류를 예로 들어 다음과 같은 4가지 지표를 소개한다. ●●

정확도

●●

정밀도

●●

재현율

●●

F -점수

또, 이들 지표와 관련된 다음 개념도 설명한다. ●●

혼동행렬

●●

마이크로 평균, 매크로 평균

3장 학습 결과 평가하기

79


3.1.1 그냥 정확도를 사용하면 될까? 분류 작업에서는 결과가 얼마나 바르게 나뉘었느냐를 기준으로 분류기의 성능을 평가한다. 먼 저 가장 간단한 정확도accuracy부터 알아보자. 정확도의 정의는 다음과 같다. 정확도 =

정답과 일치한 수 전체 데이터 수

스팸 메일과 정상 메일을 분류하는 이진 분류 작업을 예로 살펴보자. 수신된 메일 100건을 사 람이 직접 분류해보니 스팸이 60개이고 정상 메일이 40개였다. 분류기가 모든 메일을 스팸으 로 분류한다면 정확도는 60%가 된다. 분류 문제는 일반적으로 무작위로 선택한 결과를 최저 성능으로 삼는다. 이진 분류 작업이라 면 2개 클래스가 무작위로 출력될 것이므로 정확도는 50%이고, 3개 클래스 분류라면 33.3% 가 된다. 정확도가 60%라고 하면 무작위 이진 분류보다는 높은 것이다. 그렇지만 전부를 스팸 으로 분류할 뿐인데 60%라니, 제대로 된 평가라고 생각되지 않는다. 진짜 현실의 문제에서는 분류 대상 클래스의 분포 자체가 치우친 경우도 왕왕 있기 때문에 그냥 정확도만으로는 의미가 없는 경우가 많다.

3.1.2 데이터 분포가 치우친 경우를 위한 지표 - 정밀도와 재현율 그렇다면 어떻게 해야 할까? 이러한 데이터 분포를 고려한 지표로 정밀도precision와 재현율recall이 있다. 정밀도는 출력 결과가 정답을 얼마나 맞혔는지를 나타내는 지표다. 한편, 재현율은 출력 결과가 실제 정답 중에서 얼마나 맞혔는지를 나타내는 지표다. 다시 스팸 분류를 예로 들면, 정밀도는 분류기가 스팸으로 판정한 메일 중에서 진짜 스팸의 비 율에 해당한다. 스팸으로 판정한 메일이 80개이고, 이중 진짜 스팸이 55개였다면 정밀도는 다 음과 같다. 정밀도 =

80

1부 머신러닝 실무 노하우

55 80

= 0.6785 ≒ 0.68


무작위로 판정한 0.5보다는 나은 값이지만, 그리 높다고도 할 수 없다. 그리고 재현율은 전체 데이터에 포함된 실제 스팸 중(여기서는 60건), 분류기가 스팸으로 판 정한 메일 개수(여기서는 55개)의 비율이다. 수식은 다음과 같다. 55

재현율 =

80

= 0.916 ≒ 0.92

재현율은 비교적 높게 나왔다. 이 분류기는 정밀도보다는 재현율이 1에 가까우므로 ‘재현율을 중시한다’고 평가할 수 있다. 그럼 재현율을 중시한다는 것은 어떤 의미일까? 정밀도와 재현율은 상충관계다. 문제의 성격에 따라 어느 쪽을 중시해야 하는지도 달라진다. 미처 잡아내지 못하는 개수가 많더라도 더 정확한 예측이 필요하다면 정밀도를 중시한다. 스팸 분류로 말하자면, 가끔은 스팸을 보아도 좋으니 꼭 수신해야 하는 메일이 스팸으로 걸러지지 않도록 하는 것에 해당한다. 이와 달리, 잘못 걸러내는 비율이 높더라도 놓치는 것이 없도록 하는 경우를 재현율을 중시한 다고 한다. 재현율 중시는 나중에 전체 데이터를 놓고 볼 때 놓친 개수가 얼마나 되느냐를 중요 하게 생각한다고 해석할 수 있다. 예를 들어 발생 빈도가 낮은 질병이라면 거짓 양성이 가끔 나 오더라도 재검사를 받으면 문제가 없다고 생각하는 상황에 해당한다. 스팸 분류 사례에서는 재 현율 중시가 꼭 달갑지는 않을 것이다.

3.1.3 균형 잡힌 성능을 평가하는 F-점수 정밀도와 재현율의 상충관계를 평가에 반영하여 실제 분류기를 비교하는 데 사용되는 지표가 F-점수F-measure다. F-점수는 정밀도와 재현율의 조화평균에 해당하며, 다음과 같이 계산한다. F-점수 =

1 정밀도

2 +

1 재현율

=

1 0.68

2 +

1 0.92

≒ 0.78

재현율과 정밀도가 균형을 이룰 때 F-점수가 높아진다. 즉, F-점수가 높다는 것은 재현율과 정밀도가 고르게 높다는 뜻이다.

3장 학습 결과 평가하기

81


3.1.4 혼동행렬 따라잡기 이어서 혼동행렬confusion matrix에 대해 알아보자. 분류 작업에서는 혼동행렬에서 정보를 얻는 경우 가 많으니 알아두는 것이 좋다. [표 3-1]은 혼동행렬의 예다. 혼동행렬에는 축이 2개 있다. 첫 번째는 예측 결과 축으로, 어떤 분류 모델이 예측한 결과가 양성positive (스팸)인지 음성negative (스팸 아님)인지를 나타낸다. 두 번째는 실제 결과 축으로, 사람이 직접 분류한 결과가 양성인지 음성인지를 나타낸다. 이 두 축 을 표로 정리한 것이 혼동행렬이다. 표 3-1 혼동행렬 예측 결과 실제

양성(스팸)

결과 음성(스팸 아님)

양성(스팸)

음성(스팸 아님)

진짜 양성

거짓 음성

(True Positive, TP)

(False Negative, FN)

거짓 양성

진짜 음성

(False Positive, FP)

(True Negative, TN)

진짜 양성true positive, 거짓 음성false negative 등의 용어는 그 이름에서 알 수 있듯, 예측 결과(양성/음

성)의 맞았는지 혹은 틀렸는지를 나타내는 말이다. 앞서의 스팸 분류 예로 혼동행렬을 만들어보자. 메일 100개 중 실제 스팸은 60개였고, 분류기 가 스팸으로 판정한 80개 중 실제 스팸은 55개였다. 이 상황을 혼동행렬로 나타내보자. 먼저, 스팸으로 판정한 80개 중 실제 스팸인 55개가 진짜 양성(TP )에 해당한다. 표 3-2 혼동행렬 작성 1: 진짜 양성 개수 확인 예측 결과 양성(스팸) 실제

양성(스팸)

결과

음성(스팸 아님)

음성(스팸 아님)

55

스팸으로 판정한 80건 중에서 스팸이 아닌데 스팸으로 판정한 메일은 80 - 55 = 25개다. 이 메일들이 거짓 양성(FP )에 해당한다.

82

1부 머신러닝 실무 노하우


CHAPTER

4

기존 시스템에 머신러닝 통합하기

기존 시스템에 머신러닝을 통합하려면 어떻게 해야 할까? 이번 장에서는 머신러닝 시스템을 구성하는 방법과 머신러닝에 사용할 정답 데이터를 얻기 위한 로그 수집 방법을 알아본다.

4.1 기존 시스템에 머신러닝을 통합하는 과정 ‘1.2 머신러닝 프로젝트의 과정’에서도 본 것처럼 기존 시스템에 머신러닝을 적용하는 과정은 대략 다음과 같다. 1 문제를 정의한다. 2 머신러닝을 사용하지 않는 방법은 없는지 검토한다. 3 시스템을 설계한다. 4 사용할 알고리즘을 선택한다. 5 특징과 정답 데이터, 로그를 설계한다. 6 데이터를 전처리한다. 7 학습을 수행하고 파라미터를 튜닝한다. 8 시스템에 통합한다.

이번 장에서는 이중 ‘시스템 설계(3 )’와 ‘로그 설계(5 )’를 다룰 것이다.

4장 기존 시스템에 머신러닝 통합하기

91


4.2 시스템 설계 머신러닝에도 여러 종류가 있지만, 여기서는 가장 많이 활용되는 지도 학습을 예로 들어 시스 템에 통합하는 과정을 살펴보겠다. 분류나 회귀 같은 지도 학습은 학습과 예측 두 단계로 나뉜다. 여기에 다시 학습이 일어나는 시 점에 따라 배치처리 시 이뤄지는 방식과 실시간으로 이뤄지는 방식으로 나눠볼 수 있다. 이번 절에서는 이들 각 경우에 적합한 시스템 구성과 그 이유를 알아볼 것이다. 하지만 그 전에 헷갈 리기 쉬운 용어부터 정리해보자.

4.2.1 헷갈리기 쉬운 ‘배치 처리’와 ‘배치 학습’ 머신러닝에서 배치batch라는 단어는 특별한 의미가 있다. 일반적인 ‘배치 처리’와 어원은 같지만, 머신러닝에서 배치라고 하면 대개 ‘배치 학습’을 가리킨다. 그렇다면 배치 학습과 일반적인 의 미의 배치 처리는 어떻게 다를까? 이번 장에서는 배치 처리와 대치되는 개념을 ‘실시간 처리’라 부르겠다. 배치 처리는 어떤 처리 를 일괄로 하는 것 혹은 그러한 처리 자체를 가리키는 개념이다. 이에 비해 실시간 처리는 시시 각각 입력되는 센서 데이터나 로그 데이터를 순서대로 처리하는 것으로 정의한다.1 그리고 배치 처리와 헷갈리지 않기 위해, 여기서부터는 배치 학습을 ‘일괄 학습’으로, 온라인 학 습은 ‘순차 학습’으로 부르겠다. 일괄 학습과 순차 학습의 차이는 모델을 학습하는 과정에서 데이터를 사용하는 형태에 있다. 일괄 학습에서는 새로운 가중치를 계산하는 데 훈련 데이터를 모두 사용한다. 그래서 훈련 데이

터가 많아질수록 필요한 메모리도 그만큼 늘어나는 게 일반적이다. 예를 들어 새로 계산할 가 중치 w _ target이 모든 가중치의 평균이라고 가정해보자. 가중치는 w _ 1부터 w _ 100까지

100개가 있으며 이때의 평균을 일괄 학습으로 구하려면 다음처럼 계산해야 할 것이다. sum = w_ 1 + w_ 2 + w_ 3 + ... + w_ 100 w_ target = sum / 100

1 ‘실시간 처리’라고 하면 ‘밀리초 단위’로 처리할 수 있는지 궁금한 독자도 있을 것이다. 그러나 이 책에서는 편의상 속도에 관계없이 순차적 으로 처리하는 것을 가리킨다.

92

1부 머신러닝 실무 노하우


이와 달리 순차 학습에서는 훈련 데이터 1건을 이용해서 새로운 가중치를 계산한다. 예를 들어 다음과 같이 평균을 구하는 상황이라면, 메모리에는 그 순간에 사용되는 데이터와 새로 계산된 가중치만 저장하면 된다. 어떤 시점의 가중치가 w _tmp라면, 평균을 계산하는 데는 합을 나타 내는 sum과 요소 수 cnt만 있으면 된다. 코드로는 다음과 같다. sum = 0 cnt = 0 while has_ weight(): w_ tmp = get_ weight() sum + = w_ temp cnt + = 1 w_ target = sum / cnt

결국 일괄 학습과 순차 학습의 차이는 학습 도중 최적화하는 방법의 차이, 그리고 한 번에 다루 는 데이터 덩어리의 크기 차이라고 할 수 있다.2 그렇다면 배치 처리는 무얼 하는 처리일까? 사실 배치 처리라고만 하면 처리 대상과는 무관하 지만, 머신러닝에서 배치라고 하면 그 대상이 학습일 수도 예측일 수도 있다. 실시간 처리도 마 찬가지로 학습일 수도 있고 예측일 수도 있는 것이다. 여기서 문제를 하나 풀어보자. 다음 중 실제로 가능한 조합은 무엇일까? 1 배치 처리로 일괄 학습 2 배치 처리로 순차 학습 3 실시간 처리로 일괄 학습 4 실시간 처리로 순차 학습

이 문제를 보면 ‘일괄 학습은 배치 처리로만 가능하다’거나 ‘순차 학습은 실시간 처리로만 가능 하다’는 오해를 하기 쉽다. 하지만 실제로는 3번을 제외하면 모든 조합이 가능하다. 1번과 4번 조합은 이해하기 어렵지 않을 것이다. 그렇다면 2번 조합 ‘배치 처리로 순차 학습’은 어떻게 가 능한 것일까? 순차 학습은 최적화를 할 때 훈련 데이터를 1건씩 처리하는 방법이라고 설명했

2 일괄 학습과 순차 학습의 절충이라 할 수 있는 미니배치 학습(mini-batch training)도 있다. 일정 규모의 데이터를 샘플링하여 그룹을 만들고 이 그룹에 속하는 데이터로 일괄 학습을 수행하는 과정을 반복하는 방법이다. 확률적 경사하강법(SGD)의 효과가 알려지면서 미 니배치 학습 역시 급속도로 널리 사용되기 시작했고, 특히 딥러닝에서는 주류로 자리 잡았다.

4장 기존 시스템에 머신러닝 통합하기

93


다. 다시 말해, 배치 처리로 데이터를 한꺼번에 처리하기는 해도 최적화 과정에서는 순차 학습 을 따르는 것이 가능하다. 예측 단계라면 학습 단계에서 적용한 학습 방식이나 처리 방법과 상관없이 배치 처리와 실시간 처리가 모두 가능하다. 실제로 학습을 수행할 때는 (데이터 모두를 메모리에 유지할 수 없는 경우를 제외하면) 배치 처리를 적용하는 편이 시행착오를 줄이는 데 유리하다. 이어지는 절부터는 다음과 같이 배치 처리를 적용한 학습 패턴 3가지와 실시간 처리로 학습하 는 패턴이 어떻게 구성되는지를 살펴보겠다. 1 배치 처리로 학습 + 예측 결과를 웹 애플리케이션에서 직접 산출(예측을 실시간 처리) 2 배치 처리로 학습 + 예측 결과를 API를 통해 사용(예측을 실시간 처리) 3 배치 처리로 학습 + 예측 결과를 DB에 저장하고 사용(예측을 배치 처리) 4 실시간 처리로 학습

4.2.2 배치 처리로 학습 + 예측 결과를 웹 애플리케이션에서 직접 산출(예측을 실시 간 처리) 예측 처리의 3가지 유형 중 가장 단순한 패턴으로, 배치 처리로 학습해서 얻은 예측 모델을 웹 애플리케이션에서 실시간 처리에 이용한다. 모놀리식monolithic3 웹 애플리케이션에 예측 처리를 통합하고 예측 결과 자체는 라이브러리의 API를 통해 구한 다음, 이 결과를 웹 애플리케이션에 서 이용한다(그림 4-1 ). 이 패턴의 특성은 다음과 같다. ●●

예측에 실시간 처리가 필요

●●

웹 애플리케이션과 머신러닝을 수행하는 배치 시스템이 동일한 언어로 구현

비교적 간단하게 구성할 수 있어서 테스트 목적의 소규모 시스템에 적합한 패턴이다. 밴디트 Bandit

알고리즘을 적용한 광고 전달 최적화처럼 입력 데이터를 미리 준비할 수 없으며 예측 결

과를 짧은 지연시간으로 이용하고 싶을 때도 유용하다. 지연시간을 짧게 유지하려면 데이터 가 져오기fetch, 전처리, 특징 추출, 예측에 이르는 과정 전체의 수행 시간을 짧게 유지해야 한다.

3 배치 시스템과 웹 애플리케이션 등 여러 기능과 역할을 하나의 커다란 시스템에서 모두 담당하는 설계 구조를 말한다.

94

1부 머신러닝 실무 노하우


그림 4-1 패턴 1: 배치 처리로 학습한 모델을 웹 애플리케이션에서 직접 사용 웹 애플리케이션

배치 시스템

예측 결과

학습 결과

학습 모듈

예측 모델 예측 요청

특징 추출 모듈

로그 / 사용자 정보

특징

특징

DB

특징 추출 모듈 特徴量

로그 / 사용자 정보

그러므로 전처리된 데이터 혹은 추출된 특징을 관계형 데이터베이스나 키-값 저장소에 캐싱해 두기도 한다. 또, 예측 모델 역시 메모리에 올리기 부담스럽지 않은 크기로 관리하고, 예측 처 리에 드는 연산 부하가 낮은 알고리즘을 택하여 모델의 시간복잡도와 공간복잡도를 억제하는 것이 좋다. 이 패턴은 머신러닝을 처리하는 부분과 웹 애플리케이션 사이의 결합이 강해지는 면이 있다. 애플리케이션 규모가 커지면 코드 변경과 배포 비용이 증가하므로 머신러닝 부분의 개발도 보 수적으로 되기 쉽다. 이러한 제약을 피하고자 머신러닝 부분의 프로토타이핑은 파이썬을 사용하고, 예측 처리 로직 은 웹 애플리케이션 구현에 사용하는 자바스크립트나 루비Ruby로 이식하기도 하며, 속도를 위 해 C + +로 구현된 라이브러리를 바인딩하기도 한다. 이런 시스템(그림 4-1 )에서는 웹 애플리케이션과 배치 시스템이 같은 언어로 구현되며 시스 템의 상당 부분을 공유한다. 공통 데이터베이스에 저장된 로그와 사용자 정보로부터 (그림에 서는 별도 모듈로 그렸지만) 같은 특징 추출 모듈을 사용해서 특징을 추출한다. ‘1.2.5 특징, 정답 데이터, 로그 설계하기’에서 설명했듯, 특징 추출 모듈은 텍스트 같은 원시 정보를 학습 모듈이 이해할 수 있는 형태로 변환하는 역할을 한다. 이렇게 특징을 추출하는 방법이 달라지 면 같은 모델을 사용해도 결과가 달라진다. 로그 설계는 ‘4.3 로그 설계’에서 자세히 다룬다.

4장 기존 시스템에 머신러닝 통합하기

95


학습 단계(그림 4-2 )에서는 배치 시스템이 미리 DB에 축적한 로그와 사용자 정보를 이용하 여 특징을 추출한다. 이때 만든 특징으로부터 모델을 학습한다. 이렇게 학습된 모델을 직렬화 하여 저장소에 저장한 것이 학습 결과가 된다. 그림 4-2 패턴 1의 학습 단계 웹 애플리케이션

배치 시스템

예측 결과

학습 결과

학습 모듈

예측 모델 예측 요청

특징

특징 추출 모듈

특징

DB

로그 / 사용자 정보

특징 추출 모듈 特徴量

로그 / 사용자 정보

예측 단계(그림 4-3 )에서는 특정 이벤트가 발생하면 웹 애플리케이션이 예측을 요청한다. 이 를테면, 스팸 여부를 판정해야 하는 댓글이 포스팅되었다고 해보자. 이벤트가 발생하면 예측 해야 할 대상(댓글)에 관한 정보를 DB에서(혹은 HTTP 요청에서 직접) 얻은 다음, 그에 대 한 특징을 추출한다. 직렬화하여 저장해둔 모델을 읽어 들여서 추출된 특징으로부터 예측 결 과(스팸/스팸 아님)를 출력한다. 이 결괏값을 기반으로 사용자에게 피드백을 남기거나 그다음 단계로 넘어가게 된다. 그림 4-3 패턴 1의 예측 단계 웹 애플리케이션

배치 시스템

예측 결과

학습 결과

학습 모듈

예측 모델 예측 요청

특징 추출 모듈

로그 / 사용자 정보

96

1부 머신러닝 실무 노하우

특징

특징

DB

특징 추출 모듈 特徴量

로그 / 사용자 정보


CHAPTER

5

학습 데이터 수집하기

비즈니스에 필요한 새로운 통찰을 얻기 위해 비지도 학습을 사용하기도 하지만, 분류와 회귀 같은 지도 학습이나 추천 시스템에서 높은 성능을 내려면 정답 정보가 포함된 데이터나 말뭉 치, 사전처럼 양질의 데이터가 많이 필요하다. 이번 장에서는 지도 학습에 필요한 데이터를 수 집하는 방법을 설명한다. 머신러닝을 실제 서비스에 적용하려면 실제 문제를 해결해야 하므로 공개된 데이터셋만으로는 부족할 것이다. 이번 장에서는 조금 깔끔하지는 못해도 머신러닝에서 중요한 훈련 데이터를 만 드는 방법을 알아보겠다.

5.1 학습 데이터를 얻는 방법 지도 학습에서 빼놓을 수 없는 것이 훈련 데이터다. 그런데 훈련 데이터는 어떻게 구성될까? 크게 보면 다음의 2가지 정보로 이뤄진다. ●●

입력: 열람 로그에서 추출한 특징

●●

출력: 분류 레이블이나 예측값

5장 학습 데이터 수집하기 109


그림 5-1 머신러닝(지도 학습)의 얼개([그림 1-1]과 같음) 학습 데이터

출력 (정답) 모델 학습 단계 입력

예측 단계

입력

모델

출력 (예측 결과)

새로운 데이터

특징을 찾는 데 필요한 시행착오는 일찍이 설명한 바 있다. 보통 발견법heuristic적인 방법으로 찾 아 나간다. 출력 레이블 혹은 예측값은 다음과 같은 방법으로 부여한다. ●●

서비스 도중 발생하는 로그를 수집하여 추출(완전 자동)

●●

콘텐츠를 사람이 직접 보며 부여(수동)

●●

기계적으로 정보를 부여한 뒤 사람이 확인(자동 + 수동)

이번 장에서는 훈련 데이터를 만드는 주체가 누구인가의 관점에서 설명하려고 한다. 1 공개된 데이터셋이나 모델 활용 2 개발자가 직접 작성 3 동료나 친구에게 데이터 입력을 부탁 4 크라우드소싱 활용 5 서비스에 수집 기능을 넣고, 사용자가 입력하게 함

110 1부 머신러닝 실무 노하우


5.2 공개된 데이터셋이나 모델 활용 학습까지 완료된 공개 모델을 사용하거나, 경진대회용 데이터셋으로 기본 학습을 마친 모델을 전용하는 방법이다. 이번 절에서는 이러한 데이터를 수집하는 방법을 알아보자. 공개된 데이터셋 소스로는 UCI 머신러닝 저장소1와 머신러닝 경진대회 플랫폼인 캐글2이 유명 하다. 캐글에는 여러 경진대회에 사용됐거나 일반 사용자가 올린 데이터셋이 올라와 있다. 이 미지 인식 분야에서는 일반 물체 인식에 쓰이는 이미지넷ImageNet3 등 레이블링된 데이터셋도 공 개되어 있다. 이 외에도 (직접 학습에 쓰이는 데이터는 아니지만) 딥러닝 라이브러리인 카페 에는 이미 학습된 모델을 공유하는 모델 주Model Zoo4라는 기능이 있다. 텐서플로도 물체 인

Caffe

식용으로 학습된 모델을 제공한다.5 일본어 텍스트 데이터로는 위키백과 덤프 데이터와 유료로 제공되는 신문 말뭉치가 있다. 이 데이터를 실제 활용한 예로는 위키백과의 형태소분석 사전을 사용한 해커돌6을 들 수 있다. 그러나 이 방법들을 사용하는 데는 몇 가지 주의할 점이 있다. ●●

모델이나 데이터셋의 라이선스가 상업적 이용을 허용하는가?

●●

이미 학습된 모델이나 데이터셋이 원하는 분야에 적용 가능한가?

첫째, 특히 레이블 포함 데이터는 주로 대학 등이 연구비를 투자하여 만들기 때문에 라이선스 를 연구 목적으로 제한하는 경우가 많다. 이런 데이터에 쓰이는 라이선스는 오픈소스 소프트웨 어 라이선스처럼 표준화되어 있지 않다. 따라서 웹에 공개된 데이터라도 상업적 이용은 불가능 한 경우가 종종 있으니 반드시 확인하도록 한다. 또, 데이터를 이용하여 만든 모델을 재배포하 는 데도 원 데이터에 따라 제한을 받는 경우가 있다. 재배포를 하든 하지 않든, 원 정보원을 명 확히 관리하는 것이 좋다. 둘째, 배포된 데이터의 도메인이 사용 목적과 다르다면 어떤 식으로든 가공을 거쳐야 할 수 있 다. 이 주제는 이 책에서 다루지 않으니 관심 있는 독자는 반지도 학습 semi-supervised learning이나

1 http://archive.ics.uci.edu/ml/ 2 https://www.kaggle.com/ 3 http://www.image-net.org/ 4 https://github.com/BVLC/caffe/wiki/Model-Zoo 5 http://bit.ly/2KeJuIE 6 http://www.slideshare.net/mosa_siru/ss-40136577

5장 학습 데이터 수집하기 111


전이 학습transfer learning7에 관해 공부해보기 바란다. 특히, 물체 인식에서는 전이 학습을 이용하여

기존 학습 모델에 자신이 풀려는 문제의 정답 데이터를 추가로 학습시켜 비용을 절약할 수 있 다. 드라마 <Silicon Valley >에 나온 핫도그 인식기가 이런 방법으로 만들어졌다.8 그러나 기존 데이터셋만으로 풀 수 있는 문제는 비교적 제한적이니, 이제부터 데이터셋을 직접 꾸리는 방법을 알아보도록 하자.

5.3 개발자가 직접 만드는 데이터셋 활용할 수 있는 기존 데이터가 없다면 가장 먼저 개발자가 직접 만들어 내는 방법을 생각해볼 수 있다. 어떤 데이터를 특징으로 삼느냐에 따라 성능이 크게 좌우되니, 직접 수고를 들여 훈련 데이터를 만드는 것이 매우 중요하다. 우선 해결하려는 문제가 분류 문제인지 회귀 문제인지를 고려한다. 예를 들어 소셜 북마크 서비스에서 카테고리를 예측하는 문제를 푼다고 가정하자.9 소셜 북마 크는 흥미 있는 웹 사이트를 공유하는 서비스로, 공유 아이템을 정리하기 쉽도록 카테고리를 자동으로 부여하는 기능을 제공한다. 이 문제는 고정된 카테고리를 예측하는 문제이므로 분류 문제에 해당한다. 먼저 “정치”, “연 예”, “기술”, “생활” 등의 카테고리를 정의한다. 그런 다음 각 카테고리에 속하는 콘텐츠를

1,000건 정도씩 수집한다. 그리고 사람이 직접 이 콘텐츠를 분류한다. ‘수집’에도 여러 방법이 있는데, 기존 콘텐츠가 있는 경우라면 특정 키워드를 포함하는 콘텐츠를 정답 데이터로 삼을 수 있다. 이렇듯 어떤 기준을 정해 콘텐츠를 정답 카테고리로 분류하면 된다. 이상의 과정으로 첫 번째 개발 데이터를 작성한다. 여기서 ‘1,000건 정도’는 어디까지나 대강의 기준이다. 데이터가 더 적어도 풀 수 있는 문제도 있지만, 일단 카테고리당 이 정도 데이터를 갖춘다면 첫 단계로서는 무난한 수준이 된다.

7 카미시마 토시히( 神嶌敏弘), 「전이 학습( 転移学習)」, 인공지능학회지( 人工知能学会誌) 25.4, 2010, p572-580, http://www. kamishima.net/archive/2010-s-jsai_tl.pdf 8 https://hackernoon.com/ef03260747f3 9 http://bit.ly/2EFjIcC

112 1부 머신러닝 실무 노하우


CHAPTER

6

효과 검증하기

“새로운 기능을 출시해서 지난주보다 매출이 20% 늘었다. 프로젝트 성공이다.” 이 말이 과연 사실일까? 이번 장의 주제는 효과 검증이다. 처음 의도한 효과가 발생했는지, 그렇다면 어느 정도인지를 검증하는 일은 프로젝트에서 가설을 검증하는 마지막 단계다. 이번 장에서는 검증 의 기초인 통계 검정과 인과효과 추정을 알아보고, 검증 기법인 A/B 테스트에 초점을 맞춘다.

6.1 효과 검증 효과 검증이란 어떤 시책에 의해 발생한 효과를 추정하는 기법이다. 바꿔 말하면, ‘사건 Y가 X 의 영향을 얼마나 받았는지’를 밝히는 활동이라고 할 수 있다. 광고 전달 서비스를 예로 들면, ‘새로 출시된 기능으로 광고 표출 1,000번당 수익이 얼만큼 늘었는지’를 검증하는 것이다. 이 검증 결과는 새 기능을 유지할지를 결정하는 근거 데이터가 된다. 여기서 말하는 검증이란 ‘어 떤 측정값에 기초한 판단’을 의미하는데, 이때 어떤 값 혹은 어떤 지표를 이용할지는 효과 검증 단계에서는 정하지 않는다(바로 뒤에 설명한다). 효과 검증을 잘하려면 사용하는 기법을 잘 이해해야 하고 프로젝트의 진행 방법도 중요하다. 이번 장에서 소개할 기법은 머신러닝 시스템 은 물론 웹 사이트 디자인 선정이나 사회 실험에 대한 평가 등 폭넓은 분야에서 활용된다.

6장 효과 검증하기 117


6.1.1 효과 검증까지 거쳐야 할 과정 효과 검증 기법을 설명하기에 앞서, 효과 검증까지 거쳐야 하는 과정을 살펴보자. 그림 6-1 효과 검증까지의 단계 문제 정의

가설 설정

개입(개발)

효과 검증

개발 목적은 개발을 시작하기 전에 결정해야 하듯, 검증에 사용할 지표 역시 가설 설정 단계에 서 미리 결정해야 한다. 이때 측정이 불가능한 지표를 설정하면 효과 검증 자체가 불가능하니 측정 수단이 없다면 측정할 방법부터 강구해야 한다. 소셜 네트워크 서비스와 광고 전달 시스 템을 예로 들어 살펴보자. 표 6-1 소셜 네트워크 서비스 단계

내용

문제 정의

활성 사용자의 비율을 높이고 싶다.

가설 설정

사용자에 적합한 추천 콘텐츠를 제시하여 평균 체류 시간을 늘린다.

조치

콘텐츠 추천 시스템을 개발한다.

효과 검증

평균 체류 시간이 늘었는지 확인한다.

118 1부 머신러닝 실무 노하우


표 6-2 인터넷 광고 전달 시스템 단계

내용

문제 정의

수익률을 높이고 싶다.

가설 설정

광고 클릭 예측의 정확도를 높여 광고 키워드 낙찰가를 낮춘다.

조치

광고 클릭률 예측 모듈과 그 예측값을 이용한 입찰 로직 개발한다.

효과 검증

구매전환 1명당 비용이 낮아졌는지 확인한다.

6.1.2 오프라인에서 검증하기 어려운 부분 3장에서 보았듯, 머신러닝 모델의 성능 평가는 오프라인에서도 수행할 수 있다. 그럼 오프라인 에서 검증하기 어려운 효과에는 어떤 것이 있을까?

경제 효과 사업의 수익이나 매출 책임자의 관심은 예측 모듈 한두 개의 성능보다는 ‘그걸로 수익을 얼마 나 끌어올릴 수 있을까’ 하는 데 있을 것이다. 그림 6-2 알고 싶은 건 그게 아닌데…

수익률은요? 예측 정확도가 5% 올랐습니다.

특히 사업부에 속한 데이터 분석팀이라면 이익에 얼마나 공헌할지에 대한 설명은 필수라고 할 수 있다. 매입 원가를 최소화하는 것처럼 현금 흐름과 직결된 문제라면 예측이 가능하겠지만, 대개는 예측 모듈의 성능뿐 아니라 서비스 이용자 수나 홍보 같은 변동 요인의 영향을 받게 마 련이다. 고메즈-유리베C. A. Gomez-Uribe의 팀은 넷플릭스의 추천 시스템이 이뤄낸 사업적 가치로

6장 효과 검증하기 119


해지율 저하를 들었는데, 1년에 약 10억 달러의 효과가 있었다고 한다.1 이런 수치는 오프라인 검증에서 얻은 추천 정확도로는 산출하기 어렵다.

로그를 경유한 부작용 운영 중인 머신러닝 모델이 다른 데이터에 영향을 받았을 때 일어나는 현상이다. 이를테면 추 천 시스템은 사용자 행동 로그를 훈련 데이터로 사용한다. 그러나 사용자의 선택이 추천 시스 템의 추천 때문에 편향될 수도 있다. 이렇게 자신의 예측 결과가 영향을 준 데이터로 실험하려 면 구현 비용이 큰 시뮬레이터가 필요하게 된다. 또, 같은 로그로 학습하는 다른 예측 모듈에도 영향을 준다. 그림 6-3 오염된 로그 웹 애플리케이션 후보 제시

선택

예측 모델의 영향을 받은 행동 결과

예측 모델

배포

학습 배치

데이터 웨어하우스

편향이 포함된 훈련 데이터

로그를 통해 자기 자신은 물론 주변에 영향을 주는 문제는 머신러닝이 풀어야 할 기술부채의 하나로 꼽힌다.2

1 Gomez-Uribe, Carlos A., and Neil Hunt. 「The Netflix Recommender System: Algorithms, Business Value, and Innovation」. ACM Transactions on Management Information Systems (TMIS) 6.4, 2016, p13. http://bit.ly/2KgAmTW 2 Sculley, D., et al. 「Hidden Technical Debt in Machine Learning Systems」. Advances in Neural Information Processing Systems. 2015. https://bit.ly/1SJpStO

120 1부 머신러닝 실무 노하우


Part

II

머신러닝 실무 프로젝트

2부는 실습과 함께 하는 사례 연구들로 구성했다. 1부에서 설명한 내용을 포함하여, 독자 여러분이 실제 문제 를 해결하는 데 유용한 지식을 전달하는 것이 목표다. 1부에서 배운 것을 떠올리며 읽으면 도움이 될 것이다.


Part II

머신러닝 실무 프로젝트

7장

프로젝트 1: 영화 추천 시스템 만들기

8장 프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지 9장

프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기


CHAPTER

7

프로젝트 1: 영화 추천 시스템 만들기

이번 장에서는 영화 데이터로 추천 시스템을 만들어보면서 추천이란 무엇인지, 추천 시스템을 어떻게 설계하는지를 배워볼 것이다.

7.1 시나리오 영화 추천 시스템을 만들기 위해 무비렌즈MovieLens1라는 영화 평점 데이터를 사용해서 사용자가 매기는 별점 수를 예측해보자. 영화 추천 분야에서는 2006년에 개최된 넷플릭스 프라이즈Netflix Prize 경진대회가 가장 유명하 다. 매우 큰 규모의 영화 평점 데이터를 갖추고, 당시 넷플릭스에서 사용하던 추천 시스템의 정 확도를 10% 이상 향상시킨 참가자에게 상금을 주는 대회였다. 무비렌즈는 미네소타 대학교 그 룹렌즈GroupLens 연구소에서 넷플릭스와 비슷한 정보를 연구용으로 공개한 것이다. 먼저 추천 알고리즘, 데이터 입수 방법, 평가 척도를 알아본 다음 어떤 사용자가 아직 시청하지 않은 영화에 내릴 평점을 예측해볼 것이다. 이번에 사용할 알고리즘의 제약 때문에 예측 결과 를 DB에 저장하고 웹 애플리케이션에서 이 결과를 참조하도록 구성할 것이다.

1 https://movielens.org/

7장 프로젝트 1: 영화 추천 시스템 만들기 143


7.1.1 추천 시스템이란 추천 시스템의 역할은 무엇일까? 추천이라고 하면 아마존 같은 전자상거래 사이트에서 흔히 볼 수 있는 ‘이 상품을 구매한 고객이 구매한 다른 상품’ 같은 것이 떠오를 것이다. 또 5단계의 별점에 따라 음악을 추천해주는 음악 앱도 있다. 추천 시스템의 목적은 어떤 사용자 행동이나 아이템에 대한 정보로부터 사용자가 선호할 만한 관련 아이템을 제시하는 것이다. 규모가 어느 정도 되는 동영상이나 음악 스트리밍 서비스 혹은 품목이 매우 많은 쇼핑몰에서는 검색만으로 는 사용자가 원하는 콘텐츠를 찾기가 어렵다. 그래서 추천을 활용하여 자신이 선호하는 콘텐츠 를 발견할 수 있도록 사용자를 돕고 있다.2 특히, 미처 깨닫지 못했지만 자신의 취향인 콘텐츠 를 발견하는 의외성도 이미 원하는 결과가 정해져 있는 능동적 행위인 검색보다 나은 점이다. 한편, 서비스 제공자 입장에서도 좋은 추천 시스템은 상품 구매 전환율을 높이거나 활성 사용 자 수를 늘리는 기회가 된다. 다음 절부터는 추천 시스템의 구조를 학술적으로 정리한 「추천 시스템 알고리즘」3을 참고하면 서 추천 시스템의 특성을 정리해보겠다.

7.1.2 응용 분야 『Applications of Data Mining to Electronic Commerce』(Springer, 2001 )는 전자상거 래에 쓰이는 추천 시스템의 응용 유형을 그 목적에 따라 다음의 다섯 가지로 정리하였다. 이 목 적들은 서비스를 만들 때도 참고가 되므로 여기서 소개하기로 한다. ●●

개요 추천

●●

사용자 평가

●●

알림 서비스

●●

연관 아이템 추천

●●

개인화

개요 추천broad recommendation lists은 ‘이번 주의 인기 상품’처럼 통계를 활용하거나 편집자가 선택한

아이템을 추천하는 것처럼 개인화되지 않은 추천이다. 시스템을 처음 이용하거나 가끔 이용하 2 넷플릭스는 “모든 것이 추천이다(Everything is a Recommendation)”라는 슬로건을 내걸 정도로 추천 기능을 필수불가결하다고 여 긴다. https://medium.com/netflixtechblog/55838468f429 3 http://www.kamishima.net/archive/recsysdoc.pdf

144 2부 머신러닝 실무 프로젝트


는 사용자에게 효과가 있다. 사용자 평가 user comments and ratings는 다른 사용자가 준 별점이나 댓글을 보여주거나 평균 평점 같은

통계정보를 제공한다. 딱히 추천 같은 느낌은 들지 않지만, 다른 사람이 남긴 정보로부터 판단 근거를 얻을 수 있다. 다른 사람의 추천은 그 아이템을 신뢰할 수 있는 하나의 근거가 되므로 사용자가 스스로 납득할 수 있는 선택을 하게 된다. 알림 서비스notification services는 푸시 알림이나 이메일로 사용자가 흥미를 느낄 만한 아이템을 추천

하여 사이트에 재방문하도록 유도한다. 요즘에는 당연한 것이라 하겠지만, 이 역시 추천 시스 템의 응용 분야다. 연관 아이템 추천item-associated recommendations은 원래 아이템과 함께 연관된 아이템이나 그 정보를 제

시하여 동시 구매를 유도하거나 다른 아이템과 비교할 수 있게 한다. 아마존 같은 전자상거래 사이트에서는 정석 중의 정석이라 할 수 있는 방법이다. 개인화 deep personalization는 인기 아이템 목록이나 편집자 추천 목록 등 사용자가 흥미를 느낄 만한

아이템을 노출하여 해당 사용자가 마음에 드는 아이템을 찾도록 돕는다. 검색 결과를 개인별로 사용자화하는 방법도 여기에 속한다.

7.2 추천 시스템 제대로 알기 이번 절은 추천 시스템에 맞는 데이터 설계와 데이터 입수 방법, 알고리즘, 평가 척도 등을 소 개한다.

7.2.1 데이터 설계와 데이터 입수 추천 시스템의 입력 데이터로 다음과 같은 것들을 자주 사용한다. ●●

선호 데이터

●●

검색 쿼리

●●

비평

●●

아이템 특징

7장 프로젝트 1: 영화 추천 시스템 만들기 145


●●

인구적 특징

●●

맥락적 특징

선호 데이터preference data는 사용자가 아이템을 얼마나 선호하는지를 나타내는 데이터다. 검색 쿼 리query는 예를 들어 식당을 검색할 때 사용하는 ‘50,000원 이하 한식집’ 같은 검색어 정보이고, 비평critique은 상품이나 업체에 대한 댓글평 등을 가리킨다. 아이템 특징item feature은 상품 설명에 쓰

인 단어 등에 대한 정보고, 인구적 특징demographic feature은 사용자의 성별이나 연령 같은 정보, 맥락 적 특징context feature은 추천받은 아이템을 사용한 날짜나 위치 정보 혹은 재고 현황처럼 추천과 관

련된 맥락적 정보를 뜻한다. 추천 시스템이 어려운 이유로 데이터가 매우 희소sparse하다는 점을 들 수 있다. 예를 들어 사람 마다 지금까지 본 영화가 다르다. 그러므로 인기 영화는 평가 정보가 많이 모이지만, 그렇지 못 한 영화는 정보가 쌓이지 않아 추천도 되지 못 하는 일이 잦다. 또, 쏟아져 나오는 수많은 영화 중 한 사용자가 평생 볼 수 있는 영화는 얼마 되지 않으므로 데이터 자체가 없는 영화도 많을 것이다. 이 때문에 평가 정보가 일부 아이템에만 몰려서 평점 행렬의 요소 대부분이 값을 갖지 못한다. 여기서 평점 행렬이란 [표 7-1]과 같이 각 사용자가 각 아이템에 준 평점을 기재한 표 를 말한다. 표 7-1 영화에 대한 평점 행렬의 예 영화 A

영화 B

영화 C

사용자 1

5

2

사용자 2

4

1

사용자 3

4

5

추천 시스템은 선호 데이터 같은 평가 정보를 그대로 정답 데이터로 사용할 수 있다. 정답 데이 터를 충분히 확보하는 일은 매우 중요하므로 되도록 이런 정보를 많이 모을 수 있는 수단이 필 요하다. 그 수단으로는 사용자가 아이템을 평가하는 데 드는 비용을 낮춰주거나 사용자 평가 개수가 적어도 문제가 없도록 하는 방법이 있다. 예를 들어 음악 한 곡의 길이는 몇 분 정도이 므로 사용자 한 명이 여러 곡을 평가하는 비용은 그리 크지 않을 것이다. 이렇듯 아이템 평가 비용이 낮을 때는 선호 데이터를 쉽게 입수할 수 있다. 이에 비해 예식장 예약이나 주택 구입처 럼 일생에 몇 번 일어나지 않는 이벤트는 평가 비용이 크기 때문에 선호 데이터를 대량으로 얻 기가 어렵다. 그래서 예식장 웹 사이트의 페이지 뷰 같은 간접적인 지표로 부족한 선호 데이터

146 2부 머신러닝 실무 프로젝트


를 보충해야 한다. 선호 데이터를 얻는 방법은 추천 시스템을 구축할 때 매우 중요하므로, 데이터 입수 방법에 관 해서도 더 자세히 다뤄보고자 한다.

7.2.2 명시적 데이터와 묵시적 데이터 선호 데이터를 수집하는 방법은 크게 두 가지로 나뉜다. 첫 번째는 사용자에게 직접 선호도나 관심도를 물어 답변을 받는 명시적 데이터explicit data를 수집하는 방법이다. 다른 한 가지는 사용자 가 상품을 구매하거나 상품 정보를 열람하는 등 아이템에 흥미가 있다고 해석할 수 있는 묵시적 데이터implicit data를 모으는 방법이다. [표 7-2]에 이 두 방법의 장단점을 정리하였다. 표 7-2 선호 데이터 입수 방법의 장단점 종류

명시적

묵시적

데이터양

X

O

데이터의 정확성

O

X

미평가와 부정적 평가 구별

O

X

사용자의 인지

O

X

먼저, 양적인 면에서는 묵시적 데이터가 압도적으로 많다. 데이터양이 많을수록 통계적 방법을 사용하기 유리하며, 이를 이용해 구축한 모델도 더 높은 성능을 기대할 수 있다. 또, 참여자에 게 제공할 보상이 마탕치 않은 경우가 많아서 명시적 데이터를 많이 수집하기란 쉽지 않다. 데이터의 정확성 관점에서 보면 명시적 데이터는 사용자가 직접 자신의 의사를 표명한 것이므 로 정확도가 높다. 묵시적 데이터, 예를 들어 페이지 열람 정보는 사용자가 잘못 클릭한 경우도 긍정 평가로 취급되는 식이라 정확도가 떨어질 수 있다. 그러므로 묵시적 데이터의 품질을 확 보하려면 페이지 체류 시간 같은 정보로 필터링하는 등의 전처리가 필요하다. 평가하지 않은 것과 부정 평가를 구분할 수 없다는 것도 묵시적 데이터의 약점이다. 묵시적 데 이터에서는 비선호에 해당하는 평가를 얻을 수 없다. 어떤 영화의 정보를 열람한 행위는 긍정 평가로 해석할 수 있지만, 열람하지 않은 것은 평가하지 않은 것인지 아니면 부정적으로 평가 한 것인지 구분할 수 없기 때문이다. 때에 따라서는 아직 보지 않은 ‘선호하는’ 영화를 시스템이 비선호로 판정하는 일도 일어날 수 있다.

7장 프로젝트 1: 영화 추천 시스템 만들기 147


사용자 인지란 데이터를 수집한다는 사실을 사용자에게 명확히 알려서 시스템에 어떤 정보를 제공했는지를 사용자가 이해하고 있는가를 말한다. 예를 들어, 음악 앱을 처음 실행할 때 좋아 하는 아티스트와 장르를 물어본 다음 ‘이 아티스트와 연관된 곡’을 시스템이 추천했다고 하자. 그렇다면 사용자는 시스템이 근거 있는 결과를 내놓는다고 생각하게 된다는 점에서 좋은 인상 을 받을 수 있다.

7.2.3 추천 시스템의 알고리즘 추천 시스템의 알고리즘은 크게 두 가지로 나눌 수 있다. 첫째는 우리가 영화 취향이 비슷한 사 람에게 추천 영화를 묻듯이 평가 경향이 비슷한 사람을 찾거나 비슷한 평가를 받은 영화를 찾 는 식의 협업 필터링collaborative filtering이고, 둘째는 감독, 장르, 제목에 포함된 단어나 내용이 비슷 한 영화를 찾는 식의 내용 기반 필터링content-based filtering이다. 협업 필터링에는 다시, 비슷한 사람을 찾는 사용자 기반 협업 필터링user-based collaborative filtering과 비 슷한 아이템을 찾는 아이템 기반 협업 필터링item based collaborative filtering이 있다. 이들 기법은 시스템 이 갖고 있는 데이터에 기초해 직접 가까운 사용자/아이템을 추천하므로 메모리 기반 협업 필터 링memory-based collaborative filtering의 일종이라 볼 수 있다.

메모리 기반 외의 접근법으로 회귀나 분류 같은 예측 모델을 학습하는 모델 기반 협업 필터링model도 있다.

based collaborative filtering

그럼, 각각의 알고리즘을 자세히 알아보도록 하자.

7.2.4 사용자 기반 협업 필터링 사용자 기반 협업 필터링은 ‘당신과 비슷한 상품을 산 고객은 이런 상품도 샀다’는 식의 추천을 제공하는 방법이다. 협업 필터링은 사용자와 아이템의 각 쌍에 대한 평점 행렬이 있을 때, 행렬의 누락된 요소에 해 당하는 평점을 예측한다. 사용자 기반 협업 필터링은 다음의 과정으로 이뤄진다. 1 사용자 정보를 벡터로 나타낸다. 2 사용자 간의 유사도를 평가한다.

148 2부 머신러닝 실무 프로젝트


CHAPTER

8

프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지

이번 장에서는 실제 데이터를 분석해보면서 데이터를 분석할 때 생각해야 할 점과 분석 결과로 어떤 내용의 보고서가 나오게 되는지 알아볼 것이다. 구체적으로는 킥스타터Kickstarter를 크롤링 한 데이터를 엑셀로 분석한 다음 상사에게 제출할 보고서 작성까지, 전체 실무 과정을 체험해 볼 것이다. 이 분석은 필자가 부분적으로 참여한 프로젝트에서 킥스타터를 이용한 자금 조달을 검토할 때 실제 로 수행한 내용이다. 킥스타터를 통한 자금 조달 계획은 결국 실행되지 않았지만, 킥스타터를 분석하는 과정 에서 몇 가지 흥미로운 사실을 발견했기에 여러분과 공유하려 한다.

이번 장의 코드는 https://github.com/oreilly-japan/ml-at-work/tree/master/chap08 에서 내려받을 수 있다. 옮긴이_ 이번 장의 목적은 데이터를 분석하는 과정의 ‘사고를 좇아보는’ 것이다. 그러한 이유로 예제의 데이 터 정제 및 세세한 엑셀 조작법은 언급하지 않고 있다. 크롤러를 사용하여 직접 데이터를 수집하고 따라 해보 며 읽어도 되지만, 엑셀에 매우 능숙한 사람이 아니면 그대로 수행하기가 쉽지 않을 것이다.

8장 프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지 171


8.1 킥스타터 API 찾아보기 먼저 킥스타터가 API를 제공하는지 찾아보자. “kickstarter api”를 키워드로(따옴표 포함) 구 글에서 검색해보면 “Does Kickstarter have a public API? - StackOverflow”1라는 문서 가 검색된다. 이 문서대로면, 킥스타터 검색 결과 페이지 URL에 “.json” 확장자를 붙여주면 검색 결과를 그 대로 JSON으로 반환하는 비공개 API가 있는 듯하다. 이번 분석에는 이 API를 사용하기로 하 겠다. ●●

https ://www.kickstarter.com/projects/search?term =3d+printer

●●

https ://www.kickstarter.com/projects/search.json?term =3d+printer

8.2 킥스타터 크롤러 만들기 이 API를 사용하는 실제 크롤러를 만들어보겠다. 그리고 이번 분석의 대상은 킥스타터의 ‘기 술Technology’ 분야로 제한한다. 단순히 필자가 기술 외 분야에는 도메인 지식이 없기 때문이다. 이 API에 문제가 있다면, 킥스타터 검색 결과를 요청 1회당 20건2만 반환한다는 점과 검색 결 과를 200페이지까지만 볼 수 있다는 점이다. 다시 말해 같은 검색 조건에서는 4,000건까지만 받을 수 있다. 이 문제를 피하기 위해 기술 분야(분야 ID 16 )의 하위 분야로 검색 범위를 좁히 기로 하겠다. 이 크롤러는 수집한 JSON 문서를 result 디렉터리에 저장한다. 이런 점 때문에 크롤러와 분 석 코드를 분리할 수 있으며, 실제 분석 과정은 로컬에서 이뤄져 데이터에 신속하게 접근할 수 있다. import urllib.request import json import os

1 http://stackoverflow.com/questions/12907133/does-kickstarter-have-a-public-api (

http://bit.ly/2vkz4E5)

2 이 분석을 한 2017년 3월 시점에서는 20건이었으나, 2017년 10월부터 12건으로 줄었다. 옮긴이_ 현재는 제공하는 필드도 훨씬 다양 하고 세분화되었다. 다행히 이번 장에서 사용하는 필드들은 모두 살아 있다.

172 2부 머신러닝 실무 프로젝트


import time os.makedirs('result', exist_ ok = True) search_ term = "" sort_ key = 'newest' category_ list = [16, 331, 332, 333, 334, 335, 336, 337, 52, 362, 338, 51, 339, 340, 341, 342] # 기술(technology) 분야 query_ base = "https://www.kickstarter.com/projects/search.json? term = %s&category_ id = %d&page = %d&sort = %s" for category_ id in category_ list: for page_ id in range(1, 201): try: query = query_ base % ( search_ term, category_ id, page_ id, sort_ key) print(query) data = urllib.request.urlopen(query).read().decode("utf- 8") response_ json = json.loads(data) except: break # 1페이지당 20건인 검색 결과를 하나씩 저장한다.

for project in response_ json["projects"]: filepath = "result/%d.json" % project["id"] fp = open(filepath, "w") fp.write(json.dumps(project, sort_ keys = True, indent = 2)) fp.close() # API 접근에 1초 간격을 두어 서비스에 부담을 주지 않도록 한다.

time.sleep(1)

크롤러를 실행하면 result 디렉터리에 JSON 파일이 저장되는 것을 볼 수 있다.3 다음 JSON 문서는 지면 관계상 필요한 요소만을 추린 것이다. { "backers_ count":0, "country":"GB",

3 옮긴이_ 결과를 다 받는 데 수십 분이 걸리니, 기다리기 지루하다면 깃허브 저장소에 올려놓은 chap08/kickstarter_result.zip 파일을 사용하자.

8장 프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지 173


"created_ at":1452453394, "currency":"GBP", "deadline":1457820238, "disable_ communication":true, "goal":30000.0, "id":1629226758, "launched_ at":1452636238, "name":"Ordering web page for small fast food businesses.", "pledged":0.0, "slug":"ordering- web- page- for- small- fast- food- businesses", "state":"suspended", "state_ changed_ at":1455831674, "static_ usd_ rate":1.45221346, "urls":{ "web":{ "project":"https://www.kickstarter.com/projects/189332819/ ordering- web- page- for- small- fast- food- businesses?ref = category_ newest", "rewards":"https://www.kickstarter.com/projects/189332819/ ordering- web- page- for- small- fast- food- businesses/rewards" } }, "usd_ pledged":"0.0" }

8.3 JSON 데이터를 CSV로 변환하기 JSON에서 드문드문 보이는 쓸만한 파라미터를 추출해보겠다. 파일 읽기에는 파이썬 표준 라 이브러리 중 glob을 사용한다. 와일드카드 문자(* )를 지정하면 디렉터리 안의 여러 파일을 목 록으로 얻어올 수 있다. 지금부터 진행할 분석은 엑셀을 이용하므로 엑셀에서 다루기 쉬운 CSV 포맷으로 변환할 것 이다. CSV 포맷 변환은 판다스 라이브러리의 pandas.io.json.json _ normalize ( json _

data ) 4 함수를 사용한다. 또한, 인코딩을 CP949 (윈도우의 EUC-KR )로 지정하고 Unix Timestamp 필드를 DateTime 포맷으로 변환하면 사람이 읽기에 더 매끄럽게 변환된다.

4 http://bit.ly/2EQoh44

174 2부 머신러닝 실무 프로젝트


import import import import

glob json pandas pandas.io.json

project_ list = [] # glob으로 result 디렉터리에 있는 파일을 읽는다.

for filename in glob.glob("result/*.json"): project = json.loads(open(filename).read()) project_ list.append(project) # json_ normalize 함수를 사용하여 DataFrame으로 변환한다.

df = pandas.io.json.json_ normalize(project_ list) # 값이 "_ at"으로 끝나는 unixtime 칼럼을 datetime으로 변환한다.

datetime_ columns = filter(lambda a: a[- 3:] = = "_ at", df.columns) for column in datetime_ columns: df[column] = pandas.to_ datetime(df[column], unit = 's') # DataFrame을 CSV 포맷 문자열로 변환한다.

csv_ data = df.to_ csv() # 엑셀에서 임포트하기 쉽도록 CP949로 변환한다.

csv_ data = csv_ data.encode("cp949", "ignore") # 변환한 결과를 파일에 쓴다.

fp = open("kickstarter_ result.csv", "wb") fp.write(csv_ data) fp.close()

8.4 엑셀로 데이터 훑어보기 그럼 추출한 데이터를 엑셀로 훑어보도록 하자. 산점도 행렬을 만들어 그래프의 대체적인 형 태를 살피는 방법도 있지만, 데이터가 가진 날것 그대로의 분위기를 느끼기 위해서라도 엑셀로 직접 열어보는 쪽을 추천한다(일부 데이터를 추출해서 보아도 무방하다). 데이터를 직접 보는 것은 분석 효율에 큰 영향을 준다. 머신러닝을 이용하더라도 데이터를 직

8장 프로젝트 2: 킥스타터 분석하기 - 머신러닝을 사용하지 않는 선택지 175


접 접해보지 않으면 결과에 이상이 있어도 눈치채기가 어려울 수 있다. 그러니 꼭 데이터를 직 접 살펴보도록 하자. 그림 8-1 원시 데이터 훑어보기

모금액(pledged )과 목표액(goal ) 정보를 이용해 모금 달성률( =pledged/goal ) 필드를 계 산해 넣고, 후원자 수( backers _ count )로부터 다시 1인당 후원액( = pledged/backers _

count )을 추가한다. 데이터 추출 단계에서 처리해도 무방한 내용이지만 필자는 엑셀에서 처 리했다. 우선 모금 달성률 순서로 정렬하여 그래프를 그려보기로 한다.

176 2부 머신러닝 실무 프로젝트


CHAPTER

9

프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기

이번 장에서는 업리프트 모델링Uplift modeling을 소개하고 직접 구현해볼 것이다. 업리프트 모델링이란 역학epidemiology 통계나 다이렉트 마케팅에서 쓰이는 머신러닝 기법이다. 이 기법은 무작위 대조시험의 결과를 분석하여 신약이 어떤 환자에게 효과가 있었는지 혹은 광 고 메일을 어떤 유형의 고객에게 보내야 효과가 있는지 등을 예측한다. 업리프트 모델링에서 말하는 업리프트uplift는 ‘들어 올리다’는 뜻이다.

‘6.4.3 무작위 대조시험’에서 설명했듯이 무작위 대조시험은 흔히 말하는 A/B 테스트를 의미 한다. 모집단을 무작위로 실험군과 대조군(혹은 통제군)으로 나누고, 실험군에는 효과를 검증 하려는 개입을 시행하고 대조군에는 아무 개입도 하지 않는다. 신약 개발을 예로 들자면 실험 군에는 신약을 투여하고 대조군에는 가짜 약을 투여한다. 웹 서비스라면 실험군에는 새로운 배 너 광고를 표출하고 대조군에는 기존 배너 광고를 그대로 표출하는 식이다. 일반적인 A/B 테스트는 단순하게 반응이 있었는지 여부만 확인하는 데 반해, 업리프트 모델링 은 실험군과 대조군에서 어떤 특징을 보이는 표본이 반응하거나 하지 않았는지를 확인한다는 점이 다르다. 이를 통해 어떤 표본이 실험에 어떻게 반응할지를 예측하게 된다. 이런 방법으로 효과가 있으리라 예상되는 대상에만 선별적으로 개입할 수 있다. 반대로 효과가 없을 것으로 예상되는 대상에는 개입하지 않을 수 있다. 다시 신약 개발을 예로 들어보면, 먼저 환자의 연령 및 성별, 유전자와 생활 습관 등을 특징으

9장 프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기 197


로 삼아 학습한다. 그런 다음 부작용이 예상되는 환자나 자연적으로 나을 환자는 제외하고, 신 약이 효과를 보이리라 예상되는 환자에게만 투약할 수 있다는 말이 된다. 이를 통해 개인화된 의료 외에도 의료 자원을 효율적으로 이용하는 결과도 기대할 수 있다. 업리프트 모델링과 활용 사례를 더 자세히 알고 싶다면 ​『예측 분석이다』(이지스퍼블리싱,

2014 )의 7장과 그 참고문헌을 참고하기 바란다.

9.1 업리프트 모델링의 사분면 업리프트 모델링은 개입 유무와 행동 전환 conversion (CV )을 기준으로 대상을 4개 범주로 나눈 다. 여기서 개입 결과는 편의상 전환함과 전환하지 않음으로 나눈 이진 값을 취한다. 표 9-1 업리프트 모델링의 사분면 개입 안 함

개입함

범주

대응 방안

전환하지 않음

전환하지 않음

무관심

비용이 드는 개입은 자제한다.

전환하지 않음

전환함

설득 가능

가능한 한 개입 대상에 포함시킨다.

전환함

전환하지 않음

청개구리

개입 대상에 절대 포함시키지 않는다.

전환함

전환함

잡은 물고기

비용이 드는 개입은 자제한다.

무관심Do Not Disturbs 혹은 Sleeping Dogs은 개입 유무와 상관없이 전환하지 않는 부류다. 예를 들어 과

거 3년간 구매기록이 없는 고객은 광고 메일을 보내봤자 구매로 이어지지 않을 가능성이 높다. 그러므로 이런 고객은 휴면 고객으로 분류하여 광고 대상에서 제외하는 편이 비용을 아낄 수 있다. 설득 가능 Persuadables은 개입이 첫 전환을 이끌어내는 부류다. 업리프트 모델링을 통해 찾아내려

는 부류이기도 하다. 예를 들어 ‘여러 번 방문했지만 다른 곳과 가격을 비교하며 결정을 못 내 린’ 고객이라면 할인 쿠폰을 발급하여 구매로 이어지도록 할 수 있다. 청개구리Lost Causes는 그냥 내버려 두었으면 전환했을 것이나 개입을 하면 전환하지 않게 되는 부

류다. 상점에 들어섰다가도 점원이 접근하면 나가는 손님이나 대출 상환 현황을 안내하는 연락 을 취했더니 조기 상환하는 대출 고객 등이 이런 부류에 해당한다.1 이런 유형의 고객에게 판촉 1 은행의 주 수입원은 이자이므로 대출금을 조기 상환하면 수익이 줄어든다.

198 2부 머신러닝 실무 프로젝트


활동을 시도하면 오히려 매출이 줄어들게 된다. 잡은 물고기Sure Things는 개입 유무와 상관없이 전환하는 부류다. 이미 계산대 앞에 선 고객이라면

할인 쿠폰을 제시하지 않아도 어차피 구매할 것이므로 개입이 매출 증가로 이어지지 않는다. 증가는커녕 할인분 만큼 감소하게 될 것이다. 개입하면 거의 다 반응할 것이므로 개입의 효과 를 실제보다 높아 보이게 하므로 KPI 수치를 높이고자 개입 대상에 포함시키는 경우가 있으나, 개입에 비용이 드는 경우라면 자제하여야 한다.2

9.2 A/B 테스트를 확장한 업리프트 모델링 그럼 배너 광고 A/B 테스트를 사례로 A/B 테스트를 업리프트 모델링으로 확장하는 방법으로 알아보겠다. 웹 사이트 배너 광고 A/B 테스트에서 광고 A와 B의 반응률은 각각 4.0%와 5.0%였다고 가정 한다. 일반적인 A/B 테스트였다면 광고 B를 선택하는 선에서 끝났을 것이다. 표 9-2 A/B 테스트의 결과 내용

배너 광고 A

배너 광고 B

반응률

4.0%

5.0%

그러나 업리프트 모델링에서는 각 고객의 특징을 추가로 고려해야 한다. 이 예제에서는 고객의 성별을 기준으로 A/B 테스트 결과를 확장해보도록 하겠다. 편의상 고객의 남녀 비율은 1:1이 라고 가정한다. 표 9-3 성별 기준으로 A/B 테스트 확장하기 반응률

배너 광고 A

배너 광고 B

남성

6.0%

2.0%

여성

2.0%

8.0%

평균

4.0%

5.0%

2 잡은 물고기 범주의 고객에게 광고를 표출하지 않는 것도 마케팅 부서의 업무다. 광고 반응률이 높다고 해서 리타기팅 광고를 남발하면 잡 은 물고기 범주에 광고를 집행하는 것과 다를 바 없다.

9장 프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기 199


성별을 기준으로 나눠보니 남성은 광고 A에, 여성은 광고 B에 높게 반응했다. 따라서 남성 고 객에게 광고 A를, 여성 고객에게 광고 B를 구분해 표출하는 것만으로도 평균 반응률이 7.0% 가 되므로 A/B 테스트를 사용한 것보다 더 높은 반응률을 이끌어낼 수 있다. 분류 기준이 성별처럼 간단한 척도라면 사람이 직접 분석할 수도 있다. 그러나 특징의 가짓수 가 많아지면 어떤 배너 광고가 더 효과적이었는가를 사람이 직접 판단하기는 어렵다. 바로 이 럴 때 머신러닝을 활용하게 된다.

9.3 업리프트 모델링에 사용할 데이터셋 만들기 업리프트 모델링에는 기준이 될 만한 공개 데이터셋이 없다. 그러므로 이번에는 직접 데이터셋 을 만드는 과정부터 시작하기로 한다. 이번처럼 새로운 알고리듬을 구현할 때 아직 성질을 파 악하지 못한 데이터셋을 사용하면, 예상 못한 결과를 얻어도 그 원인이 알고리듬의 오류 때문 인지 데이터셋의 성질 때문인지 알기가 어렵기 때문이다. 업리프트 모델링을 하려면 실험군과 대조군 두 그룹의 표본이 필요하다. 여기서는 표본 크기와 무작위 시드를 부여하여 전환 여부(is _cv _list ), 실험군 포함 여부(is _treat _list ), 8차원으 로 된 특징(feature _vector _list )을 반환하는 함수를 만들어볼 것이다. 이 함수는 어떤 특징이 전환에 얼마나 영향을 주는지에 대한 가중치를 내부에 갖고 있으며, 이 가중치에 따라 각 특징의 값이 전환 여부에 영향을 주게 된다. base _weight는 대조군에 대한 가중치, lift _weight는 개입에 의한 전환의 가중치다. 그리고 이 코드는 lift _weight의 합이 0이 되도록 하여 실험군과 대조군의 전환율conversion rate이 거의 비슷해지도록 만들었다. 다시 말해, 조치가 한 쪽 그룹의 고객들에서 전환율을 개선하면 다른 그룹에서는 악화되어 전체적으로는 개선되지 않도록 하는 시나리오다. import random def generate_ sample_ data(num, seed = 1): # 반환할 리스트 초기화

is_ cv_ list = [] is_ treat_ list = []

200 2부 머신러닝 실무 프로젝트


feature_ vector_ list = [] # 난수 생성기 초기화

random_ instance = random.Random(seed) # 데이터의 설정값

feature_ num = 8 base_ weight = \ [0.02, 0.03, 0.05, - 0.04, 0.00, 0.00, 0.00, 0.00] lift_ weight = \ [0.00, 0.00, 0.00, 0.05, - 0.05, 0.00, 0.00, 0.00] for i in range(num): # 난수로 특징 벡터 생성

feature_ vector = \ [random_ instance.random() for n in range(feature_ num)] # 실험군 여부를 무작위로 결정

is_ treat = random_ instance.choice((True, False)) # 전환율 계산

cv_ rate = \ sum([feature_ vector[n] * base_ weight[n] for n in range(feature_ num)]) if is_ treat: # 실험군에 속하면 lift_ weight의 영향을 추가

cv_ rate + = \ sum([feature_ vector[n] * lift_ weight[n] for n in range(feature_ num)]) # 실제 전환 여부 결정

is_ cv = cv_ rate > random_ instance.random() # 생성된 값 저장

is_ cv_ list.append(is_ cv) is_ treat_ list.append(is_ treat) feature_ vector_ list.append(feature_ vector) # 생성한 데이터 반환

return is_ cv_ list, is_ treat_ list, feature_ vector_ list

이 함수는 데이터를 만들기 위해 먼저 0과 1로 구성된 8차원 특징 벡터(feature _vector )를 만든다. 그 다음 실험군과 대조군을 무작위로 정하고(is _treat ), 그 값에 따라 함수 안에서만

9장 프로젝트 3: 업리프트 모델링으로 마케팅 효율 높이기 201


INDEX

A A/A 테스트  138 A/B 테스트  37, 88, 136 accuracy  80, 154 activation function  53 adjusted cosine similarity  151 ALS  161 alternated least squared  161 anomaly detection  76 Area Under the Uplift Curve  207 ARIMA  77 association rule  77 ATE  133 AUC  85

collaborative filtering  148 confusion matrix  82 content - based filtering  148 context - aware recommendation  169 control group  132, 197 conversion  198 conversion rate  200 cosine similarity  149 coverage  154 cross - entropy error function  55 cross validation  34 crowd sourcing  114 CV  198

D

AUUC  207 average treatment effect  133

data leakage  33 decision boundary  46

B backpropagation  65 batch  92 batch learning  31 Bonferroni correction  131 broad recommendation lists  144

C categorical variable  31 cause  132 chi - squared test  125 class  32 classification  45 clustering  74 coefficient of determination  87

222 찾아보기

decision tree  68 deep personalization  145 development data  34 dimension reduction  75 diversity  154 Do Not Disturbs  198 dummy variable  31

E ensemble learning  72 error function  51 Euclidean distance  67 exclusive or  48 explicit data  147


F factorization machine  160 false negative  82, 126 false positive  126 FDR  131

impurity  70 information gain  70 item - associated recommendations  145 item based collaborative filtering  148

J

feature  31 feature engineering  103

Jaccard index  150

F - measure  81

Jaccard similarity coefficient  150

frequent pattern mining  77 FWER  131 F - 점수  81

K kernel  59 Kickstarter  171

G

k - nearest neighbor  65

GBDT  70

k - NN  65

generalization  33

KPI  26

Gini coefficient  70

k - 최근접 이웃  65

gold standard  35

k - 평균  74

gradient boosted decision tree  70 gradient boosting  71

L LASSO regression  73

H

latent Dirichlet allocation  152

hidden Markov model  46

LDA  152

hierarchical clustering  74

learning curve  35

hinge loss  51

learning rate  52

HMM  46

learn to rank  154

hyper - parameter  34

linear kernel  62

hyperplane  47

linearly separable  47

hypothesis testing  121

linear regression  72 logistic regression  54

I imbalanced data  76 implicit data  147

logistic sigmoid function  55 loss function  51 Lost Causes  198

찾아보기

223


INDEX

M macro - average  85 MAE  154 Mahalanobis distance  67 Markov chain Monte Carlo  161 matrix decomposition  153 matrix factorization  153 MCMC  161 mean absolute error  154

PLSA  152 polynomial kernel  62 polynomial regression  72 power  126 precision  80, 154 principal component analysis  75 probabilistic latent semantic analysis  152 p - 값  122

R

memory - based collaborative filtering  148 micro - average  84

radial basis function kernel  62

model - based collaborative filtering  148

random forest  70

MovieLens  143

randomized controlled trial  134

multiple testing  130

Randomized Controlled Trial  197 rank correlation  154

N Naive Bayes  46 neural network  63 notification services  145

O

RBF 커널  62 RCM  133 RCT  134 recall  80, 154 recommendation  76 regression tree  73 regularization  35, 57

objective function  52

regularization term  55

online learning  31

reinforcement learning  25, 77

outcome  132

ReLU 함수  65

outlier detection  76

ridge regression  73

overfitting  33, 47

RMSE  86, 154 ROC 곡선  85

P PCA  75 Pearson product - moment correlation coefficient  149

root mean squared error  86, 154 Rubin Causal Model  133

S

perceptron  46

selection bias  134

Persuadables  198

semi - supervised learning  111

224 찾아보기


SGD  161 sigmoid function  55 Sleeping Dogs  198 standardization  167 step function  53 stochastic gradient descent  52 supervised learning  23 support vector machine  59 support vector regression  73 Sure Things  199 SVM  59 SVR  73

ㄱ 가설 검정  121 강화 학습  25, 77 개발 데이터  34 개선된 코사인 유사도  151 개요 추천  144 개인화  145 개입  132 거짓 양성  126 거짓 음성  82, 126 검정력  126 검증 데이터  34 결과변수  132

T

결정 경계  46

test data  34

결정 계수  87

topic model  152

결정 트리  68

training data  34

경사 부스팅  71

transfer learning  112

경사 부스팅 결정 트리  70

treatment group  132, 197

경제 효과  119

true positive  82

계단 함수  53

t - SNE  75

계층적 군집화  74 고빈도 패턴 마이닝  77

U

공개된 데이터셋  111

underfitting  47

과소적합  47

unsupervised learning  24

과적합  33, 47

Uplift modeling  197

과적합 방지  34

user - based collaborative filtering  148

교대 최소제곱법  161

user comments and ratings  145

교차검증  34 교차 엔트로피 오차 함수  55

V

X

군집화  43, 74 규제항  55

validation data  34

규제화  35, 57, 58

XOR  48

찾아보기

225


INDEX

ㄴ 나이브 베이즈  46 내용 기반 필터링  148, 153

매크로 평균  85 머신러닝 문제 대처 방법  36 머신러닝 알고리즘 선택  43 머신러닝 통합  91 메모리 기반 협업 필터링  148 명시적 데이터  147

다양성  154

모델 기반 협업 필터링  148, 152

다중 검정  130

모델 버전관리  37

다항식 커널  62 다항식 회귀  72 대조군  132, 197 더미 변수  31 데이터 유출  33 데이터 전처리  32 데이터 처리 파이프라인 저장  38 동적 기저함수 커널  62

ㄹ 라쏘 회귀  73 랜덤 포레스트  70 랭킹 학습  154 로그를 경유한 부작용  120 로그 설계  103 로그 저장  104

목적 함수  52 무관심  198 무비렌즈  143 무비렌즈 데이터 분석  155 무작위 대조시험  134, 197 묵시적 데이터  147 문제 정의  26

ㅂ 반지도 학습  111 배치  92 배치 처리  92 배치 학습  47 배타적 논리합  48 범주형 변수  31

로지스틱 시그모이드 함수  55

본페로니 교정  131

로지스틱 회귀  54

분류  43, 45

루빈 인과모형  133

분류 모델 비교  85

릿지 회귀  73

불균형 데이터  76 불순도  70

ㅁ 마르코프 연쇄 몬테카를로  161 마이크로 평균  84

비지도 학습  24

마진 최대화  59, 62

사용자 기반 협업 필터링  148

마할라노비스 거리  67

사용자 정보  103

226 찾아보기


사용자 평가  145

영화 추천 시스템  143

사용자 행동 로그  104

예측 단계  24

사이킷런  40

예측 성능 모니터링  37

상황인지 추천  169

오차 함수  51

서포트 벡터 머신  59

온라인 학습  47

선택 편향  134

유클리드 거리  67

선형 분리 가능  47

은닉 마르코프 모델  46

선형 커널  62

이상값 탐지  76

선형 회귀  72

이상 탐지  76

설득 가능  198

인과효과 추정  132

소셜 게임 분석  195

인수분해 머신  160

손실 함수  51

일괄 학습  92

순위 상관  154

일래스틱넷  73

순차 학습  93

일반화  33

시그모이드 함수  55 시스템 구성 패턴  101 시스템 설계  29, 92 신경망  63 실시간 처리  92 실험군  132, 197

ㅈ 자기회귀 이동평균 모델  77 자카드 계수  150 잠재 디리클레 할당  152 잠재적 결과변수  133 잡은 물고기  199

재현율  80, 154

아이템 기반 협업 필터링  148, 151

전이 학습  112

알고리즘 선택  31

전환  198

알림 서비스  145

전환율  200

앙상블 학습  72

정답 데이터  32

언어 및 프레임워크 일치  39

정밀도  80, 154

업리프트 모델링  197

정보 획득  70

업리프트 모델링 점수  205

정확도  80, 154

업리프트 모델링 평가  207

주성분 분석  75

역전파  65

지니 계수  70

연관 법칙  77

지도 학습  23

연관 아이템 추천  145

진짜 양성  82

찾아보기

227


INDEX

평균절대오차  154 평균제곱근오차  86, 154

차원 축소  43, 75 청개구리  198 초평면  47

평균처치효과  133 표준화  167 피어슨 상관계수  149

추천  76 추천 시스템  144 추천 시스템 구현  160

ㅎ 하이퍼파라미터  34

학습  33 학습곡선  35

카이제곱 검정  125 커널  59, 62 커버리지  154 코사인 유사도  149 콘텐츠 정보  103 콜드 스타트 문제  154 크라우드소싱  114 클래스  32 킥스타터  171 킥스타터 API  172 킥스타터 크롤러  172

학습 단계  24 학습 데이터 수집  109 학습률  52 핵심성과지표  26 행렬 분해  153 행렬 인수분해  153 협업 필터링  148 혼동행렬  82 확률적 경사하강법  52, 161 확률적 잠재 의미 분석  152 활성화 함수  53 황금기준  35

회귀  43, 72

테스트 데이터  34

회귀 트리  73

토픽 모델  152

효과 검증  117

통제군  132, 197

훈련 데이터  34

특징  31

힌지 손실  51

특징 공학  103

ㅍ 파라미터 튜닝  33 패턴 마이닝  77 퍼셉트론  46 평가 척도  154

228 찾아보기



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.