Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기

샌디 라이자, 유리 레이저슨, 션 오언, 조시 윌스 지음 | 박상은, 권한철, 서양주 옮김 | 한빛미디어 | 2016년 07월 | 26,000원
예스24 링크: http://www.yes24.com/24/goods/29081416

★ 스파크 실전편! 실무와 가장 가까운 경험을 제공한다.
이 책은 기능과 API를 단조롭게 나열하지 않는다. 현실과 동떨어진, 예제를 위한 예제를 따라 하지도 않는다. 대신 우리 주변에서 찾을 수 있고 우리 삶과 밀접한 실제 데이터를 가져와 함께 분석하고 다듬어본다. 그것도 하나가 아니라 9가지다. 음악 추천부터 이상 감지, 교통, 금융, 영상 데이터 등. 관심 가는 장을 먼저 봐도 좋고, 차례대로 천천히 따라 해봐도 좋다. 그럼 가장 진보한 분석 도구인 스파크로 다 함께 데이터의 바다를 항해해보자!

★ 현실 세계 데이터셋과 스파크의 만남
1. 오디오스크로블러(AudioScrobbler) 데이터셋으로 음악 추천하기
2. 의사 결정 나무로 산림 식생 분포 예측하기
3. K 평균 군집화로 네트워크 이상 감지하기
4. 숨은 의미 분석으로 위키백과 이해하기
5. 그래프엑스(GraphX)로 동시발생 네트워크 분석하기
6. 뉴욕 택시 운행 데이터로 위치 및 시간 데이터 분석하기
7. 몬테카를로 시뮬레이션으로 금융 리스크 추정하기
8. BDG 프로젝트와 유전체학 데이터 분석하기
9. 파이스파크(PySpark)와 썬더(Thunder)로 신경 영상 데이터 분석하기

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Login to see the comments

『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기

  1. 1. 9가지 사례로 익히는 고급 스파크 분석 : 현실 세계 빅데이터로 배우는 가장 실용적인 스파크 활용서 초판발행 2016년 7월 1일 지은이 샌디 라이자, 유리 레이저슨, 션 오언, 조시 윌스 / 옮긴이 박상은, 권한철, 서양주 / 펴낸이 김태헌 펴낸곳 한빛미디어(주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부 전화 02–325–5544 / 팩스 02–336–7124 등록 1999년 6월 24일 제10–1779호 / ISBN 978–89–6848–289–2 93000 총괄 전태호 / 책임편집 김창수 / 기획・편집 이복연 디자인 표지・내지 여동일, 조판 백지선 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 송경석, 변지영 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr 2016 HANBIT Media Inc. Authorized Korean translation of the English edition of Advanced Analytics with Spark, ISBN 9781491912768 2015 Sandy Ryza, Uri Laserson, Sean Owen, and Josh Wills This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. 이 책의 저작권은 오라일리와 한빛미디어(주)에 있습니다. 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일(writer@hanbit.co.kr)로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다. 표지 동물은 송골매다. 이 매는 세상에서 가장 흔한 맹금류 중 하나로 남극을 제외한 모든 대륙에 서식한다. 또한, 도시, 열대 지역, 사막, 툰드라 등 다양한 환경에서 생존할 수 있다. 일부는 겨울과 여름 서식지 간 의 머나먼 여행을 한다. 송골매는 세상에서 가장 빨리 나는 새로, 시속 약 320km로 급강하할 수 있다. 참새나 오리와 같은 다른 새와 박쥐를 먹이로 하는데, 공중에서도 먹이를 낚아챌 수 있다. 다 자란 송골매의 날개는 푸른 잿빛을, 등은 어두운 갈색을 띠며, 담황색 배에는 갈색 점이, 하얀 얼굴에는 검은색 눈물점이 있다. 그리고 갈고리 모양의 부리와 강 한 발톱도 있다. 송골매의 영어 이름인 peregrine falcon은 라틴어의 peregrinus에서 온 말인데, 그 뜻은 방랑자다. 송골매는 매조련사들 의 사랑을 받아왔으며, 여러 세기에 걸쳐 사냥에 동원되었다. 오라일리 책의 표지에 등장하는 동물 중 상당수는 멸종 위기에 처해 있다. 이들 모두가 우리 세상에 소중한 존재다. 이 동 물들을 돕고 싶다면 animals.oreilly.com으로 가보자. 표지 그림은 라이데커의 『Royal Natural History』에서 가져왔다. | 표지 설명 |
  2. 2. 9가지 사례로 익히는 고급 스파크 분석
  3. 3. 4 샌디 라이자 Sandy Ryza 클라우데라의 선임 데이터 과학자이자 아파치 스파크 프로젝트의 활동적인 컨트리뷰터다. 최근에 클라우데라에서 스파크 개발을 이끌었으며 지금은 고객들이 스파크를 사용해 다양한 형태의 분석을 구현하는 데 도움을 주고 있다. 또한 하둡 프로젝트의 관리 위원회 멤버이기도 하다. 유리 레이저슨 Uri Laserson 클라우데라의 선임 데이터 과학자이며, 하둡 생태계에서의 파이썬 활용에 주력하고 있다. 또한 고 객들이 다양한 문제에 하둡을 사용할 수 있도록 지원하고 있는데, 특히 생명 과학과 헬스 케어에 집 중하고 있다. 이전에는 MIT에서 생의공학biomedical engineering 박사 과정 중에 Good Start Genetics 라는 차세대 검진 회사를 공동 창업했다. 션 오언 Sean Owen 클라우데라의 유럽/중동/아프리카 대상 데이터 과학팀의 디렉터다. 아파치 머하웃Apache Mahout 기계 학습 프로젝트의 커미터이자 중요한 컨트리뷰터로, 머하웃의 Taste 추천 프레임워크를 개발했다. 션은 아파치 스파크의 커미터이기도 하다. 스파크, 스파크 스트리밍, 그리고 카프카로 개발한 하둡 에서 동작하는 실시간 대규모 학습을 위한 Oryx 프로젝트(예전에는 Myrrix라고 불렸던)를 만들 었다. 조시 윌스 Josh Wills 슬랙Slack 데이터 엔지니어링팀의 디렉터다. 전에는 클라우데라의 데이터 과학팀의 선임 디렉터로써 고객들과 함께 다양한 업계의 하둡 기반 솔루션을 개발했다. 자바로 최적화된 맵리듀스와 스파크 파 이프라인을 만드는 아파치 크런치Apache Crunch 프로젝트의 창설자이며 커미터를 맡고 있다. 클라우데 라에 합류하기 전에는 구글에서 광고 경매 시스템을 개발했고, Google+에서 사용하는 분석 인프 라의 개발을 이끌었다. 지은이 소개
  4. 4. 5 박상은 컴퓨터에 붙은 그림을 보고 애플이라는 단어의 뜻을 알게 된 이 땅의 흔한 개발자 중 한 사람이다. 포항공과대학교에서 전산학을, 한국과학기술원에서 인공지능을 공부했으며, 그 덕분에 알파고와 스카이넷을 구분할 줄 아는 지혜를 갖추게 되었다. 메일, 브라우저, CMS, 도서 관리 시스템 등 일 관성을 찾기 어려운 다양한 프로젝트에 참여했으며 그 덕에 물에 물 탄 듯한 경력이 완성되는 듯했 으나, 최근 몇 년은 데이터 처리와 하둡과 관련한 연구 개발에 집중하고 있다. 현재 에스코어에서 하 둡 생태계를 이용한 데이터 플랫폼인 BigPodTM 개발에 참여하고 있으며, 특히 실시간으로 처리되 는 데이터의 수집과 시각화 사이의 시간 간격을 줄이는 데 관심이 있다. 권한철 에스코어의 빅데이터 플랫폼인 BigPodTM 개발자로 빅데이터 분석에 스파크를 활용하는 데 주력하 고 있다. 특히 실시간 스트리밍 데이터 분석과 통계 및 기계 학습 알고리즘을 활용한 데이터 분석에 관심이 많으며, 인간 생활을 이롭게 하는 기술과 제품을 만드는 것을 개발자로서의 삶의 목표로 하 고 있다. 서양주 한국과학기술원 학부에서 수학을, 서울대학교에서 석사과정으로 통계학을 전공하였으며, 티맥스소 프트를 시작으로 개발자로서 일하게 되었다. 그 후 에스코어에서 2013년 하둡과 스파크를 접한 이 후로 빅데이터 분석 업무를 주 업무로 수행하게 되었다. 현재는 카카오 RUBICS TF에서 실시간 콘 텐츠 추천 업무를 하고 있다. 옮긴이 소개
  5. 5. 6 버클리에서 스파크 프로젝트를 시작한 이래로, 나는 단순히 빠른 병렬 시스템을 구축한다는 사 실보다는 점점 더 많은 사람이 대규모 컴퓨팅을 사용할 수 있게 돕는다는 점에 흥분해왔다. 데 이터 과학 전문가 네 명이 스파크 기반의 고급 분석에 대해서 쓴 이 책을 읽는 것이 즐거운 이 유가 바로 여기에 있다. 샌디, 유리, 션 그리고 조시는 오랫동안 스파크로 작업해왔으며, 그만 큼 충실한 설명과 예제를 이 책에 담아냈다. 이 책에서 가장 마음에 드는 부분은 실제 응용 사례와 현실 세계의 데이터셋을 가져와 예제 중 심으로 설명하는 점이다. 독자의 PC에서 직접 실행해볼 수 있는 아홉 개의 개별 빅데이터 예제 를 제공한 책은 흔치 않은데, 저자들은 이런 예제들을 모아서 스파크로 실습할 수 있도록 모든 것을 세팅해두었다. 게다가, 핵심 알고리즘만 다룬 것이 아니라, 정말로 좋은 결과를 얻는 데 필요한 데이터 준비와 모듈 튜닝의 복잡한 사항까지 다루고 있다. 독자는 이들 예제에서 터득 한 개념을 자신의 문제를 푸는 데 곧바로 적용할 수 있을 것이다. 오늘날 빅데이터 처리는 의심할 여지 없이 컴퓨터로 할 수 있는 가장 흥미로운 분야이며, 빠르 게 진화하고 새로운 아이디어들이 도입되는 분야이기도 하다. 나는 독자들이 이 흥미로운 새로 운 분야로 들어서는 데 이 책이 도움이 될 거라 기대한다. 마테이 자하리아 스파크 창시자, 『러닝 스파크』 저자 아파치 스파크는 빅데이터 영역에서 가장 핫한 기술로, 범용적이면서 빠른 대용량 분산 처리를 지원한다. 또한 기초 데이터 분석부터 기계 학습 등의 기능까지 지원하게 되면서 개발자만의 오픈 소스에서 분석가를 위한 오픈 소스로 주목받고 있다. 이 책은 스파크로 빅데이터를 분석 하기 위한 가장 실용적인 데이터와 분석 방법을 설명하고 있다. 빅데이터에 관심 있거나 종사 하는 개발자와 분석가 모두에게 추천한다. 이상훈 한국 스파크 사용자 모임 운영자, 『실시간 분석의 모든 것』 역자 추천의 글
  6. 6. 7 교통, 금융 분야 등의 실제 데이터로 데이터 획득, 전처리, 가중치 결정, 실행, 평가 그리고 시 각화까지 해볼 수 있는 스파크 활용서다. 스파크 입문을 넘어 실무에 적용하려 할 때 좋은 참고 서다. 자신의 관심 도메인에 맞는 부분만 찾아서 읽어도 좋을 것 같다. 최홍용 현대오토에버
  7. 7. 8 학교를 졸업하고 몇 군데의 회사를 거쳐 2008년에 지금의 회사에 입사했다. 처음에는 콘텐츠 관리 시스템 개발로 시작했지만, 몇 번의 굴곡을 거쳐 회사는 이름이 바뀌었고 내가 하는 개발 업무도 바뀌게 되었다. 2011년, 데이터를 집계, 분석하여 실시간으로 시각화하는 과제를 수행 하게 되었다. 지금은 다른 회사에서 잘나가고 계신 배병우 씨와 함께 이를 위한 시스템을 설계 하면서 아파치 스톰Apache Storm을 알게 되었다. 그 후 몇 년간, 우리 회사의 개발팀은 스톰의 끝 을 보고 왔다. 그리고 스톰의 몇 가지 한계를 실감하게 되었다. 스톰은 스트림을 처리하는 훌륭 한 도구지만, 딱 거기까지였다(물론 이번에 릴리스된 스톰 1.0에서는 많은 부분이 개선되긴 했 다). 상태를 저장할 방법이 없는 탓에 완전한 분산 컴퓨팅 환경이라 말할 수 없다든지, 오류가 났을 시에 원래 상태를 복원할 수 없는 등 스톰이 할 수 없는 일이 꽤 있었다. 그러던 어느 날, 공역자인 권한철 씨와 서양주 씨가 아파치 스파크를 만났다. 당시 약간 모자라 보이던 스파크는, 맵리듀스MapReduce 로직을 인메모리로 처리하여 성능을 확장할 수 있다는 점 외에도, 일반적인 프로그래밍 환경에 데이터 분산 처리의 거의 모든 것을 가져올 수 있다는 특 징을 가지고 있었다. 여기에 분산 환경마저도 추상화하여 설치 이외에는 별다른 고민 없이 분 산 데이터 처리가 가능하다는 매력도 지녔다. 그리고 스톰의 강점인 스트림 처리마저도 스파크 스트리밍Spark Streaming이 마이크로 배치 형태로 처리할 수 있었다. 데이터 처리의 팔방미인이라 고 해도 과언이 아니었고, 우리는 그때부터 스파크에 집중하게 되었다. 그리고 약 2년이 흘렀 다. 스파크를 활용한 몇 개의 과제를 성공적으로 수행했으며, 새로운 도구를 받아들이는데 다 소 보수적인 분야의 현장에서도 스파크를 활용하여 얻을 수 있는 이점을 받아들이고 있다. 우 리는 스파크의 시대가 열리는 것을 목격한 운 좋은 증인이 되었고, 이 책을 읽을 독자분들도 아 직 늦지 않았다는 이야기를 해주고 싶다. 이 책은 단순한 스파크 참고서가 아니다. 스파크 참고서로는 더 좋은 책들이 여럿 있다. 부끄럽 지만 우리는 이 책도 그러한 참고서 중 하나인 줄 알고 번역을 시작했고, 그 착각 탓에 더 어려 운 길을 가야 했지만, 동시에 더 재미있는 길을 가볼 수 있었다. 이 책의 매력은 다양한 현장의 분석을 책에 담아낸 점에 있다. 스파크로 무엇인가를 해야 할지가 막막하다면 이 책을 펴면 도 옮긴이의 말
  8. 8. 9 움이 될 것이다. 굳이 스파크가 아닌 다른 도구를 사용하더라도 유용한 정보도 들어 있다. 이 책이 역자들에게 도움이 된 것처럼 독자들께도 도움이 될 것으로 생각한다. 이 책을 번역하느라 업무 부담을 조금씩 나눠주신 에스코어 엔터프라이즈 공통 플랫폼 그룹 김 세준 그룹장 이하 동료들에게 감사를 전한다. 동시에 몇 달 동안 아빠를 번역에 빼앗긴 건우에 게도 미안함을 전한다. 다른 역자들도 마찬가지의 미안함과 고마움을 가지고 있으리라 생각한 다. 번역이라는 것이 이렇게 어려운 작업인 줄은 상상도 못 했다. 책을 읽다가 책의 문장이 발 바닥에 꽂힌 가시 같다는 기분이 들면, 그 책임이 역자들에게도 있을 수 있음을 생각해주시기 바란다. 박상은
  9. 9. 10 과거를 후회하는 걸 좋아하진 않지만, 잠시 태만했던 2011년 시절 믿기 어려운 일이 벌어졌다. 당시 나는 어려운 이산 최적화 문제를 클러스터에 효율적으로 분배하는 방법을 고민하고 있었 다. 내 지도교수는 스파크라는 것이 최신 유행이라며 설명해주었지만, 그 개념은 실현되기엔 너무 이상적이라 실패할 것으로 판단하고 바로 학부 졸업논문을 맵리듀스로 작성하였다. 그 후 스파크와 나 모두 성장하였지만, 스파크는 도저히 무시할 수 없는 거물이 되었다. 대략 2년 후, 스파크에 주목해야 함이 명백해졌다. MPI부터 맵리듀스에 이르기까지, 스파크 이전의 프레임워크들은 분산 시스템의 어렵고 세세 한 핵심들을 추상화하여 대규모 자원을 활용한 프로그램을 작성할 수 있도록 해주었다. 이들 프레임워크는 늘어가는 데이터를 처리하기 위해 발전해온 만큼, 빅데이터가 진출할 수 있는 범 위는 이들 프레임워크의 능력 한계와 밀접하게 연관될 수밖에 없었다. 스파크는 분산 프로그램 도 일반 프로그램을 작성하듯 쉽게 짤 수 있게 하여 이 범위를 좀 더 넓혀주고 있다. 스파크를 사용하면 ETL 파이프라인의 성능이 엄청나게 향상될 것이며 매일 하둡의 신에게 절 망을 하소연하는 맵리듀스 프로그래머들의 고통을 덜어줄 것이다. 그러나 나에게 가장 흥미 로운 점은 항상 스파크가 개척해준 복잡한 분석 작업이었다. 스파크는 반복적 알고리즘iterative algorithm과 대화형 탐색interactive exploration을 지원하는 패러다임을 갖춰, 마침내 데이터 과학자가 대 규모 데이터셋을 생산적으로 다룰 수 있는 오픈 소스 프레임워크가 되었다. 나는 데이터 과학을 가르치는 가장 좋은 방법은 예제를 활용한 것이라고 생각한다. 이를 위해 나와 동료 저자들은 책에 여러 가지 응용 예를 담았으며, 가장 일반적인 알고리즘들과 데이터 셋들, 그리고 대규모 분석에서의 디자인 패턴들 간의 상호작용을 다루려고 노력하였다. 이 책 은 독자가 처음부터 끝까지 정독하라는 의도로 쓰이지 않았다. 여러분이 성취해봤으면 하는 주 제나 흥미를 자아내는 장을 펼쳐보자. 샌디 라이자 지은이의 말
  10. 10. 11 이 책의 1장에서는 데이터 과학과 빅데이터 분석이라는 넓은 맥락에서 스파크의 가치를 소개 한다. 그다음부터 각 장은 스파크를 사용한 독립적인 분석으로 구성된다. 2장은 데이터를 정제 하는 간단한 예로 스파크와 스칼라를 사용한 데이터 분석의 기초를 소개한다. 그리고 그다음 몇 장은 가장 일반적으로 사용되는 알고리즘 몇 개를 전형적인 분야에 적용하면서, 핵심적인 기계 학습 문제를 스파크를 활용하여 푸는 방법을 살펴볼 것이다. 나머지 장들은 좀 더 특수한 분야를 다룬다. 위키백과의 텍스트 안에 숨겨진 의미 관계를 알아보거나 유전체학 데이터도 분 석해볼 것이다. 예제 웹사이트 코드 예제와 데이터셋은 다음 주소에서 내려받을 수 있다. https://github.com/sryza/aas 이 책의 구성
  11. 11. 12 아파치 스파크와 MLlib이 없었다면 여러분이 이 책을 읽을 수 있었을 리 만무하다. 우리 모두 는 스파크와 MLlib을 개발하고 오픈 소스로 제공한 개발팀과 여기에 참여한 수백 명의 기여자 에게 감사를 전한다. 이 책을 검토하느라 시간을 내어준 모든 전문가에게도 감사를 전하고 싶다. 미카엘 베르니코, 이안 부스, 제레미 프리먼, 크리스 프레글리, 드바시시 고시, 줄리엣 호글랜드, 조나단 키블러, 프랭크 나샤프트, 닉 펜트리스, 코스타스 사켈리스, 마르셀로 반진, 그리고 줄리엣 호글랜드 (한 번 더) 모두 고마워! 신세를 졌어. 덕분에 책의 구성과 품질 모두 크게 개선되었다. 또한, 나(샌디)는 어려운 주제의 배경 이론과 관련하여 조언해준 조단 핀쿠스와 리처드 왕에 게 감사를 표한다. 이 책이 출판되고 독자의 손에 들어가기까지 물심양면으로 지원해주고 이런 경험을 하게 해준 마리 보구로와 오라일리에도 감사를 표한다. 샌디 라이자 감사의 말
  12. 12. 13 CONTENTS 지은이 소개 ............................................................................................................................. 4 옮긴이 소개 ............................................................................................................................. 5 추천의 글 ................................................................................................................................ 6 옮긴이의 말 ............................................................................................................................. 8 지은이의 말 .......................................................................................................................... 10 이 책의 구성 ......................................................................................................................... 11 감사의 말 ............................................................................................................................. 12 CHAPTER 1 빅데이터 분석하기 1.1 데이터 과학의 어려움..................................................................................................... 23 1.2 아파치 스파크란 ............................................................................................................ 25 1.3 이 책에 관하여 .............................................................................................................. 28 CHAPTER 2 스칼라와 스파크를 활용한 데이터 분석 2.1 데이터 과학자를 위한 스칼라.......................................................................................... 30 2.2 스파크 프로그래밍 모델.................................................................................................. 32 2.3 레코드 링크................................................................................................................... 32 2.4 스파크 셸과 SparkContext 시작하기 .............................................................................. 33 2.5 클러스터에서 클라이언트로 데이터 가져오기 ................................................................... 41 2.6 클라이언트에서 클러스터로 코드 가져가기 ...................................................................... 45 2.7 튜플을 사용한 데이터 구조화와 케이스 클래스................................................................. 46 2.8 집계 ............................................................................................................................. 52 2.9 히스토그램 만들기 ......................................................................................................... 53 2.10 연속 변수에 대한 요약 통계량 ...................................................................................... 55 2.11 요약 통계량을 계산하는 재사용 가능한 코드 만들기....................................................... 56
  13. 13. 14 2.12 간단한 변수 선택과 점수 매기기................................................................................... 62 2.13 한 걸음 더 나아가기 .................................................................................................... 64 CHAPTER 3 오디오스크로블러 데이터셋으로 음악 추천하기 3.1 데이터셋 ....................................................................................................................... 68 3.2 교차 최소 제곱 추천 알고리즘......................................................................................... 69 3.3 데이터 준비하기 ............................................................................................................ 73 3.4 첫 번째 모델 만들기....................................................................................................... 76 3.5 추천 결과의 추출 검사하기............................................................................................. 79 3.6 추천 품질 평가하기........................................................................................................ 81 3.7 AUC 계산하기 .............................................................................................................. 83 3.8 하이퍼파라미터 선택하기................................................................................................ 85 3.9 추천 결과 만들기 ........................................................................................................... 88 3.10 한 걸음 더 나아가기 .................................................................................................... 90 CHAPTER 4 의사 결정 나무로 산림 식생 분포 예측하기 4.1 회귀로 돌아와서 ............................................................................................................ 94 4.2 벡터와 특징................................................................................................................... 95 4.3 학습 예제 ...................................................................................................................... 96 4.4 의사 결정 나무와 랜덤 포레스트 ..................................................................................... 96 4.5 Covtype 데이터셋 ...................................................................................................... 100 4.6 데이터 준비하기 ......................................................................................................... 101 4.7 첫 번째 의사 결정 나무 ............................................................................................... 102 4.8 의사 결정 나무 하이퍼파라미터.................................................................................... 107 4.9 의사 결정 나무 튜닝하기 ............................................................................................. 109 CONTENTS
  14. 14. 15 4.10 범주형 특징 다시 살펴보기........................................................................................ 112 4.11 랜덤 포레스트 .......................................................................................................... 114 4.12 예측하기.................................................................................................................. 117 4.13 한 걸음 더 나아가기 ................................................................................................. 117 CHAPTER 5 K-평균 군집화로 네트워크 이상 감지하기 5.1 이상 감지 ................................................................................................................... 122 5.2 K-평균 군집화 ........................................................................................................... 123 5.3 네트워크 침입............................................................................................................. 124 5.4 KDD 컵 1999 데이터셋 .............................................................................................. 125 5.5 첫 번째 군집화하기..................................................................................................... 126 5.6 k 선정하기 ................................................................................................................. 129 5.7 R에서 시각화 ............................................................................................................. 133 5.8 특징 정규화................................................................................................................ 135 5.9 범주형 변수................................................................................................................ 138 5.10 엔트로피와 함께 레이블 활용하기.............................................................................. 139 5.11 군집화하기............................................................................................................... 140 5.12 한 걸음 더 나아가기 ................................................................................................. 142 CHAPTER 6 숨은 의미 분석으로 위키백과 이해하기 6.1 단어-문서 행렬 .......................................................................................................... 147 6.2 데이터 구하기............................................................................................................. 149 6.3 파싱하여 데이터 준비하기 ........................................................................................... 149 6.4 표제어 추출................................................................................................................ 151 6.5 단어빈도-역문서빈도(TF-IDF) 계산하기....................................................................... 153
  15. 15. 16 6.6 특이값 분해................................................................................................................ 156 6.7 중요한 의미 찾기 ........................................................................................................ 158 6.8 낮은 차원 표현에 대한 의문과 고찰.............................................................................. 163 6.9 단어와 단어 사이의 연관도.......................................................................................... 164 6.10 문서와 문서 사이의 연관도........................................................................................ 166 6.11 단어와 문서 사이의 연관도........................................................................................ 168 6.12 여러 개의 단어로 질의하기........................................................................................ 169 6.13 한 걸음 더 나아가기 ................................................................................................. 171 CHAPTER 7 그래프엑스로 동시발생 네트워크 분석하기 7.1 네트워크 분석 사례: MEDLINE의 인용 색인 ................................................................. 174 7.2 데이터 구하기............................................................................................................. 176 7.3 스칼라 XML 라이브러리로 XML 문서 파싱하기............................................................. 178 7.4 MeSH 주요 주제와 주제들의 동시발생 분석하기........................................................... 181 7.5 그래프엑스로 동시발생 네트워크 구성하기 ................................................................... 184 7.6 네트워크의 구조 이해하기 ........................................................................................... 187 7.6.1 연결 성분............................................................................................................ 188 7.6.2 차수의 분포......................................................................................................... 191 7.7 관련성 낮은 관계 필터링하기....................................................................................... 193 7.7.1 EdgeTriplets 처리............................................................................................... 195 7.7.2 필터링된 그래프 분석하기...................................................................................... 197 7.8 작은 세상 네트워크..................................................................................................... 199 7.8.1 클릭과 군집계수................................................................................................... 199 7.8.2 프레겔을 사용하여 평균 경로 길이 계산하기.............................................................. 201 7.9 한 걸음 더 나아가기.................................................................................................... 207 CONTENTS
  16. 16. 17 CHAPTER 8 뉴욕 택시 운행 데이터로 위치 및 시간 데이터 분석하기 8.1 데이터 얻기................................................................................................................ 210 8.2 스파크에서 시간과 지리 데이터 다루기......................................................................... 211 8.3 JodaTime과 NScalaTime을 이용한 시간 데이터.......................................................... 212 8.4 Esri Geometry API와 Spray를 사용한 지리 데이터 ...................................................... 214 8.4.1 Esri Geometry API 살펴보기................................................................................ 215 8.4.2 GeoJSON 소개.................................................................................................. 216 8.5 뉴욕 택시 운행 데이터 준비하기 .................................................................................. 219 8.5.1 잘못된 레코드 대규모로 다루기............................................................................... 221 8.5.2 지리 정보 분석하기............................................................................................... 225 8.6 스파크에서 세션화하기................................................................................................ 229 8.6.1 세션 구성하기: 스파크에서 보조 정렬하기 ................................................................. 230 8.7 한 걸음 더 나아가기 ................................................................................................... 234 CHAPTER 9 몬테카를로 시뮬레이션으로 금융 리스크 추정하기 9.1 금융 분야 전문 용어.................................................................................................... 236 9.2 VaR 계산 방법............................................................................................................ 237 9.2.1 분산-공분산 ....................................................................................................... 237 9.2.2 역사적 시뮬레이션................................................................................................ 238 9.2.3 몬테카를로 시뮬레이션.......................................................................................... 238 9.3 우리의 모델................................................................................................................ 239 9.4 데이터 구하기............................................................................................................. 240 9.5 전처리하기 ................................................................................................................. 241 9.6 요인 가중치 결정하기.................................................................................................. 245 9.7 표본추출하기.............................................................................................................. 248 9.8 다변량 정규분포 ......................................................................................................... 250
  17. 17. 18 9.9 실험 실행하기............................................................................................................. 252 9.10 수익 분포 시각화하기 ............................................................................................... 256 9.11 결과 평가하기 .......................................................................................................... 257 9.12 한 걸음 더 나아가기 ................................................................................................. 260 CHAPTER 10 BDG 프로젝트와 유전체학 데이터 분석하기 10.1 모델링과 저장소를 분리하기...................................................................................... 264 10.2 ADAM CLI를 이용한 유전체학 데이터 처리................................................................ 267 10.2.1 파케이 형식과 열 기반 저장소.............................................................................. 274 10.3 ENCODE 데이터로부터 전사인자 결합 부위 예측하기 ................................................ 277 10.4 1000 게놈 프로젝트에서 유전자형 질의하기 .............................................................. 285 10.5 한 걸음 더 나아가기 ................................................................................................. 287 CHAPTER 11 파이스파크와 썬더로 신경 영상 데이터 분석하기 11.1 파이스파크 소개 ....................................................................................................... 290 11.1.1 파이스파크 내부 구조......................................................................................... 292 11.2 썬더 라이브러리 개요와 설치 .................................................................................... 294 11.3 썬더로 데이터 읽어 들이기........................................................................................ 296 11.3.1 썬더 핵심 자료형............................................................................................... 303 11.4 썬더를 이용해서 신경 세포 유형 분류하기.................................................................. 304 11.5 한 걸음 더 나아가기 ................................................................................................. 310 CONTENTS
  18. 18. 19 APPENDIX A 스파크 더 깊숙히 A.1 직렬화....................................................................................................................... 313 A.2 어큐뮬레이터 ............................................................................................................. 314 A.3 스파크와 데이터 과학자의 작업흐름 ........................................................................... 315 A.4 파일 형식................................................................................................................... 318 A.5 스파크의 하위 프로젝트들........................................................................................... 319 A.5.1 MLlib............................................................................................................... 319 A.5.2 스파크 스트리밍................................................................................................. 320 A.5.3 스파크 SQL ...................................................................................................... 321 A.5.4 그래프엑스........................................................................................................ 321 APPENDIX B MLlib 파이프라인 API B.1 단순한 모델링을 넘어서.............................................................................................. 324 B.2 파이프라인 API.......................................................................................................... 325 B.3 문서 분류 예제 검토 ................................................................................................... 326 찾아보기 ................................................................................................................................................... 329
  19. 19. 21Chapter 1 - 빅데이터 분석하기 “데이터 애플리케이션은 소시지와 비슷하다. 어떻게 만드는지 모르는 편이 나으니까.”1 -오토 폰 비스마르크 ● 셀 수 없이 많은 트랜잭션과 수천 가지 특징을 가지고 신용카드 부정 사용을 감지하기 위한 모델 구축 ● 수백만 사용자에게 수백만 가지의 제품 중 적절한 것을 지능적으로 추천 ● 수백만 가지 요소를 고려한 포트폴리오 시뮬레이션을 통한 투자 위험도 추정 ● 질환의 유전적 연관성을 파악하기 위한 대규모 인간 유전자 분석 몇 년 전만 하더라도 이와 같은 일들은 꽤 어려운 일이었다. 오늘날을 빅데이터의 시대라고 말할 수 있는 이유는 기존에는 경험하지 못한 규모로 정보를 수집, 저장, 처리할 수 있는 도구가 준비 되었기 때문이다. 이 배경에는 오픈 소스 생태계가 있는데, 그 덕분에 엄청난 양의 데이터를 다 룰 수 있는 컴퓨터 클러스터 환경을 저렴하게 사용할 수 있게 되었다. 아파치 하둡Apache Hadoop 과 같은 분산 시스템이 대세가 되었으며, 거의 모든 분야의 수많은 현장에서 활용하고 있다. 하지만 돌덩어리와 끌이 있다고 해서 조각상이 다 만들어진 것이 아니듯, 이들 도구와 각종 데 이터를 갖추었다는 것과 이를 활용하여 무언가 쓸모 있는 일을 한다는 것 사이에는 차이가 있 다. 그래서 데이터 과학이 필요해졌다. 조각이 도구를 사용하여 원석을 (조각가가 아닌) 누군가 에게 의미 있는 무언가로 바꾸는 작업이라면, 데이터 과학은 원본 데이터를 (데이터 과학자가 1 옮긴이_ 비스마르크는 원래 ‘데이터 애플리케이션’이 아니라 ‘법률’이 그러하다고 말했다. 빅데이터 분석하기 CHAPTER 1 샌디 라이자
  20. 20. 22 9가지 사례로 익히는 고급 스파크 분석 아닌) 누군가의 관심을 끌 만한 의미 있는 것으로 바꾸는 작업이다. 흔히 ‘쓸모 있는 일 하기’는 스키마schema를 설계하고 SQL을 사용하여 “등록 과정의 세 번째 페 이지에 도달한 엄청난 수의 사용자 중 25세 이상은 몇 명인가?”와 같은 질문에 답하는 것을 의 미한다. 이런 질문에 쉽게 답할 수 있도록 데이터 웨어하우스data warehouse를 구성하고 정보를 체 계화하는 방법을 다루는 분야도 거대하지만, 이 책에서는 이런 복잡한 일은 되도록 다루지 않 으려 한다. 때때로 ‘쓸모 있는 일 하기’에는 노력이 더 필요할 수 있다. SQL은 여전히 주요한 수단이다. 하 지만 다루는 데이터가 매우 독특하거나 복잡한 분석이 필요하다면 SQL보다 유연하고 근본적 이며 기계 학습과 통계학 분야의 기능이 풍부한 새로운 프로그래밍 패러다임이 필요해진다. 이 런 유형의 분석이 이 책에서 이야기하려는 대상이다. 오랜 기간에 걸쳐 R, PyData 스택(파이썬 데이터 분석 도구 모음), 옥타브Octave와 같은 오픈 소스 프레임워크 덕에 작은 데이터셋dataset을 빠르게 분석하고 모델을 수립할 수 있었다. 데이터 셋의 일부를 사용해서 기계 학습 모델을 학습시키고 나머지 데이터의 레이블을 예측하는 데 10 줄 이내의 코드로도 가능하다. 여기서 조금만 더 나아가면 결측치missing data를 보정하고, 몇몇 모 델을 실험해 최적의 모델을 찾고, 한 모델의 결과를 다른 모델을 적합fit시키기 위한 입력으로 사용할 수 있다. 대규모 데이터셋에서 동일한 결과를 얻기 위해 컴퓨터 클러스터 환경을 활용 한다면 이상의 과정이 어떻게 달라질까? 단순히 프레임워크를 여러 노드에서 동작하게끔 확장하고 프로그래밍 모델은 그대로 유지한 채 분산 환경에서 잘 동작하게끔 내부를 수정하는 것이 옳을 수도 있다. 하지만 단일 노드에서 는 문제가 되지 않았지만 분산 컴퓨팅에서는 새롭게 고민해야 하는 것들이 있다. 예를 들어 네 트워크는 메모리보다 월등히 느리므로 데이터가 클러스터의 여러 노드에 나뉘어 있다면 많은 데이터를 참조하는 알고리즘은 성능이 매우 나빠진다. 분산 환경에서 동작하는 노드의 수가 늘 어날수록 오류가 발생할 가능성도 커진다. 이러한 사실들을 종합해볼 때 고도의 병렬 실행 코 드를 쉽게 작성할 수 있는, 분산 환경의 특징에 충실한 프로그래밍 패러다임이 필요하다. 하나의 노드에서 동작하는 PyData나 R과 같은 도구가 소프트웨어 커뮤니티에서 최근 주목받 고 있지만, 이들만이 데이터 분석을 위한 도구는 아니다. 대량의 데이터를 다루는 유전체학과 같은 과학 분야에서도 수십 년간 병렬 컴퓨팅 프레임워크를 발전시켜왔다. 이 분야에서 데이터 를 다루는 사람 대부분은 HPChigh-performance computing (고성능 컴퓨팅)라는 클러스터 컴퓨팅 환경
  21. 21. 23Chapter 1 - 빅데이터 분석하기 에 익숙하다. PyData나 R은 확장성이 부족해 문제라면, HPC에서는 추상화 수준이 지나치게 낮아서 발생하는 나쁜 사용성이 문제다. 예컨대 DNA 염기서열로 가득 찬 커다란 파일을 병렬 처리하려면 수작업으로 일일이 작은 파일로 나눈 후, 각각에 대한 처리 작업을 클러스터의 스 케줄러에 하나씩 등록해야 한다. 일부에서 오류가 발생하면 작업자는 그 오류를 직접 찾아내서 수동으로 재입력해야 한다. 분석하다 보면 전체 데이터셋의 정렬과 같은 데이터 전체를 사용해 야 하는 작업을 수행해야 할 때가 있다. 이 경우에는 커다란 데이터 모두를 하나의 노드에 밀어 넣거나 MPI와 같은 저수준 분산 프레임워크에 의존해야 하는데, 그러려면 C 언어와 분산 네 트워크 환경을 잘 이해하고 있어야 한다. 또, HPC 환경에 맞게 제작된 도구들은 저수준 저장 소 모델로부터 인메모리in-memory 데이터 모델을 분리하기가 어려운 경우가 많다. 예를 들어 많 은 도구가 POSIX 파일시스템의 단일 데이터 스트림으로만 데이터를 읽을 수 있도록 만들어졌 다. 이러한 도구는 병렬화하거나 데이터베이스 같은 다른 종류의 백엔드 저장소를 사용하도록 변경하기가 쉽지 않다. 하둡 생태계의 최근 시스템들은 사용자가 클러스터 환경을 단일한 컴퓨 터 환경처럼 다룰 수 있도록 추상화해준다. 파일을 쪼개 여러 노드에 걸쳐 있는 저장소에 분산 하고, 일을 작은 단위로 나누어 처리하고, 오류를 복구하는 모든 작업을 자동으로 수행한다. 하 둡 생태계는 큰 데이터 파일을 다루는 과정도 자동화할 수 있으며, HPC보다 훨씬 저렴하다. 1.1 데이터 과학의 어려움 데이터 과학을 실제로 적용하다 보면 종종 어려운 문제에 부딪히게 된다. 클라우데라Cloudera의 데이터 과학팀은 이러한 어려움을 널리 알리는 데 큰 역할을 해왔다. 대량의 데이터로부터 복 잡한 분석을 성공적으로 처리하는 시스템을 구축하려면 (설사 실제로 벌어지지 않더라도) 이 런 어려움에 관해서 알고 있어야 한다. 첫째, 성공적인 분석을 위한 작업의 대부분은 데이터의 전처리 과정에서 이루어진다. 데이터는 너저분하다. 그래서 데이터를 활용하기 전에 정제, 개조, 합치기, 섞기 같은 여러 가지 전처리 과정이 필요하다. 특히, 육안으로 검사하기 어려울 정도로 데이터가 많다면 어떠한 전처리 과 정이 필요한지를 파악하는 일조차 별도의 처리 과정이 필요하다. 심지어 모델의 성능을 최적화 해야 할 때는 알고리즘을 선택해서 구현하는 일보다 특징을 추출하고 선택하는 데 일반적으로 더 많은 노력이 들어간다.
  22. 22. 24 9가지 사례로 익히는 고급 스파크 분석 예컨대 온라인 구매 데이터에서 사기 행위를 찾는 모델을 만들고자 한다면 데이터 과학자들은 사용자가 작성하는 주문서 상의 여러 정보, 즉 사용자 IP의 위치 정보, 로그인 시간, 웹 사이트 내비게이션 로그와 같은 활용 가능한 수많은 특징 중에서 무엇을 사용할지 선택해야 한다. 선 택한 각 특징을 기계 학습 알고리즘에 적합한 벡터로 변환해야 하며, 이를 위해서 더블형double 숫자로 이루어진 2차원 배열을 수학적 모델로 변환하는 일 정도는 해줄 수 있는 시스템이 있어 야 한다. 둘째, 데이터 과학에서 반복iteration은 기본적인 과정이다. 보통은 모델을 만들고 분석하는 과정 에서 같은 데이터를 여러 번 반복해서 읽게 된다. 이는 기계 학습이나 통계적 절차의 특징에 기 인하는데, 값이 수렴할 때까지 입력 데이터를 반복해서 사용하는 확률적 구배법Stochastic Gradient Descent이나 기댓값 최대화법Expectation Maximization과 같은 널리 사용되는 최적화 기법들을 보면 알 수 있다. 반복은 데이터 과학자 자신의 작업 흐름 안에서도 문제가 된다. 데이터 과학자가 처 음 접하는 데이터셋을 파악하고자 할 때, 특정 질의의 결과를 가지고 다음에 수행해야 할 질의 를 결정하는 것이 일반적이다. 모델을 만들 때도 데이터 과학자는 단 한 번의 시도로 모델이 완 성되리라 기대하지 않는다. 실험을 통해서 알맞은 특징을 선택하고, 적절한 알고리즘을 선택하 고, 유의성 검정을 하고, 맞춤 하이퍼파라미터들을 찾아낸다. 어떤 프레임워크가 같은 데이터 를 매번 디스크에서 가져온다면 전체 프로세스의 속도가 디스크 입출력만큼 느려지고, 결과적 으로 할 수 있는 일의 양이 줄어들게 된다. 셋째, 잘 돌아가는 모델이 완성되었다고 해서 일이 끝나는 것은 아니다. 데이터 과학의 핵심이 데이터를 직접 분석하지 않는 사람들에게 유용한 정보를 뽑아내는 것이라면, 데이터 과학자 컴 퓨터의 텍스트 파일에 회귀 가중치의 목록 형태로 저장된 모델은 진정한 목적이 될 수 없다. 데 이터 애플리케이션이라면 데이터 추천 시스템이나 실시간 사기 탐지 시스템처럼 의미 있게 활 용할 수 있어야 한다. 이런 시스템에서는 모델이 제품 서비스의 일부이므로 주기적으로 혹은 실시간으로 다시 생성해야 할 수도 있다. 이런 상황에서는 연구를 위한 분석과 현장을 위한 분석을 구분해야 한다. 연구를 위한 분석은 데 이터에 대한 탐색적 분석exploratory analytics을 의미한다. 이 분석에서는 데이터의 특성을 이해하려 시 도한다. 그 결과를 시각화하고, 아직 적용하지 않은 이론들을 시험한다. 여러 종류의 특징과 현 재의 데이터를 보강할 수 있는 후보 데이터도 시험하게 된다. 한두 가지는 성공하기를 바라면 서 다양한 알고리즘을 시험하는 것이다. 반면 데이터 애플리케이션을 구축하는 현장에서는 운 영을 위한 분석operational analytics을 수행한다. 분석 모델을 실제 의사 결정에 영향을 주는 서비스에
  23. 23. 25Chapter 1 - 빅데이터 분석하기 적용하며, 시간 흐름에 따른 모델의 성과를 추적하고, 정확도를 조금이라도 올리기 위한 미세 조정 방안을 궁리한다. 그리고 서비스 수준 협약서Service Level Agreement (SLA)와 가동시간uptime도 고민하게 된다. 일반적으로 R과 같은 언어로 탐색적 분석은 수행한 이후에, 양산 단계에서는 데이터 처리 과정을 자바나 C++로 완전히 새롭게 구현하곤 한다. 물론 처음에 만든 모델의 코드를 실무 애플리케이션에서도 사용할 수 있다면 좋겠지만, R과 같 은 언어는 성능도 좋지 않은 데다가 제품의 다른 구성요소들과 통합하기에는 적합하지 않다. 반대로 자바나 C++와 같은 언어 쪽은 탐색적 분석에 쓸만한 도구를 찾아보기 어렵다. 자바나 C++에서는 데이터와 상호작용할 수 있는 REPLRead-Evaluate-Print-Loop 환경이 부족하며, 간단한 변환식을 구현하는 데도 많은 양의 코드가 필요하다. 그리하여 모델링 과정에서도 쉽게 쓸 수 있고 제품에도 적용할 수 있는 프레임워크가 필요한 상황이 되었다. 1.2 아파치 스파크란 아파치 스파크로 들어가보자. 스파크는 세련된 방법으로 클러스터의 여러 노드로 프로그램을 분배하고, 그 위에서 동작하는 프로그램을 개발할 수 있도록 개발된 오픈 소스 프레임워크다. UC 버클리의 AMPLab에서 시작해, 지금은 아파치 소프트웨어 재단에서 관리하는 스파크는, 데이터 과학자가 분산 프로그래밍을 할 수 있게 해주는 아마도 최초의 오픈 소스 소프트웨어일 것이다. 스파크를 쉽게 이해하기 위하여 스파크의 선배라 할 수 있는 맵리듀스MapReduce와 비교해보자. 맵리듀스는 수십만 개의 노드를 활용하는 병렬 처리를 간단히 구현할 수 있는 모델로, 대량의 데이터 연산 분야에 일대 혁신을 가져왔다. 맵리듀스는 거의 선형에 가까운 확장성을 보여준 다. 데이터가 많아지면 컴퓨팅 노드도 그만큼 추가하여 같은 시간에 일을 마무리 지을 수 있음 을 의미한다. 그리고 ‘하나의 노드에서는 잘 발생하지 않는 오류라도 규모가 큰 클러스터 환경 에서는 일상적’이라는 상식으로부터도 자유롭다. 맵리듀스는 일을 작은 단위의 작업으로 쪼개 고, 단위 작업에서 오류가 나더라도 전체에 영향을 주지 않도록 우아한 방식으로 오류를 처리 한다. 스파크는 맵리듀스의 선형 확장성과 결함 허용성fault tolerance, 내결함성을 유지하면서, 세 가지 중요 한 개선을 이루어냈다. 먼저, ‘맵 단계 후 리듀스 단계’를 지키지 않아도 되며, 훨씬 일반적인 방
  24. 24. 26 9가지 사례로 익히는 고급 스파크 분석 향성 비순환 그래프directed acyclic graph (DAG) 형태로 정의한 연산들을 실행할 수 있다. 맵리듀스 라면 임시 결과를 분산 파일시스템에 반드시 저장해야 하는 상황에서, 스파크는 파이프라인의 다음 단계로 임시 결과를 바로 넘길 수 있다는 뜻이다. 이는 맵리듀스의 후손이자 마이크로소 프트 연구소에서 시작된 Dryad(http://research.microsoft.com/en-us/projects/dryad/)와 유사한 방식이다. 두 번째, 사용자가 연산을 더욱 자연스럽게 표현할 수 있도록 풍부한 변환 방식을 제공하여 처 리 능력을 확장하고 있다. 개발자 중심의 기능을 제공하여 몇 줄의 코드만으로 복잡한 파이프 라인을 구현할 수 있는 간소화된 API를 제공한다. 마지막 개선은 인메모리 처리 방식이다. 스파크의 탄력적 분산 데이터셋Resilient Distributed Dataset (RDD)이라는 추상 개념은 개발자가 처리 파이프라인의 어느 지점에서라도 데이터를 클러스 터의 메모리로 저장할 수 있도록 해준다. 이후 단계에서 같은 데이터를 사용해야 한다면 데이 터를 다시 연산하거나 디스크로부터 다시 읽을 필요가 없다는 뜻이다. 이 능력 덕분에 과거의 분산 처리 엔진들이 하지 못했던 용도로도 사용할 수 있게 되었다. 예를 들어 데이터셋을 여러 번 훑어야 하는 알고리즘이나 사용자 요청에 빠르게 응답하기 위해 커다란 인메모리 데이터셋 을 스캔해야 하는 반응형 애플리케이션reactive application에 아주 적합하다. 데이터 분석에서 가장 큰 병목이 CPU, 디스크, 네트워크 같은 컴퓨팅 환경이 아니라 분석가의 생산성에 달려 있음을 이해한다면 아마도 가장 중요한 점은 앞 절에서 이야기한 ‘데이터 과학 의 어려움’을 해결하는 데 스파크가 좋은 해답이라는 사실일 것이다. 전처리부터 모델 평가까 지의 전체 과정을 단일 프로그래밍 환경에서 수행하는 것이 개발 속도 면에서 얼마나 큰 이점 인지는 아무리 과장해도 지나치지 않을 것이다. REPL 환경의 분석 라이브러리들을 가지고 많 은 것을 표현할 수 있는 프로그래밍 모델로 묶어내면 맵리듀스와 같은 특정 프레임워크를 사용 하느라 여러 IDE를 오갈 필요도 없고, R과 같은 프레임워크를 사용하느라 HDFS로부터 데이 터를 표본추출하거나 이리저리 이동시킬 필요도 없다. 분석가가 데이터를 조사하는 시간이 절 약될수록 뭔가 쓸만한 일을 할 가능성은 더 커진다. 데이터 조작 또는 ETL에 적용할 수 있다는 면을 보면 스파크는 빅데이터를 다루는 매트랩Matlab 이라기보다는 빅데이터를 다루는 파이썬에 가까워 보인다. 범용 연산 엔진으로서 스파크의 핵 심 API는 통계, 기계 학습, 행렬 연산의 어떤 기능과도 독립적인, 데이터 변환을 위한 강력한 토대를 제공한다. 스파크의 스칼라 API와 파이썬 API 덕분에 범용 언어에서 쉽게 불러 쓸 수
  25. 25. 27Chapter 1 - 빅데이터 분석하기 있고, 다른 라이브러리와 함께 사용할 수도 있다. 스파크의 인메모리 캐시 기능은 반복적으로 이루어지는 크고 작은 모든 데이터 처리에 이상적 이다. 이 기능을 활용하면 학습 데이터를 반복해서 읽어야 하는 기계 학습 알고리즘에서는 학 습 데이터를 메모리에 캐시해둘 수 있다. 데이터 과학자가 데이터를 파악하려 할 때도 데이터 를 디스크에서 매번 읽어 들이는 대신, 메모리에 올려둔 채 다양한 질의를 테스트해보고, 또 그 결과를 메모리에 쉽게 저장할 수도 있다. 마지막으로, 스파크는 탐색용 분석 시스템과 운영용 분석 시스템 사이의 간격을 좁힐 수 있 다. 세간에서 데이터 과학자는 통계학자보다는 엔지니어링을 잘하고 엔지니어보다는 통계 활 용에 능하다고 이야기하지만, 적어도 스파크는 대부분의 탐색 시스템보다는 운영 시스템에 서 쓰기에 좋고, 운영 시스템에서 일반적으로 사용하는 기술들에 비해 데이터 탐색에도 적합 하다. 스파크는 근본적으로 성능과 신뢰성 모두를 위해서 만들어졌다. 자바 가상 기계Java Virtual Machine (JVM)에서 돌아가기 때문에 자바 스택에서 돌아가는 수많은 운영 및 디버깅 도구도 활 용할 수 있다. 스파크는 하둡 생태계의 다양한 도구와 통합하기에도 좋다. 스파크는 맵리듀스가 지원하는 모 든 데이터 포맷을 읽고 쓸 수 있어서, 에이브로Avro, 파케이Parquet와 같은 하둡의 일반적인 데이 터 저장 파일 포맷도 사용할 수 있다. 물론 하둡 이전부터 사용된 쉼표로 분리된 텍스트 형식 CSV도 지원한다. 그리고 HBase와 카산드라Cassandra 같은 NoSQL 데이터베이스로부터 데이터를 읽고 쓸 수도 있다. 스파크 스트리밍Spark Streaming이라는 스트림 처리 라이브러리로는 플룸Flume이 나 카프카Kafka로부터 스트림 데이터를 입력받을 수도 있다. SQL 라이브러리인 스파크 SQL로 는 하이브 메타스토어Hive Metastore와 상호작용이 가능한데, 맵리듀스를 대체하기 위하여 하이브 와 연동하는 데이터 처리 엔진으로 스파크를 활용하려는 프로젝트가 이 책을 쓰는 동안에도 진 행 중이다. 하둡의 스케줄링과 자원 관리를 담당하는 YARNYet Another Resource negotiator, 얀 내부에서 도 동작이 가능하다. 이를 통해서 클러스터 사이에서 자원을 동적으로 공유할 수 있으며, 맵리 듀스나 임팔라Impala와 같은 다른 처리 엔진에서도 동일한 정책으로 관리할 수 있게 되었다. 물론, 스파크가 모든 면에서 좋기만 한 것은 아니다. 이 책을 쓰고 있는 지금도 스파크의 코어 엔진은 완성도를 높여가고 있지만, 아직 맵리듀스에 비해서 역사도 짧고 맵리듀스를 능가하는 일괄 처리batch processing용 도구가 되지도 못했다. 스트림 처리, SQL, 기계 학습, 그리고 그래프 처리와 같은 특화된 하위 모듈들은 아직 성숙해가는 과정에 있으며 대규모 API 개선이 진행 중
  26. 26. 28 9가지 사례로 익히는 고급 스파크 분석 이다. 예를 들어 기계 학습 라이브러리인 MLlib의 데이터 파이프라인과 변환 API 모델은 이 책을 쓰는 동안에도 계속 개발 중이다. 통계와 모델링 기능은 아직 R과 같은 단일 노드 언어의 근처에도 가지 못했다. 풍부한 SQL 기능을 제공한다지만 아직 하이브에도 뒤처져 있다. 1.3 이 책에 관하여 이 책의 나머지 부분에서는 스파크의 장점이나 단점은 다루지 않는다. 기본적인 스파크 프로그 래밍 모델과 스칼라 언어의 기초는 소개하지만, 스파크의 레퍼런스에 해당하는 내용이나 모든 것에 대한 포괄적인 지침 같은 것은 제공하지 않으려 한다. 기계 학습, 통계학, 선형대수의 튜 토리얼로 만들 생각도 없다. 물론, 필요하다면 기본적인 배경 정도는 설명할 것이다. 그 대신, 우리는 대량의 데이터셋을 다루는 복잡한 분석을 스파크로 실제 해보며, 그 생생한 느 낌을 독자에게 전달하고자 한다. 단순히 모델을 구축하고 평가하는 데 그치지 않고, 전체 파이 프라인을 돌아보며 데이터 정제, 전처리, 데이터 조사, 실제 제품으로 만들기까지를 보여주고 자 한다. 아마도 실제 예제를 통해서 보여주는 방법이 최선일 것이다. 그래서 우선 스파크와 그 생태계를 간단한 설명한 후, 그다음 장부터는 각 분야의 데이터를 스파크로 분석하는 독립적인 설명들로 채울 것이다. 가능하다면 단순히 ‘정답’을 제공하기보다는 데이터 과학의 절차 전체, 즉 모든 반복, 막다른 길, 재시도 등을 설명할 것이다. 이 책은 스칼라, 스파크, 기계 학습, 데이터 분석에 더 친숙해 지는 계기가 될 것이다. 그리고 이 모두는 더 큰 목적을 향한 과정이다. 우리는 이번 장의 처음 에 언급한 여러 업무에 어떻게 접근하는지를 가르치려는 것이다. 약 30쪽 내외로 구성된 각 장 을 통해 데이터 애플리케이션의 일부를 만들어내는 방법을 가능한 한 실제처럼 설명할 것이다.
  27. 27. 29Chapter 2 - 스칼라와 스파크를 활용한 데이터 분석 “흥미를 잃지 않는다면 못할 일은 아무 것도 없다.” -데이비드 포스터 월리스 데이터 정제는 모든 데이터 과학 프로젝트의 시작이자, 매우 중요한 일이다. 분석에 사용하는 데 이터의 품질이나 다른 내재적 원인에 의하여 분석 결과가 왜곡되거나 실제와 다른 결론이 도출 된다면 아무리 뛰어난 분석 방법이라 할지라도 도움이 되지 않을 것이다. 이러한 중요성에도 불구하고 데이터 과학 서적이나 강의에서는 데이터 정제 과정에 관해서 다 루지 않거나 그냥 언급만 하고 지나치곤 한다. 사실 데이터 정제는 꽤 지루한 과정이다. 우리가 새 문제에 써보고 싶은 멋진 기계 학습 알고리즘을 적용하기 전에 거쳐야 하는 아주 따분한 일 이다. 많은 풋내기 데이터 과학자들은 최소한의 데이터 품질 수준으로 분석을 시작하고, 복잡 한 알고리즘을 적용한 후 말도 안 되는 답을 얻고 나서야 비로소 데이터 품질에 심각한 문제가 있음을 깨닫는 경우가 많다. “쓰레기를 넣으면 쓰레기가 나온다garbage in, garbage out”라는 말도 있지만, 현실은 이보다 훨씬 심 각하다. 어떤 데이터에 쉽게 파악되지 않는 심각한 품질 문제가 있어서 문제가 없는 데이터로 오인된다면 도출된 결과도 마치 문제가 없는 것처럼 보일 수 있다는 것이다. 이런 종류의 실수 로 인해 심각한 오답을 제시하는 것은 데이터 과학자에게는 치명적이다. 데이터 과학자로서 갖추어야 할 중요한 소질 하나는 데이터 분석의 모든 단계에서 흥미롭고 가 스칼라와 스파크를 활용한 데이터 분석 CHAPTER 2 조시 윌스
  28. 28. 30 9가지 사례로 익히는 고급 스파크 분석 치 있는 문제를 찾아내는 능력이다. 분석의 초기 단계에 기술과 통찰을 더하면 최종 결과물의 신뢰도는 더 커지게 된다. 데이터 과학자에게 데이터 품질 관리에 신경을 쓰라고 하다니, 물론 말은 쉽다. 아이들에게 채 소를 먹으라고 이야기하는 것처럼 말이다. 멋진 기계 학습 알고리즘을 만들어보거나, 스트리밍 데이터를 처리하는 엔진을 개발한다든지, 복잡하게 연결된 그래프를 분석한다든지 하는 일에 사용할 수 있는 스파크와 같은 새로운 도구를 써보는 일이 훨씬 재미있기 때문이다. 그래서 스 파크와 스칼라를 활용하여 데이터를 정제하는 예제로부터 시작하려고 한다. 2.1 데이터 과학자를 위한 스칼라 데이터 과학자 대부분은 데이터를 조작하고 분석할 때 R이나 파이썬과 같은, 자신에게 가장 능 숙한 특정 도구를 선호한다. 어쩔 수 없이 다른 환경에서 일하게 되더라도 선호하는 도구에 집 착하며 그 도구를 사용할 수 있는 환경으로 데이터를 가지고 나갈 방법을 모색하곤 한다. 새로 운 문법과 새로운 패턴을 습득해야 하는 새로운 도구를 도입하는 것은 최선의 상황에서도 꽤 힘든 도전적인 일이다. 스파크에는 R이나 파이썬으로 코드를 작성할 수 있는 라이브러리와 래퍼wrapper가 있다. 그중 파이스파크PySpark라는 훌륭한 파이썬 래퍼는 이 책의 뒷부분에서도 일부 다루고 있다. 하지만 대부분의 예제는 스칼라로 제공할 것이다. 스파크 자체가 스칼라 언어로 구현되어 있어서, 스 칼라를 직접 사용하면 다음과 같은 효과를 기대할 수 있다. 성능 면에서 유리하다. 스칼라처럼 JVM에서 동작하는 언어 위에서 R이나 파이썬으로 만들어진 알고리즘을 실행하 려면 코드와 데이터를 변환하거나 다른 환경으로 옮기는 작업이 추가로 필요하며, 때에 따 라서는 이 추가 과정에서 오류가 생길 수도 있다. 반면, 스파크가 제공하는 스칼라 API를 사 용한다면 의도한 대로 동작할 가능성이 매우 커진다.
  29. 29. 31Chapter 2 - 스칼라와 스파크를 활용한 데이터 분석 최신 기능을 활용할 수 있다. 스파크의 기계 학습, 스트림 처리, 그래프 분석 등의 라이브러리는 모두 스칼라로 작성했기 때문에 새로운 기능이 파이썬이나 R 환경까지 지원하는 데 시일이 걸리는 편이다. 그러므로 스파크가 제공하는 모든 최신 기능을 곧바로 사용하려 한다면 최소한 스칼라에 대해서 조금 은 알아야 하며, 그 기능들을 확장하여 새로운 문제에 적용하려면 스칼라를 어느 정도 능숙 하게 다룰 수 있어야 한다. 스파크의 철학을 이해하기 쉽다. 파이썬이나 R로 스파크를 사용한다 할지라도, 스파크의 API에는 이를 구현한 언어인 스칼 라로부터 시작된 철학이 녹아 있다. 여러분이 다른 언어를 사용하더라도 스칼라로 스파크를 다루는 방법을 알고 있다면 스파크 체계를 이해하고 문제를 ‘스파크답게’ 해결하는 데 도움 이 된다. 다른 데이터 분석 도구들과는 많이 다르기 때문에 설명하기 힘든, 스칼라의 또 다른 장점이 있 다. 만약 R이나 파이썬을 가지고 데이터베이스로부터 데이터를 가져와서 분석해왔다면 데이터 를 SQL로 가져온 후, 작업 환경을 R이나 파이썬으로 바꿔서 그 데이터를 다루고 시각화하는 절차에 익숙할 것이다. 누군가는 클러스터에 저장된 데이터에 접근하여 작업하는 일과 PC에 저장된 데이터를 다루고 시각화하는 일에 각각 다른 언어를 사용해왔을 수도 있다. 오랫동안 사용해 익숙해졌다면 이런 방식의 불편함을 자각하지 못할 수도 있다. 스칼라와 스파크를 사용한다면 이야기가 달라진다. 어떤 경우에도 같은 언어를 사용할 수 있기 때문이다. 스칼라 코드를 작성하여 스파크를 통해 클러스터에서 데이터를 가져오고, 스칼라 코 드를 작성하여 그 데이터를 로컬 환경에서 다룰 수 있다. 무엇보다 좋은 점은 로컬에서 작성한 스칼라 코드를 데이터가 저장되어 있는 클러스터에 보내서 바로 실행시키는 방식으로, 데이터 를 로컬 환경으로 가져오지 않고도 일을 처리할 수 있다는 것이다. 데이터가 저장되어 있고 처 리되는 위치와 상관없이, 데이터를 조작하고 분석하는 모든 일을 하나의 환경에서 할 수 있다 는 것이 얼마나 혁신적인지 설명하기는 쉽지 않지만, 일단 경험해보면 알 것이다. 필자들은 스 파크를 처음 접했을 때 느꼈던 신비한 힘을 예제에 담아내려고 노력했다.
  30. 30. 32 9가지 사례로 익히는 고급 스파크 분석 2.2 스파크 프로그래밍 모델 스파크 프로그래밍을 위해서 데이터와 이를 담은 저장소가 필요하다. 데이터는 보통 하둡 분산 파일시스템Hadoop Distributed File System (HDFS)과 같은 분산 저장소에 저장한다. 일반적으로 스파크 프로그램은 다음과 같은 몇 개의 연이은 단계로 구성된다. ● 입력 데이터에 적용할 변환을 정의한다. ● 변환된 데이터를 저장소로 보내거나 구동자driver의 로컬 메모리로 반환하는 액션을 수행한다. ● 분산 처리 방식으로 계산된 결과를 바탕으로 로컬 계산을 수행한다. 이 작업은 다음에 수행할 변환과 액션을 결정하는 기준이 될 수도 있다. 스파크를 이해한다는 것은 스파크 프레임워크가 제공하는 두 가지 기능 분류인 저장storage과 실 행execution의 관계를 이해한다는 것이다. 스파크는 데이터 처리 파이프라인의 어떤 지점에서도 데이터를 메모리에 캐시하여 나중에 재사용할 수 있도록 함으로써, 저장과 실행을 훌륭하게 연 결해두었다. 2.3 레코드 링크 우리가 이 장에서 논의할 문제는 문헌과 실무 현장에서 엔티티 해소entity reolution, 레코드 중복 제 거record deduplication, 병합 및 제거merge-and-purge, 목록 정리list washing 등 다양한 이름으로 불리고 있 다. 모순적이게도 이 문제가 다양한 이름으로 불리기 때문에 문제 해결을 위한 기술들을 훑어 보고자 해도 관련 논문조차 다 찾아내기 어렵다. 오히려 이 데이터 정제문제에 대한 참고 문헌 들에서 중복 제거를 수행할 데이터 과학자가 필요한 처지다! 이 장의 목적을 원만히 이루기 위 해 이제부터 ‘같은 실체를 가리키는 레코드들을 연결짓는’ 이 문제를 레코드 링크record linkage라 부 르겠다. 이 문제의 일반적인 형태는 다음과 같다. 하나 또는 그 이상의 데이터 출처로부터 데이터를 수 집하여 취합하면 그 속의 레코드 일부가 실제로는 같은 고객, 같은 환자, 같은 위치, 같은 행사 등 동일한 실체를 가리킬 수 있다. 각 실체는 이름, 주소, 생일과 같은 여러 속성을 가지고 있어 서 동일한 실체를 가리키는 레코드들을 찾아내려면 이 속성값을 이용해야 한다. 안타깝게도 이
  31. 31. 33Chapter 2 - 스칼라와 스파크를 활용한 데이터 분석 속성값들은 불완전하다. 형식이 다르거나 오타가 있거나 값이 누락되었을 수 있다. 그러므로 단순하게 속성이 같은지만을 검사한다면 상당수의 중복 레코드를 놓치게 될 것이다. [표 2-1] 을 살펴보자. 표 2-1 레코드 링크의 어려움 이름 주소 도시 주 전화번호 조시의 커피숍 선셋 대로 1234 서 할리우드 CA (213)-555-1212 조시 코피 선셋 대로 1234, 서 할리우드 CA 555-1212 커피숍 체인 #1234 선셋 가 1400, 2 할리우드 CA 206-555-1212 커피숍 체인 지역 사무소 선셋 가 1400, 2호실 할리우드 캘리포니아 206-555-1212 이 표에서 위의 두 줄은 각각 ‘서 할리우드’와 ‘할리우드’라는 도시에 있는 서로 다른 커피숍처럼 보인다. 하지만 이는 입력상의 실수로, 사실은 같은 커피숍을 가리킨다. 그다음의 두 줄은 주 소가 같지만 2개의 서로 다른 사업장을 가리키고 있는데, 하나는 실제 커피숍이며 다른 하나는 지역의 체인점 사무소다. 둘 다 시애틀에 있는 본사의 대표 전화번호가 기록되어 있다. 이 예제는 레코드 링크가 얼마나 어려운지를 보여준다. 각각의 묶음이 서로 유사하게 보이더라 도 중복이 있는지를 결정하기 위해 사용하는 기준은 묶음마다 다르다. 사람은 직관으로 쉽게 구분할 수 있겠지만 컴퓨터가 그 구분법을 학습하기에는 어려운 형태다. 2.4 스파크 셸과 SparkContext 시작하기 여기에서는 UC 어바인의 기계 학습 데이터 저장소UC Irvine Machine Learning Repository에서 구할 수 있 는 표본 데이터를 사용한다. 이 저장소에서 연구와 교육을 위한 흥미로운 (더구나 무료인) 데 이터셋들을 구할 수 있다. 우리가 분석할 데이터셋은 2010년에 독일의 한 병원에서 실시한 레 코드 링크 연구에서 나온 것으로, 환자의 성과 이름, 주소, 생일 등 몇 가지 기준에 따라 묶은 수백만 건의 환자 기록 묶음이 들어 있다. 각 묶음에는 문자열 유사도에 따라 0.0부터 1.0까지 점수를 매겼고, 그 후 같은 사람을 표현한 묶음과 그렇지 않은 묶음을 분류해 일일이 표시하였 다. 데이터셋을 만드는 데 사용한 필드 자체의 원래 값은 환자의 개인 정보를 보호하기 위해 제
  32. 32. 34 9가지 사례로 익히는 고급 스파크 분석 거되었으며 식별번호, 필드별 유사도 점수, 묶음별 실제 분류값(같은 사람인지 여부)이 레코 드 링크 연구 용도로 발행되었다. 아래와 같이 셸shell 명령어로 저장소로부터 데이터를 가져오자. $ mkdir linkage $ cd linkage/ $ curl -L -o donation.zip http://bit.ly/1Aoywaq $ unzip donation.zip $ unzip 'block_*.zip' 사용할 수 있는 하둡 클러스터가 있으면, HDFS에 블록 데이터용으로 디렉터리를 생성하고 데 이터 파일을 그 디렉터리에 복사한다. $ hadoop fs -mkdir linkage $ hadoop fs -put block_*.csv linkage 이 책의 예제 코드는 1.2.1 버전의 스파크를 사용한다. 필요한 릴리스는 스파크 프로젝트 사이 트에서 내려받을 수 있다(http://spark.apache.org/downloads.html). 클러스터 환경을 사용 하든 로컬 PC 환경을 사용하든, 스파크 참조 문서를 보고 환경을 설정하면 된다(http://spark. apache.org/docs/latest/). 이제 spark-shell을 실행할 준비가 되었다. spark-shell은 스파크 확장 API를 제공하는 스 칼라 REPLread-eval-print loop이다. REPL이라는 용어가 생소하다면 R 환경과 유사한 것으로 생각 하면 된다. spark-shell은 스칼라 프로그래밍 언어를 사용하여 함수를 정의하고 데이터를 다 룰 수 있는 공간이다. YARN을 지원하는 하둡 클러스터가 있다면 스파크 마스터를 yarn-client로 지정해서 스파 크 작업을 클러스터에서 실행할 수 있다. $ spark-shell --master yarn-client PC에서 실행하려면 local[N] 인수를 지정하여 실행하면 된다. 여기에서 N은 실행할 스레드 의 개수다. 이 값을 *로 지정하면 가용한 CPU 코어 개수로 자동으로 설정된다. 예를 들어 사용 할 PC가 8코어 장비라면 8개의 스레드로 실행된다.
  33. 33. 67Chapter 3 - 오디오스크로블러 데이터셋으로 음악 추천하기 “De gustibus non est disputandum.” (취향에 이유를 따지지 마라.) 누군가 나에게 직업을 물을 때 ‘데이터 과학’ 또는 ‘기계 학습’이라고 직설적으로 대답하면, 들리 기야 멋있게 들리지만 반응은 싸한 편이다. 실제 데이터 과학자들조차도 이 용어의 뜻을 명확 하게 정의하지 못하고 있으니(큰 데이터를 저장하고, 계산하고, 무언가 예측하는 일?) 당연히 그럴 만하다. 예를 들어 이야기해보자. “아마존에서 고객이 과거에 구매한 책들과 유사한 책을 추천해주는 걸 알고 계신가요? 정말요? 네. 바로 그게 제가 하는 일입니다.” 추천 엔진은 적어도 내 주변 사람은 모두 알고 있으며, 또 많은 사람이 아마존을 통해 경험한 대규모 기계 학습의 사례일 것이다. 소셜 네트워크에서 동영상 사이트, 그리고 온라인 소매업 까지 모든 영역에 적용되는 공통분모에 해당하는 것이며, 또한 실제로 동작하는 모습을 직접 관찰할 수도 있다. Gmail이 우리가 신경 쓰지 않아도 스팸을 골라내는 그 방법으로, 스포티파 이Spotify 역시 재생할 음악을 컴퓨터가 골라주고 있다는 사실을 알고 있다. 다른 기계 학습 알고리즘에 비해 추천 알고리즘의 결과는 훨씬 직관적이다. 게다가 흥미롭기까 지 하다. 개인의 음악 취향이 너무 사적이어서 설명하기 어렵다고 누구나 생각하지만, 추천 엔 오디오스크로블러 데이터셋으로 음악 추천하기 CHAPTER 3 션 오언
  34. 34. 68 9가지 사례로 익히는 고급 스파크 분석 진은 우리가 좋아할 것으로 생각하지도 못한 음악을 찾아내는 놀라운 일을 해낸다. 추천 엔진이 널리 사용되는 음악과 영화 분야에서는 추천된 목록이 누군가 과거에 듣거나 본 콘텐츠와 왜 잘 들어맞는지를 추리해내기가 상대적으로 쉽다. 하지만 모든 군집화clustering1 나 분 류classification 알고리즘이 설명하기 쉬운 건 아니다. 예컨대 서포트 벡터 머신support vector machine 분 류기는 계수들의 집합으로 구성되는데, 예측은 하더라도 그 계수들의 의미를 설명하기란 전문 가조차도 쉽지 않다. 그래서 앞으로 3개의 장에 걸쳐서 스파크의 핵심 기계 학습 알고리즘을 다루기 전에, 이번 장 에서 음악에 특화된 추천 엔진을 먼저 들여다보는 것이 좋다고 판단했다. 스파크와 MLlib을 실 제 세상의 문제에 적용하는 방식을 소개하고, 또 앞으로 이어질 장에서 더 깊게 들어갈 기본적 인 기계 학습 알고리즘을 소개하는 적절한 방법이라 생각한다. 3.1 데이터셋 이 장의 예제에서는 오디오스크로블러Audioscrobbler에서 공개한 데이터셋을 사용하려 한다. 오디 오스크로블러는 2002년에 초기 인터넷 스트리밍 라디오 서비스를 제공한 last.fm을 위해서 만 들어진 첫 번째 음악 추천 시스템이다. 오디오스크로블러는 스크로블링2 용 오픈 API를 제공했 고, 청취자의 음악 재생 내역을 기록했다. 서드파티 앱과 사이트들이 추천 엔진에 음악 감상 관 련 데이터를 돌려준 덕에, 이 시스템의 사용자는 수백만 명에 이르렀다. 당시의 추천 엔진 관련 연구는 대부분 평점 데이터를 학습하는 데 그쳤다. 즉, “개똥이가 프린 스에게 별점 3개 반을 주었군”과 같은 입력을 가지고 동작하는 도구처럼 보이곤 했다. 오디오스크로블러의 데이터셋이 재미 있는 점은 “개똥이가 프린스를 들었어”와 같은 단순 재생 정보만 기록한다는 것이다. 단순 재생 여부는 평가보다 정보가 적다. 개똥이가 듣는다는 사실 만으로 개똥이가 실제로 좋아하는지 혹은 싫어하는지를 판단할 수 없기 때문이다. 종종 별 관 심 없는 아티스트의 음악을 틀어놓을 때도 있고, 또 음악을 틀어놓고 외출해버릴 수도 있다. 1 옮긴이_ 영어 그대로 클러스터링이라고도 많이 부르나, 이 책에서는 분산 처리 분야의 용어인 클러스터링과 명확히 구분하기 위해 우리말 용어인 군집화를 사용하기로 한다. 2 옮긴이_ 음악을 들을 때 아티스트, 제목, 앨범 등의 정보를 last.fm 서버에 보내는 작업이다.
  35. 35. 69Chapter 3 - 오디오스크로블러 데이터셋으로 음악 추천하기 하지만 감상한 음악을 평가하는 횟수는 음악을 듣는 일에 비해서 훨씬 드물다. 그래서 음악 감 상 데이터 하나의 정보량은 음악 평가 데이터 하나의 정보량보다 적지만, 음악 감상 데이터셋 은 크기도 훨씬 크고, 더 많은 사용자와 아티스트를 포함하며, 정보의 총량도 훨씬 많다. 사용 자와 아티스트 사이의 관계가 어떤 명시적 평가나 ‘좋아요’ 버튼으로 직접 주어지는 대신, 다른 행위로부터 유추할 수 있는 형식이므로 이런 종류의 데이터를 암묵적 피드백implicit feedback이라고 부르기도 한다. 2005년에 last.fm에서 배포한 데이터셋의 스냅샷을 인터넷에서 압축된 파일 형태로 구할 수 있다(http://bit.ly/1KiJdOR). 압축 파일을 내려받은 후, 그 안의 파일을 몇 개 찾아보자. 중심 이 되는 데이터셋은 user_artist_data.txt 파일에 들어 있다. 이 안에는 141,000명의 사용자와 160만 명의 아티스트 정보가 담겨 있으며 약 2,420만 건의 음악 재생 정보가 재생 횟수와 함 께 기록되어 있다. 또한, 이 데이터셋의 artist_data.txt 파일에는 각각의 아티스트에 ID를 부여하고 있다. 음악 이 재생되면 클라이언트 프로그램이 재생되는 아티스트의 이름을 전송하는데, 그 이름은 잘못 기록되었거나 공식 명칭이 아닐 수 있으며, 이러한 오류가 뒤늦게 발견될 수도 있다. 예를 들 어 ‘The Smiths’, ‘Smiths, The’, ‘the smiths’는 데이터셋 안에서는 별도의 아티스트 ID를 가 질지도 모르지만, 이 명칭들은 모두 단 한 사람에게 붙여진 것일 수 있다. 그래서 데이터셋의 artist_alias.txt 파일은 아티스트 명칭의 흔한 오기 패턴과 다양한 변형 표기법으로 기록된 아 티스트 ID를 해당 아티스트의 대표 ID와 연결 짓고 있다. 3.2 교차 최소 제곱 추천 알고리즘 우리는 암묵적 피드백 데이터에 적합한 추천 알고리즘을 선택해야 한다. 우리의 데이터셋은 전 적으로 사용자와 아티스트의 음악 사이의 상호작용으로만 구성된다. 사용자에 대한 어떤 정보 도, 그리고 이름 외에는 아티스트에 대한 어떤 정보도 포함하고 있지 않다. 우리는 사용자와 아 티스트의 속성에 대해 아는 바가 없어도 학습이 가능한 알고리즘이 필요하다. 이런 알고리즘을 일반적으로 협업 필터링collaborative filtering (http://en.wikipedia.org/wiki/Collaborative_filtering) 이라고 한다. 예를 들어 사용자 두 명이 단지 동년배라서 취향이 비슷하다고 이야기하는 것은 협업 필터링이 아니다. 두 사람이 들은 노래 중 같은 것이 많기 때문에 같은 노래를 좋아할 것
  36. 36. 70 9가지 사례로 익히는 고급 스파크 분석 이라고 결정하는 것이 협업 필터링의 예라고 할 수 있다. 수천만 건의 재생 기록을 담은 이 데이터는 일견 방대해 보이지만, 다른 관점에서 보면 밀도가 낮기 때문에 꼭 그렇지도 않다. 평균적으로 한 사용자가 160만 명의 아티스트 중 171명의 노 래만 재생했다. 어떤 사용자는 딱 한 아티스트의 노래만 듣기도 했다. 어찌 되었든 음악을 듣는 누구라도 처음에는 딱 한 곡의 청취 기록만 있었을 것이다! 최종적으로, 대규모 모델을 만들 수 있고 동시에 빠른 추천이 가능한, 확장 가능한 알고리즘이 필요하다. 일반적으로 추천 결과가 내일 나온다면 너무 늦다. 1초 이내의 준 실시간으로 나와 야 한다. 이 예제에서는 잠재 요인latent-factor (http://en.wikipedia.org/wiki/Factor_analysis) 모델로 분류할 수 있는 많은 알고리즘 중 하나를 사용하고자 한다. 잠재 요인 모델은 다수의 사용자 와 상품 사이에서 관측된 상호작용observed interaction을 상대적으로 적은 수의 관측되지 않은, 숨은 원인 unobserved, underlying reason으로 설명하려 할 때 사용한다. 이는 수백만의 사람이 수천 개의 음반 중 특정 음반을 구입한 이유를 (직접 관측할 수 없고 데이터도 주어지지 않은) 수십 개 음악 장르 에 대한 개인 취향으로 설명하는 것과 유사하다. 더 구체적으로는 행렬 분해matrix factorization (http://en.wikipedia.org/wiki/Non-negative_matrix_ factorization) 모델을 사용할 것이다. 수학적으로 이들 알고리즘에서는 사용자와 제품 데이터 를 큰 행렬 A로 간주해 다루는데, A는 사용자 i가 아티스트 j의 음악을 들었다면 A의 i행 j열 에 값이 존재하는 행렬이다. A는 희소 행렬sparse matrix이다. 사용자-아티스트의 가능한 모든 조합 중 오직 극소수만이 실제 데이터로 등장하기 때문에 이 행렬의 원소 대부분은 0이 된다. 이들 행렬 분해 알고리즘은 A를 더 작은 행렬 X와 Y의 행렬곱으로 분해하는데, 이 X와 Y는 매우 길쭉하다. A가 다수의 행과 열을 가지기 때문에 X와 Y는 매우 많은 행을 가지게 되는 데 반해, 열은 몇 개(k ) 되지 않는다. k개의 열은 상호작용하는 데이터를 설명하는 데 사용하는 잠재 요 인에 해당한다. [그림 3.1]에서 볼 수 있듯, k가 작기 때문에 이 분해는 근사치일 수밖에 없다.
  37. 37. 71Chapter 3 - 오디오스크로블러 데이터셋으로 음악 추천하기 A X k k YT 그림 3.1 행렬 분해 원래의 행렬 A는 매우 희소한 데 비해 행렬곱 XYT는 밀도가 매우 높아서 이 알고리즘을 행렬 채우기matrix completion 알고리즘이라고 부를 때도 있다. 설사 값이 0인 원소가 있다 할지라도 매우 드물게 나타나므로, 이 모델은 A의 근삿값일 뿐이다. 원래의 행렬 A에서 결측된(즉, 값이 0 인) 많은 원소에 대한 값조차도 생성한다는(채워준다는) 관점에서 행렬 분해는 하나의 모델이 라 할 수 있다. 다행히도 이는 선형대수학이 직관과 아주 잘 들어맞는 경우다. 이 두 행렬은 각 사용자와 각 아 티스트를 하나씩의 행으로 담고 있다. 이 행들은 매우 작은 수(k개)의 값만을 가진다. 그리고 각 값은 모델에서 숨어 있는 특징에 대응한다. 그래서 행들은 사용자와 아티스트가, 아마도 취 향이나 장르에 대응하리라 추측되는, 이들 잠재 요인과 얼마나 밀접하게 관련되는지를 표시하 게 된다. 그리고 사용자-잠재 요인 행렬과 잠재 요인-아티스트 행렬의 행렬곱은 사용자-아티 스트 상호작용 밀집 행렬의 완벽한 근사치에 해당한다. 안타까운 점은 A를 완벽하게 표현하기에는 X와 Y가 충분히 크지 않아(선형대수학에서는 계 수rank가 너무 작다고 기술한다. http://bit.ly/1ALoQKF) A = XYT의 일반적인 해를 구할 수 없다는 것이다. 알고 보면 사실은 좋은 일이다. A는 발생할 수 있는 모든 상호작용 중 아주 작 은 표본일 뿐이다. 어떤 면에서 A는 정보가 매우 드문드문 존재하는 행렬이므로 (크지 않은 k 개의 잠재 요인으로 잘 설명해야 한다는 감춰진 진실의 관점에서 보면) 설명하기 어려운 것이 라 믿게 된다. 고양이 그림의 직소 퍼즐을 생각해보자. 완성된 퍼즐을 보고 고양이라고 설명하 기는 아주 쉬워도, 조각 몇 개만 쥐고 있다면 이것이 어떤 그림이라고 설명하기란 매우 어렵다.
  38. 38. 72 9가지 사례로 익히는 고급 스파크 분석 XYT은 여전히 A에 가능한 한 가까워야 한다. 어쨌든 이것이 우리가 해야 할 일이다. 정확하 게 구하지는 못할 것이고 또 구할 수도 없다. 설상가상으로, X와 Y의 정답 모두를 동시에 직접 적으로 구할 수조차 없다. 그나마 나은 소식은 Y를 알고 있을 때는 X의 정답을 구할 수 있음이 자명하고, 그 반대도 마찬가지라는 것이다. 뭐, 아직은 둘 다 모르는 상태지만! 다행히 이런 딜레마를 극복하고 제대로 된 해를 찾아주는 알고리즘이 있다. 더 구체적으로 설명하면, 이 장의 예제에서는 X와 Y를 계산하기 위해 교차 최소 제곱Alternating Least Squares (ALS, http://bit.ly/16ilZZV) 알고리즘을 사용할 것이다. 이런 종류의 접근법은 넷클릭스 프라이즈 Netflix Prize (http://en.wikipedia.org/wiki/Netflix_Prize)가 열리던 시절에 발표된 <암묵적 피 드백 데이터셋에 대한 협업 필터링Collaborative Filtering for Implicit Feedback Datasets>(http://yifanhu.net/ PUB/cf.pdf)과 <넷플릭스 프라이즈를 위한 대규모의 병렬 협업 필터링Large-scale Parallel Collaborative Filtering for the Netflix Prize>(http://goo.gl/y34MK2)과 같은 논문 덕에 유명해졌다. 사실 스파크의 MLlib이 제공하는 ALS 알고리즘도 이 논문들에서 아이디어를 가져와 구현한 것이다. Y의 값을 모르지만, 무작위로 값이 선택된 행 벡터로 초기화할 수는 있다. 그런 다음 간단한 선형대수를 통해 주어진 A와 Y에 대한 최적 X를 구할 수 있다. 사실, X의 각 행 i는 Y와 A의 한 행의 함수로 독립적으로 쉽게 계산할 수 있다. 독립적으로 수행할 수 있으니 병렬 처리가 가 능하며, 이는 대규모로 계산할 때 매우 훌륭한 장점이다. AiY(YT Y )-1 = Xi 이 수식의 양 변을 똑같이 만들기란 불가능하므로, 우리의 목표는 양 변의 차이인 |AiY (YT Y )-1 - Xi|, 즉 두 행렬에서 대응되는 원소 간 차의 제곱의 합을 최소화하는 것이다. 여기서 최소 제곱least squares이라는 이름이 유래되었다. 실전에서는 역행렬을 구하는 방법으로 계 산하지 않고 QR 분해QR decomposition (http://en.wikipedia.org/wiki/QR_decomposition)와 같은 방법으로 더 빠르게 바로 계산할 수 있다. 앞의 식은 단순히 행 벡터가 어떻게 계산되는지의 이 론을 설명하기 위한 것이다. 같은 방법으로 X로부터 각 Yj를 계산할 수 있다. 그리고 다시 같은 방법으로 Yj로부터 X를 계 산할 수 있다. 그래서 이 과정을 교차 alternating라고 한다. 이제 한 가지 작은 문제만 남았다. Y는 무작위로 만들어진 값이므로, 비록 X가 최적값으로 계산되었지만 가짜 해에 불과하다는 것이다. 다행히도 이 과정을 반복해가다 보면 종국에는 X와 Y 모두 제대로 된 해로 수렴하게 된다.
  39. 39. 93Chapter 4 - 의사 결정 나무로 산림 식생 분포 예측하기 예측은 매우 어려우며, 미래에 대해서는 특히 그렇다. -닐스 보어 19세기 후반 영국의 우생학자 프랜시스 골턴 경Sir Francis Galton은 완두콩과 사람 등을 대상으로 그 키를 측정하는 데 집중했다. 그는 키가 큰 완두콩과 사람의 다음 세대 역시 평균보다 크다는 사 실을 발견했다. 놀라운 발견이라고는 할 수 없다. 하지만 그다음 세대는 평균적으로 부모보다 조금 작았다. 사람의 경우 키가 2미터에 달하는 야구 선수의 자식은 물론 평균보다야 크겠지 만, 그렇다고 2미터까지 크지는 않는다는 뜻이다. 이 연구의 뜻하지 않은 결과 덕분에 골턴은 부모 세대의 키와 비교하여 자식 세대의 키를 정리 해보았고 둘 사이에 대략적인 선형 관계가 있음을 알아냈다. 큰 부모 완두콩은 큰 자식 완두콩 으로 이어졌지만, 큰 부모보다는 조금 작았다. 작은 부모 완두콩도 작은 자식 완두콩으로 이어 지지만, 역시 부모보다는 조금 컸다. 이 선형 관계에서 직선의 기울기는 1보다 작은 양수였고, 골턴은 이 현상을 평균으로의 회귀regression to the mean라고 표현했다. 오늘날 우리도 이 표현을 사용 한다. 당시에는 인지하지 못했을지언정, 나에게 이 선형 관계는 예측 모델의 오래된 예로 보인다. 두 값을 연결한 선이 있다는 것은 하나의 값이 다른 값에 대해 많은 것을 시사할 수 있음을 의미한 다. 어떤 완두콩의 자식의 크기는 그 완두콩과 비슷할 것이라고 가정하는 것보다 이 관계를 이 용하여 자식 세대의 크기를 계산하는 쪽이 훨씬 정확할 것이다. 의사 결정 나무로 산림 식생 분포 예측하기 CHAPTER 4 션 오언
  40. 40. 94 9가지 사례로 익히는 고급 스파크 분석 4.1 회귀로 돌아와서 통계학이 체계를 갖춘 지 한 세기 이상이 지나고 기계 학습과 데이터 과학이 등장한 오늘날 에도, 주어진 값들로부터 새로운 값을 예측하는 방법으로 ‘회귀(http://en.wikipedia.org/ wiki/Regression_analysis)’를 꼽는다. 심지어 값이 평균에 가까워지거나 실제로 가까워지 려는 움직임조차 없을지라도 말이다. 또한, 회귀 기법은 분류 기법과 연관되어 있다(http:// en.wikipedia.org/wiki/Statistical_classification). 일반적으로 회귀는 크기, 수입, 온도와 같은 숫자를 예측하는 반면, 분류는 ‘스팸 메일’, ‘고양이 사진’과 같은 레이블이나 범주를 예측하 는 데 사용한다. 회귀와 분류의 연결 지점은, 두 방법 모두 하나 이상의 값이 주어졌을 때 하나 이상의 값 을 예측하는 일이라는 것이다. 이를 위해서 학습을 위한 입출력 체계가 구성되어 있어야 하 며, 질문과 이에 대한 답변도 제공되어야 한다. 이러한 탓에 회귀와 분류는 지도 학습supervised learning (http://ko.wikipedia.org/wiki/지도_학습) 유형에 들어간다. 분류와 회귀는 가장 오래되고 가장 잘 연구된 유형의 예측 분석이다. 서포트 벡터 머신support vector machine, 로지스틱 회귀logistic regression, 나이브 베이즈 분류naïve Bayes, 신경망neural networks, 그리 고 딥 러닝deep learning과 같은 분석 패키지나 라이브러리에서 자주 접하는 대부분의 알고리즘은 분류와 회귀 기법이다. 3장의 주제인 추천 엔진도 더 직관적이라는 이유로 앞 장의 주제로 사 용했지만, 역시 비교적 최근에 따로 떨어져나온 기계 학습의 하위 주제일 뿐이다. 이번 장에서는 분류와 회귀 모두에 적용할 수 있는 대중적이고 유연한 알고리즘인 의사 결정 나 무(http://en.wikipedia.org/wiki/Decision_tree), 그리고 그것의 확장판인 랜덤 포레스트 (http://en.wikipedia.org/wiki/Random_forest)를 다루고자 한다. 이 알고리즘과 관련한 흥미로는 사실은 닐스 보어가 미래 예측에 대해서 말한 것과 달리 미래를 예측에 사용할 수 있 으며, 적어도 아직은 우리가 명확히 알지 못하는 것을 예측할 수 있다는 것이다. 예를 들어 온 라인에서의 행동 양식으로부터 차를 살 가능성을 예측한다든지, 전자우편 내의 어떤 단어로부 터 이 전자우편이 스팸인지 여부를 찾아낸다든지, 위치와 토양의 화학성분비가 주어졌을 때 몇 제곱미터의 땅에서 작물을 재배할 수 있는지 등과 같은 것이다.
  41. 41. 95Chapter 4 - 의사 결정 나무로 산림 식생 분포 예측하기 4.2 벡터와 특징 특정 데이터셋과 알고리즘을 선택하는 방법, 그리고 회귀와 분류가 동작하는 방법을 설명하기 위해서는 우선 입력과 출력을 나타내는 용어들을 간단하게 정의할 필요가 있다. 오늘의 일기를 전제로 내일의 최고 기온을 예측하는 문제를 생각해보자. 별문제 없어 보이지 만, 그저 ‘오늘의 일기’라고 하면 너무 광범위한 개념이라 학습 데이터로 사용하려면 구조화해 야 한다. 오늘 일기의 다음과 같은 특징으로부터 내일 기온을 예측할 수 있다. ● 오늘의 최고 기온 ● 오늘의 최저 기온 ● 오늘의 습도 ● 흐림(cloudy), 비(rainy), 맑음(clear)과 같은 날씨 유형 ● 내일 일시적 한파를 예상한 기상 예보관의 수 이 특징들은 종종 차원dimension, 예측 변수predictor 또는 단순히 변수variable로 불린다. 각각의 특징은 정량화될 수 있다. 예를 들어 최고 기온과 최저 기온은 섭씨온도로 측정하고, 습도는 0과 1 사 이의 소수로 계량하고, 날씨 유형은 ‘cloudy’, ‘rainy’, ‘clear’로 표시할 수 있다. 물론 예보관의 수는 정수다. 이에 따라 오늘의 일기는 ‘13.1, 19.0, 0.73, cloudy, 1’과 같은 하나의 리스트로 축약할 수 있다. 이 다섯 가지 특징을 순서대로 묶어 특징 벡터feature vector라고 부르고 어떤 날의 일기를 표현할 수 있다. 이 벡터에 숫자형이 아닌 값이 포함될 수 있고, 또 어떤 값은 생략될 수도 있다는 점만 제 외하면 선형대수에서의 벡터 사용법과 유사하다. 이들 특징은 모두 같은 형식이 아니다. 앞의 두 개는 섭씨온도로 측정한 값이지만, 세 번째는 단위가 없는 비율이다. 네 번째는 아예 수가 아니고, 다섯 번째는 음이 아닌 정수다. 논하는 바의 목적에 맞춰 이 책에서는 범주형 특징categorical feature과 수치형 특징numeric feature 두 종류 의 특징만 다룰 것이다. 여기서 수치형 특징은 수를 사용해 정량화할 수 있고 순서가 의미가 있 다. 예를 들어 오늘의 최고 기온인 23도가 어제 최고 기온인 22도보다 높다고 이야기하는 것은 유효하다. 날씨 유형을 제외한 모든 특징은 수다. ‘clear’와 같은 용어는 수도 아니고 순서도 없
  42. 42. 96 9가지 사례로 익히는 고급 스파크 분석 다. 그래서 ‘cloudy’가 ‘clear’보다 크다고 말하는 것은 의미가 없다. 이것이 범주형 특징에 해 당하며, 여러 불연속discrete 값 중 하나를 취하게 된다. 4.3 학습 예제 예측을 위해서는 학습 알고리즘을 데이터로 학습시켜야 한다. 이를 위해 과거의 데이터로부터 얻은 많은 수의 입력 데이터와 각각에 대응하는 정확한 출력 데이터가 필요하다. 이 문제에서 예를 들자면, 어느 날 기온은 최저 12도, 최고 16도이며, 습도는 10%, 날씨는 맑고, 아무도 한 파 예보를 하지 않았다는 그 날의 일기 정보와 함께, 다음 날의 최고 기온인 17.2도가 동시에 학습 알고리즘에 제공되는 형태다. 이러한 예제 데이터가 충분히 많이 있어야 다음 날의 최고 기온을 예측하는 학습 알고리즘을 제대로 학습시킬 수 있다. 특징 벡터는 학습 알고리즘에 입력을 표현하기 위한 체계적인 방법을 제공한다. 여기에서는 {12.5, 15.5, 0.10, clear, 0}가 된다. 예측의 출력이나 목표 또한 특징으로 간주할 수 있는 데, 예를 들어 내일 최고 기온 17.2는 수치형 특징이다. 특징 벡터에 목표도 하나의 특징으로 포함시키는 일이 드물지 않다. 학습을 위한 완전한 예제 는 목표인 다음 날의 최고 기온까지 포함한 {12.5, 15.5, 0.10, clear, 0, 17.2}까지로 봐야 하며, 이 예제들의 집합을 학습 데이터셋training set이라고 부른다. 회귀에서는 수를, 분류에서는 범주를 대상으로 삼는다는 점을 기억하자. 모든 회귀나 분류 알 고리즘이 범주형 특징을 다루거나 범주를 목적으로 할 수 있는 것은 아니다. 일부는 수치형 특 징으로만 제한된다. 4.4 의사 결정 나무와 랜덤 포레스트 의사 결정 나무decision tree에 속하는 알고리즘은 범주형 특징과 수치형 특징 모두를 자연스럽게 다 룰 수 있다. 병렬로 쉽게 구축할 수도 있다. 의사 결정 나무는 데이터 내의 독특한 값outlier, 이상치 들에 잘 휘둘리지 않는 특성을 가지는데, 몇몇 극단적인 오류를 내포한 값들이 예측치에 영향 을 줄 수 없음을 의미한다. 그리고 전처리나 정규화 과정을 거치지 않고도 다른 유형과 다른 척

×