MACHINE LEARNING IN ACTION by Peter Harrington Original English language edition published by Manning Publications, 178 South Hill Drive, Westampton, NY 08060, USA. Copyright c 2012 by Manning Publications Co. Korean edition copyright c 2013 by J-Pub. All rights reserved. 이 책의 한국어판 저작권은 대니홍 에이전시를 통한 저작권사와의 독점 계약으로 제이펍 출판사에 있습니다. 신저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단전재와 무단복제를 금합니다. 초판 1쇄 발행 2013년 6월 26일 지은이 피터 해링턴 옮긴이 김영진 펴낸이 장성두 펴낸곳 제이펍 출판신고 2009년 11월 10일 제406-2009-000087호 주소 경기도 파주시 문발동 530-1 파주출판도시 30-1 뮤즈빌딩 403호 전화 070-8201-9010 / 팩스 02-6280-0405 홈페이지 www.jpub.kr / 이메일 jeipub@gmail.com 편집부 이민숙, 이 슬 / 본문디자인 초심디자인 용지 신승지류유통 / 인쇄 한승인쇄사 / 제본 동호문화사 ISBN 978-89-94506-66-1 (93000) 값 30,000원 이 책은 저작권법에 따라 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금지하며, 이 책 내용의 전부 또는 일부를 이용하려면 반드시 저작권자와 제이펍의 서면동의를 받아야 합니다. 잘못된 책은 구입하신 서점에서 바꾸어 드립니다. 제이펍은 독자 여러분의 책에 관한 아이디어와 원고 투고를 기다리고 있습니다. 책으로 펴내고자 하는 아이디어나 원고가 있으신 분께서는 책에 대한 간단한 개요와 차례, 구성과 저(역)자 약력 등을 메일로 보내주세요. 보내실 곳: jeipub@gmail.com
조셉과 밀로에게
역자 머리말 xvi 머리말 xviii 감사의 글 xxi 이 책에 대하여 xxiii 겉표지 삽화에 대하여 xxviii 제1부 분류 1장 기계 학습 기초 1.1 기계 학습이란 무엇인가? 5 1.1.1 센서 및 데이터 홍수 6 1.1.2 기계 학습은 점점 더 중요해질 것이다 7 1.2 주요 전문용어 8 1.3 기계 학습의 주요 기술 11 1.4 올바른 알고리즘 선정 방법 12 1.5 기계 학습 응용 프로그램 개발 단계 14 1.6 왜 파이썬인가? 16 1.6.1 실행 가능한 의사코드 16 1.6.2 인기 좋은 파이썬 16 1.6.3 장점 17 1.6.4 단점 18 1.7 NumPy 라이브러리로 시작하기 19 1.8 요약 21 vi
차 례 2장 k-최근접 이웃 알고리즘 2.1 거리 측정을 이용하여 분류하기 24 2.1.1 준비: 파이썬으로 데이터 불러오기 26 2.1.2 knn 분류 알고리즘 실행하기 28 2.1.3 분류기 검사하기 30 2.2 예제: knn을 이용하여 데이트 사이트의 만남 주선 개선하기 31 2.2.1 준비: 텍스트 파일의 데이터 구문 분석하기 32 2.2.2 분석: 매스플롯라이브러리로 scatter 플롯 생성하기 34 2.2.3 준비: 수치형 값 정규화하기 37 2.2.4 검사: 전체 프로그램으로 분류기 검사하기 39 2.2.5 사용: 모두에게 유용한 시스템 만들기 41 2.3 예제: 필기체 인식 시스템 42 2.3.1 준비: 이미지를 검사 벡터로 변환하기 43 2.3.2 검사: 필기체 번호에 knn 적용하기 44 2.4 요약 46 3장 의사결정 트리: 한 번에 하나의 속성으로 데이터 집합 분할하기 3.1 트리 구조 50 3.1.1 정보 이득 52 3.1.2 데이터 집합 분할하기 56 3.1.3 재귀적으로 트리 만들기 59 3.2 매스플롯라이브러리 주석으로 파이썬에서 트리 플롯하기 63 3.2.1 매스플롯라이브러리 주석 64 3.2.2 주석 트리 구축하기 66 3.3 분류기 검사와 저장 72 3.3.1 검사: 분류를 위한 트리 사용 72 3.3.2 사용: 의사결정 트리 계속 유지하기 73 vii
3.4 예제: 콘택트렌즈 유형 예측하기 74 3.5 요약 77 4장 나이브 베이스: 확률 이론으로 분류하기 4.1 베이지안 의사결정 이론으로 분류하기 79 4.2 조건부 확률 81 4.3 조건부 확률로 분류하기 82 4.4 나이브 베이스로 문서 분류하기 83 4.5 파이썬으로 텍스트 분류하기 85 4.5.1 준비: 텍스트로 단어 벡터 만들기 85 4.5.2 훈련: 단어 벡터로 확률 계산하기 88 4.5.3 검사: 실제 조건을 반영하기 위해 분류기 수정하기 91 4.5.4 준비: 중복 단어 문서 모델 94 4.6 예제: 스팸 이메일 분류하기 95 4.6.1 준비: 텍스트 토큰 만들기 95 4.6.2 검사: 나이브 베이스로 교차 검증하기 97 4.7 예제: 나이브 베이스를 사용하여 개인 광고에 포함된 지역 특색 도출하기 99 4.7.1 수집: RSS 피드 불러오기 100 4.7.2 분석: 지역적으로 사용되는 단어 표현하기 104 4.8 요약 105 5장 로지스틱 회귀 5.1 로지스틱 회귀와 시그모이드 함수로 분류하기: 다루기 쉬운 계단 함수 108 5.2 가장 좋은 회귀 계수를 찾기 위해 최적화 사용하기 110 5.2.1 기울기 상승 110 5.2.2 훈련: 기울기 상승을 사용하여 가장 좋은 매개변수 찾기 112 5.2.3 분석: 의사결정 경계선 플롯하기 115 viii
차 례 5.2.4 훈련: 확률적인 기울기 상승 117 5.3 예제: 말의 배앓이 치사율 평가하기 122 5.3.1 준비: 데이터에서 누락된 값 다루기 123 5.3.2 검사: 로지스틱 회귀로 분류하기 125 5.4 요약 127 6장 지지 벡터 머신 6.1 최대 마진으로 데이터 분리하기 129 6.2 최대 마진 찾기 131 6.2.1 분류기 관점에서의 최적화 문제 구성하기 132 6.2.2 일반적인 기본 구조로 지지 벡터 머신에 접근하기 134 6.3 SMO 알고리즘으로 효율적인 최적화하기 134 6.3.1 플랫의 SMO 알고리즘 135 6.3.2 간략한 형태의 SMO로 적은 양의 데이터 집합 해결하기 135 6.4 전체 플랫 SMO를 이용해 최적화 속도 올리기 143 6.5 더 복잡한 데이터를 위해 커널 사용하기 151 6.5.1 고차원의 데이터를 커널을 이용해 매핑하기 151 6.5.2 반지름 성향 함수 152 6.5.3 검사를 위한 커널 사용 155 6.6 예제: 필기체 인식 예제 다시 적용하기 159 6.7 요약 162 7장 에이다부스트 메타 알고리즘으로 분류 개선하기 7.1 데이터 집합의 다양한 표본을 사용하는 분류기 165 7.1.1 배깅: 임의로 추출한 재표본 데이터로부터 분류기 구축하기 165 7.1.2 부스팅 166 7.2 훈련: 오류에 초점을 맞춘 분류기 개선 167 ix
7.3 의사결정 스텀프로 약한 학습기 생성하기 169 7.4 전체 에이다부스트 알고리즘 구현하기 173 7.5 검사: 에이다부스트로 분류하기 177 7.6 예제: 에이다부스트에 복잡한 데이터 집합 적용하기 179 7.7 분류 불균형 182 7.7.1 또 다른 성능 측정 방법: 정확도, 재현율 그리고 ROC 182 7.7.2 비용 함수를 가진 분류기의 의사결정 다루기 187 7.7.3 분류 불균형이 있는 데이터를 처리하기 위한 데이터 샘플링 188 7.8 요약 189 제2부 회귀로 수치형 값 예측하기 8장 회귀: 수치형 값 예측하기 8.1 회귀로 최적선 찾기 194 8.2 지역적 가중치가 부여된 선형 회귀 201 8.3 예제: 전복 나이 예측하기 205 8.4 데이터를 이해하기 위한 축소 계수 207 8.4.1 능형 회귀 207 8.4.2 라소 210 8.4.3 전방향 단계별 회귀 211 8.5 성향 / 변화량 관계 215 8.6 예제: 레고 가격 예측하기 217 8.6.1 수집: 구글 쇼핑 API 사용 218 8.6.2 훈련: 모델 구축 220 8.7 요약 225 x
차 례 9장 트리 기반 회귀 9.1 지역적으로 복잡한 데이터 모델링하기 227 9.2 연속적이고 이산적인 속성으로 트리 구축하기 228 9.3 회귀를 위해 CART 사용하기 232 9.3.1 트리 구축하기 233 9.3.2 코드 실행하기 236 9.4 트리 가지치기 238 9.4.1 사전 가지치기 238 9.4.2 사후 가지치기 240 9.5 모델 트리 243 9.6 예제: 일반 회귀와 트리 방법 비교 246 9.7 파이썬에서 GUI를 생성하기 위해 Tkinter 사용하기 250 9.7.1 Tkinter에서 GUI 구축하기 251 9.7.2 매스플롯라이브러리와 Tkinter 접속하기 254 9.8 요약 257 제3부 비지도 학습 10장 k 평균 군집화: 항목 표시가 없는 아이템 그룹 짓기 10.1 k 평균 군집화 알고리즘 262 10.2 후처리로 군집 성능 개선하기 268 10.3 양분하는 k 평균 270 10.4 예제: 지도상의 지역점 군집화 274 xi
10.4.1 야후! 위치찾기 API 275 10.4.2 지리적인 좌표 군집화 278 10.5 요약 281 11장 어프라이어리 알고리즘으로 연관 분석하기 11.1 연관 분석 284 11.2 어프라이어리 이론 286 11.3 어프라이어리 알고리즘으로 빈발 아이템 집합 찾기 288 11.3.1 후보 아이템 집합 생성 289 11.3.2 전체 어프라이어리 알고리즘 사용 292 11.4 빈발 아이템 집합으로 연관 규칙 마이닝하기 296 11.5 예제: 국회 투표 패턴 알아보기 301 11.5.1 수집: 국회 투표 기록에 대한 트랜잭션 데이터 집합 구축 302 11.5.2 검사: 국회 투표 기록의 연관 규칙 310 11.6 예제: 독버섯과 유사한 속성 찾기 312 11.7 요약 314 12장 FP-성장 알고리즘으로 빈발 아이템 집합 찾기 12.1 FP-트리: 데이터 집합을 부호화하는 효과적인 방법 316 12.2 FP-트리 구축하기 318 12.2.1 FP-트리 데이터 구조 생성하기 319 12.2.2 FP-트리 구축하기 320 12.3 FP-트리로 빈발 아이템 집합 마이닝하기 325 12.3.1 기본 패턴 조건 추출하기 326 12.3.2 FP-트리 조건 생성하기 328 12.4 예제: 트위터 피드에서 함께 발생하는 단어 찾기 331 xii
차 례 12.5 예제: 뉴스 사이트에서 클릭 스트림 마이닝하기 336 12.6 요약 337 제4부 부가적인 도구들 13장 데이터 간소화를 위한 주요 구성요소 분석 사용하기 13.1 차원 축소 기술 342 13.2 주요 구성요소 분석 343 13.2.1 좌표 축 이동 343 13.2.2 NumPy에서 PCA 수행하기 345 13.3 예제: PCA로 반도체 제조 데이터 차원 축소하기 348 13.4 요약 352 14장 특이 값 분해로 데이터 간소화하기 14.1 SVD 응용 프로그램 355 14.1.1 잠재적 의미 색인 355 14.1.2 추천 시스템 356 14.2 행렬 인수분해 358 14.3 파이썬 SVD 359 14.4 협력적 여과 기반 추천 엔진 362 14.4.1 유사도 측정 362 14.4.2 아이템 기반 유사도와 사용자 기반 유사도 366 14.4.3 추천 엔진 평가하기 366 14.5 예제: 레스토랑 메뉴 추천 엔진 구축하기 367 xiii
14.5.1 맛보지 못한 음식 추천하기 367 14.5.2 SVD로 추천 개선하기 370 14.5.3 추천 엔진이 가지고 있는 과제 374 14.6 예제: SVD로 이미지 압축하기 375 14.7 요약 378 15장 빅 데이터와 맵 리듀스 15.1 맵 리듀스: 분산 컴퓨팅의 기본 구조 381 15.2 하둡 스트리밍 384 15.2.1 평균과 분산 매퍼 분산처리 385 15.2.2 평균과 분산 리듀서 분산처리 386 15.3 아마존 웹 서비스로 하둡 작업 실행하기 388 15.3.1 AWS에서 제공하는 서비스 388 15.3.2 아마존 웹 서비스 시작하기 389 15.3.3 EMR에서 하둡 작업 실행하기 390 15.4 맵 리듀스에서의 기계 학습 395 15.5 파이썬에서 mrjob을 사용한 맵 리듀스 자동화 397 15.5.1 EMR로 매끄러운 통합을 위해 mrjob 사용하기 398 15.5.2 mrjob에서 맵 리듀스 스크립트의 구조 398 15.6 예제: SVM 분산처리를 위한 페가소스 알고리즘 402 15.6.1 페가소스 알고리즘 403 15.6.2 훈련: mrjob으로 지지 벡터 머신 맵 리듀스 404 15.7 맵 리듀스, 정말로 필요한가? 410 15.8 요약 410 부록 A 파이썬 시작하기 A.1 파이썬 설치 412 A.1.1 윈도우 412 xiv
차 례 A.1.2 맥 OS X 413 A.1.3 리눅스 413 A.2 파이썬에 대한 간단한 소개 414 A.2.1 데이터 유형 414 A.2.2 구조 제어 416 A.2.3 함축 리스트 417 A.3 NumPy에 대한 간단한 소개 418 A.4 뷰티플 수프 423 A.5 Mrjob 423 A.6 스마트 투표 424 A.7 파이썬 트위터 425 부록 B 선형대수학 B.1 행렬 427 B.2 역행렬 430 B.3 표준 432 B.4 미분행렬 432 부록 C 확률 다시 보기 C.1 확률 434 C.2 결합 확률 435 C.3 확률의 기본 규칙 436 부록 D 리소스 찾아보기 440 xv
역자 머리말 이 책은 기계 학습에 관한 내용을 알기 쉽고 활용하기 편하게 설명하고 있습니다. 기계 학습은 말 그대로 컴퓨터에게 학습을 시킨다는 의미를 가지고 있습니다. 하지만 말을 할 수도, 사람의 언어를 이해할 수도 없는 컴퓨터에게 무엇을, 어떻게 가르칠 수 있을까요? 바로 이러한 것을 다루 는 분야가 기계 학습 분야이며, 기계 학습 대부분의 내용은 수학과 통계학 을 기반으로 다루어지고 있습니다. 하지만 이 책은 기계 학습의 각 방법론 을 설명하는 데 수학과 통계학을 사용하지 않고 있습니다. 방법론을 설명 할 때는 우리 주변에서 쉽게 접할 수 있는 내용을 가지고 설명하고, 예제 로 다루어지는 데이터들도 이에 맞게 준비되어 있습니다. 그리고 무엇보 다 중요한 것은 여기서 다루고 있는 소스 코드를 독자가 원하는 곳에 바로 사용할 수 있다는 것입니다. 이 책의 주요 도구인 파이썬 프로그램이 이것을 가능하게 해 주고 있습니다. 파이썬은 그동안 제가 다루었던 그 어떤 프로그램들보다 쉽고 편리한 프로그램이라고 생각합니다. 이 책은 파이썬을 설명하는 책은 아니지만, 따로 공부하지 않아도 이 책의 설명대 로 따라가다 보면 어느새 파이썬을 다루는 자신을 발견하게 될 것입니다. 또한, 다각도의 실험에 사용할 수 있는 데이터의 출처들도 소개하고 있어 연구원들에게도 좋은 참고자료가 될 수 있을 것으로 생각합니다. 이 책을 번역하면서 감사의 말을 전하고 싶은 분들이 많이 있습니다. 우선 책을 번역하는 것이 처음인 저에게 이 책을 번역할 기회를 주시고, 긴 시간 기다려 주신 제이펍 장성두 대표님과 저의 어설픈 번역을 다듬어 주시느라 고생하신 이슬 님께 감사드립니다. 이 분야를 공부하는 데 있어 부족함이 많은 제자인 제게 많은 가르침을 주시고 이끌어주신 숭실대학 교 김명원 교수님께도 깊은 감사와 존경을 표합니다. xvi
역자 머리말 첫 번역을 마무리하기까지 함께 고생해 준 나의 사랑하는 배우자이자, 이 책을 예쁘게 만들어 준 초심디자인 조찬영 님께도 고맙다는 말을 전하고 싶습니다. 그리고 갑자기 전화해 이것저 것 물어 귀찮게 했는데도 조언을 아끼지 않았던 나의 선배 류정우 박사님과 김은주 박사님, 그리고 연구실에서 동고동락하며 많은 도움과 응원을 보내 준 나의 동기 송원문 박사와 송성렬 후배에게도 감사의 말씀을 전합니다. 그리고 항상 믿고 지켜봐 주시는 부모님, 감사합 니다. 그리고 사랑합니다. 2013년 6월 김영진 xvii
머리말 대학 졸업 후 나는 캘리포니아와 중국 본토에 있는 인텔(Intel)에서 일했 다. 원래 계획은 2년 후 대학원으로 돌아가는 것이었으나, 일에 빠져 있다 보니 그 시간이 6년이 되었다. 물론 내가 돌아가야 할 때가 되었다는 것을 알았으나, 야간 학교에 다니거나 온라인 학습을 하는 것은 원하지 않았다. 나는 캠퍼스에 머물면서 대학에서 누릴 수 있는 모든 것에 흠뻑 빠지기를 원했다. 대학에서 가장 좋은 것은 수업을 받거나 연구를 하는 것이 아니라 사람들을 만나고, 세미나에 참가하며, 조직에 가입하는, 수업 이면의 무언가를 배우는 일일 것이다. 2008년쯤, 직업 박람회 준비를 도운 적이 있었다. 나는 누군가와 대형 금융기관에 대해 이야기하기 시작했고, 신용 위험 위치 모델링(position modieling credit risk, 누군가의 대출 청산 가능성에 대하여 계산해 내는 것)에 대해 인터뷰를 했다. 그들은 나에게 확률 미적분(stochastic calculus)을 얼마나 알고 있는지 물었다. 물론 당시에 나는 확률이라는 단어가 어떤 의미를 가지는지 알지 못했다. 그들은 지리적인 위치 때문에 나를 고용했 지만, 나는 일을 견디지 못하고 그만두기로 했다. 하지만 확률에 흥미가 있었던 나는 수강 과목에 확률 이라는 단어가 포함된 강의가 있기를 기대하면서 수강 편람을 보러 갔고, 이산 시간 확률 시스템(discrete time stochastic systems) 이라는 과목을 찾았다. 난 무작정 강의에 참석하기 시작했다. 결국, 교수에게 발각되었지만 그녀는 매우 감사하게도 내가 계속 강의를 들을 수 있도록 허락해 주었다. 수업 첫날, 확률을 적용한 알고리즘을 보았다. 이전에 데이터를 입력하는 것처럼 평균값을 처리하는 알고리즘을 본 적이 있다. 하지만 이것은 그와 달리 편차(variance)와 평균(mean)이 알고리즘의 내부 값으로 존재했다. 이 과정은 시계열(time series) 데이터에 관한 것이었으며, 그래서 데이터 xviii
머리말 의 모든 부분이 주기적인 간격을 갖는 샘플이었다. 나는 수강 제목에 기계 학습(machine learning) 이 포함된 다른 수업을 찾았다. 이 수업에서는 데이터가 시간에 대해 균등하게 간격을 둔다고 간주하지 않았다. 나는 나중에서야 경제학, 전기 공학, 컴퓨터 과학 분야에서 도 비슷한 방법이 사용되고 있다는 것을 깨달았다. 2009년 초에 대학을 졸업하고 소프트웨어 컨설턴트 같은 일을 하기 위해 실리콘 밸리(Silicon Valley)로 갔다. 그 후 2년 동안 매우 폭넓은 기술들을 가진 여덟 개의 회사와 함께 일하면서 크게 두 가지를 깨달았다. 첫 번째는 매력적인 응용 프로그램을 개발하기 위해서는 보다 더 많은 데이터를 다룰 필요가 있다는 것이고, 두 번째는 고용주가 필요로 하는 사람은 이론을 이해하면서 프로그램도 다룰 수 있는 사람이라는 것이다. 프로그래머의 주요 작업은 파이프를 연결(connecting pipes, 프로그래머가 데이터의 흐름을 연결 하는 것을 뜻함)하는 것으로 구성된다. 예를 들면, 당신은 온라인으로 물건을 파는 응용 프로그 램을 만들 수 있다. 물건을 게시하고, 사람들이 그 게시물을 볼 수 있도록 해야 한다. 이를 위해 당신은 사용자가 판매하고자 하는 물건에 대한 데이터를 입력할 수 있게 하고, 입력된 데이터를 저장소로 보내는 웹 형태를 만들 수 있다. 그런 다음, 팔 물건을 다른 사용자가 볼 수 있도록 데이터를 규칙에 맞게 데이터 저장소 밖으로 보내야만 하며, 그것을 적당하게 전시해야 한다. 나는 사람들이 계속해서 이러한 방법으로 돈을 만들 것이라고 확신한다. 그러나 정말로 좋은 응용 프로그램을 만들기 위해서는 지능(intelligence)적인 수준이 좀 더 필요하다. 이러한 지능은 부적절하게 배치된 것을 제거하고, 사기 거래를 감지하고, 사용자가 좋아할 만한 것을 직접 알려주며, 사이트 트래픽(traffic) 예측 등의 작업을 자동으로 할 수 있게 한다. 이러한 목적을 완수하기 위해서는 기계 학습을 적용하는 것이 필요할 것이다. 최종 사용자는 이러한 것들이 장면 뒤에서 일어나고 있는 마술이라는 것을 알지 못한다. 이들에게 당신의 응용 프로그램은 단지 작업 이며, 이미 잘 구축된 제품일 뿐이다. 어떤 단체는 직원을 고용하기 위해 이론적인 연구자(thinkers) 나 현실적인 개발자(doers) 중 한쪽을 선택하게 될 것이다. 연구자는 학계에서 많은 시간을 보낼 것이며, 이들이 매일같 xix
이 하는 일은 논문으로부터 생각을 이끌어 내고 매우 높은 수준의 툴이나 수식을 모델링하는 것이다. 반면 개발자는 코드를 작성하고, 기계가 멈추 거나 잡음이 생기는 것과 같은 비이상적인 세계의 결함을 처리하여 실세 계와 대면한다. 개발자와 연구자를 분리하는 것은 좋은 생각이 아니며, 성공적인 단체는 이 사실을 알고 있다. (제조업에 군살을 없애는 원칙 중 하나는 연구자를 위하여 그들이 그들의 손으로 직접 실천하게 하는 것이다.) 채용 에 소비되는 금전적인 한계가 언제쯤 올 것이며, 연구자와 개발자 중 누가 더 쉽게 고용될 것인가? 아마도 개발자일 것이다. 하지만 실질적으 로 고용주는 둘 다 원한다. 사고는 프로그램 구축을 위해 필요하다. 즉, 더욱더 까다로운 알고리즘이 필요한 응용 프로그램이 요구될 때, 논문을 읽고, 좋은 생각을 끄집어내며, 실제 코드에서 프로그램을 실행하고, 이러 한 작업을 반복할 수 있는 누군가가 옆에 있다면 유용할 것이다. 나는 기계 학습 알고리즘의 맥락에서 연구자와 개발자 사이의 틈을 연결 해 주는 책을 보지 못했다. 이 책의 목적은 따라 하기 방법을 이용하여 기계 학습 알고리즘 사용방법을 소개하는 것이며, 이를 통해 독자가 더 좋은 응용 프로그램을 구축할 수 있도록 한다. 피터 해링턴 xx
감사의 글 감사의 글 이 글이 이 책에서 가장 쓰기가 쉬웠다. 첫째, 매닝(Manning) 출판사 사람들에게, 그리고 이상 모든 사람들에게 감사함을 전한다. 나의 편집자 Troy Mott에게 감사를 전한다. 그의 도움과 열정이 없었다면, 이 책은 결코 만들어지지 못했을 것이다. 또한 마지막 원고에서 글다듬기를 즐겁게 도와준 Maureen Spencer에게도 감사를 전한다. 다음으로, 애리조나 주립 대학교(Arizona State University)에 있는 Jennie Si에게 감사를 전한다. 그녀는 이산 시간 확률 시스템이라는 그녀의 수업을 청강할 수 있게 해 주었다. 또한 데이터 마이닝의 상위 10개의 알고리즘 주1 에 관한 논문을 선정해 준 MIT의 Cynthia Rudin은 이 책을 집필하기 위한 접근 방법에 대해 영감을 주었다. 그 외에 Mark Bauer, Jerry Barkely, Jose Zero, Doug Chang, Wayne Carter, Tyler Neylon 등은 간접적으로 도움을 주었다. 1) 특히, 이 책을 집필하는 동안 여러 단계에서 원고를 읽고 매우 소중한 충고를 해 준 Keith Kim, Franco Lombardo, Patrick Toohey, Josef Lauri, Ryan Riley, Peter Venable, Patrick Goetz, Jeroen Benckhuijsen, Ian McAllister, Orhan Alkan, Joseph Ottinger, Fred Law, Karsten Strøbæk, Brian Lau, Stephen McKamey, Michael Brennan, Kevin Jackson, John Griffin, Sumit Pal, Alex Alves, Justin Tyler Wiley, John Stevenson 등 동료들에게 감사를 전한다. 기술 전문 교정자 Tricia Hoffman과 Alex Ott는 원고가 인쇄되기 전에 기술적인 내용을 빠르게 검토했다. 이들의 지적과 충고에 감사를 전한다. 이제 와 말하지만, 알렉스는 코드를 검토할 때 악마와 같았다! 덕분에 좋은 책을 만들 수 있었다. 주1 Xindong Wu, et al.. Top 10 Algorithms in Data Mining, Journal of Knowledge and Information Systems 14, no. 1 (December 2007). xxi
또한 원고 이전 버전을 구입하여 읽은 모든 사람들에게 감사를 전한다. 이 책은 그들 없이는 존재하지 못했을 것이다. 이 책을 집필하는 동안 나를 지원해 준 나의 가족에게 감사를 전한다. 늘 격려를 잊지 않은 나의 아내에게 감사의 빚을 졌다. 원고를 작성하는 동안 아내는 내 인생의 모든 잘못을 참아주었다. 마지막으로, 나는 실리콘 밸리(Silicon Valley)에 감사를 전한다. 실리콘 밸리는 나의 아내와 내가 작업을 하는 데 큰 장소를 제공해 주었으며, 우리는 이곳에서 생각과 열정을 공유할 수 있었다. xxii
이 책에 대하여 이 책에 대하여 이 책은 기계 학습 알고리즘에 영향력이 있는 사람들을 소개하는 것으로 시작한다. 이들이 사용한 도구와 응용 프로그램은 오늘날 독자에게 알고리즘이 어떻게 사용되는지 체감할 수 있도록 소개된다. 기계 학습에 관한 책은 매우 많아 선택의 폭이 넓다. 대부분의 책은 수학적으로 설명되어 있으며, 알고리즘을 어떻게 프로그래밍하는지는 자세히 소개하지 않았 다. 이 책은 행렬 형태로 존재하는 알고리즘부터 실제로 동작하는 프로그램까지 다리를 놓는 것을 목표로 한다. 중요한 것은 이 책은 코드 측면에서는 무겁고, 수학적 측면에서는 가볍다 는 것이다. 대상 독자 여기서 다루는 모든 기계 학습 방법은 무엇이며, 누구에게 필요한가? 간단히 말해, 기계 학습은 데이터의 의미를 만드는 것이다. 따라서 만약 당신이 이해하고자 하는 데이터를 가지 고 있다면, 이 책은 당신을 위한 것이다. 만약 당신이 데이터를 얻어 그것의 의미를 만들어 내기를 원한다면, 이 역시 당신을 위한 책이다. 당신이 반복되는 처리 같은 약간의 기초적인 프로그램 개념과 트리(tree) 같은 간단한 데이터 구조를 알고 있다면, 이 책은 당신을 도와줄 것이다. 이 책을 습득하는 데 있어 선형대수학(linear algebra)과 확률(probability) 분야에 대한 전문 지식은 필요하지 않으나, 만약 당신이 선형대수학과 확률에 대한 기초 지식이 있다면, 이 또한 도움이 될 것이다. 마지막으로, 이 책은 과거에 실행 가능한 의사 코드 (executable pseudo code) 라고 불렸던 파이썬(Python)을 사용하며, 당신이 파이썬에 대한 기본적인 조작 방법을 알고 있다고 가정한다. 만일 당신이 파이썬에 대한 전문가가 아니라도 걱정하지 말자. 파이썬을 익히는 것은 어렵지 않다. xxiii
데이터 마이닝의 상위 10가지 알고리즘 데이터와 데이터 기반 결정(data based decisions)을 만드는 것은 중요하 다. 이 책의 개념 역시 데이터로부터 생겨난 것이다. 이 내용은 데이터 마이닝의 상위 10가지 알고리즘(Top 10 Algorithms in Data Mining) 이 라는 제목의 논문에서 다루고 있으며, 이 논문은 데이터 마이닝 국제 학회인 IEEE에 제출되어 2007년 12월, 지식 및 정보 시스템 잡지(Journal of Knowledge and Information Systems)에 출간되었다. 이 논문은 KDD 학회에 상위 10개의 기계 학습 알고리즘을 제시하였고, 이에 수상한 논문 이다. 이 책의 일반적인 개요는 이 논문에서 확인된 알고리즘들을 따른다. 눈치가 빠른 독자라면, 논문에서 다룬 알고리즘은 10개인데 이 책은 15개 장으로 되어있다는 것을 알아챘을 것이다. 그 이유에 대해서는 나중에 설명하겠지만, 먼저 상위 10개의 알고리즘이 무엇인지 알아보도록 하자. 이 논문에 있는 알고리즘의 목록은 C4.5(trees), k 평균(k means), 지지 벡터 머신(support vector machines), 어프라이어리(Apriori), 기대 극대화(Expectation Maximization), 페이지랭크(PageRank), 에이다부스트(AdaBoost), k 최근 접(k Nearest Neighbors), 나이브 베이스(Naïve Bayes), 카트(CART)이다. 이 10개의 알고리즘 중 이 책에서는 8개의 알고리즘을 소개하였으며, 제외된 것은 페이지랭크와 기대 극대화이다. 페이지랭크 알고리즘은 구 글(Google)이 출시한 것으로, 많은 책에서 설명하고 있기 때문에 포함하 지 않았다. 전적으로 페이지랭크만을 다루는 책도 있다. 기대 극대화(EM) 는 이 책에서 다루고 싶었으나 불행히도 아직 그러지 못했다. EM의 중요 한 문제는 수학적으로 매우 무겁다는 것인데, 이를 간단한 버전으로 줄이 면 이 책에 소개하는 다른 알고리즘과 유사해져 하나의 장으로 다루기에 부족하다고 느꼈다. xiv
이 책에 대하여 이 책은 어떻게 구성되었나? 이 책은 네 개의 부와 15개의 장 그리고 네 개의 부록으로 구성되어 있다. 1부 기계 학습 기초 이 책에서 다루는 알고리즘은 위 논문과 같은 순서대로는 나오지 않으며, 소개부터 시작한다. 1부에 있는 여섯 개의 장은 분류(classification)의 하위 주제로 아이템에 분류 항목 표시를 붙이는 과정이다. 2장에서는 기본적인 기계 학습 알고리즘인 k 최근접(k Nearest Neighbors)을 소개한다. 3장은 의사결정 트리(decision tree)가 등장하는 첫 번째 장이다. 4장에서는 분류와 나이브 베이스(Naïve Bayes) 알고리즘을 다루기 위해서 확률 분포(probability distributions)에 관해 논한다. 5장에서는 로지스틱 회귀분석(Logistic Regression)을 소개한다. 이것은 상위 10개의 목록에는 없지만 최적화(optimization) 알고리즘의 하위 주제를 소개하는 데 중요하 다. 5장 끝 부분에서 누락된 값이 있는 데이터를 처리하기 위한 방법에 대하여 논한다. 6장에서 는 강력한 지지 벡터 머신(Support Vector Machines)에 관해 논한다. 마지막으로, 7장에서는 에이다부스트 앙상블(AdaBoost ensemble) 방법을 보면서 분류에 대한 논의를 결론짓는다. 또, 훈련 예제가 고르게 분포되지 못한 분류 불균형 문제를 다룬다. 2부 회귀 분석을 이용한 수치형 값 예측 2부는 두 개의 장으로 구성되며, 회귀분석이나 연속형 값을 예측하는 것에 관해 논한다. 8장은 회귀분석, 수축 방법(shrinkage methods), 위치적 가중치 선형 회귀분석(locally weighted linear regression)에 대해 이야기하며, 추가적으로 성향 변화량 거래(bias variance tradeoff)에 대해 다룬다. 이는 기계 학습 알고리즘을 훈련할 때 참고해야 하는 부분으로 9장과 연결되며, 9장에서는 트리 기반 회귀분석(tree ased regression)과 카트(CART) 알고리 즘에 대해서 논한다. 3부 비지도 학습 1, 2부에서는 지도 학습(supervised learning)에 초점을 두었으며, 이는 목적 값(target value) 을 가지고 있다고 가정하거나 무엇을 찾아야 하는지 알고 있는 경우에 사용되는 방법이다. xxv
3부에서는 비지도 학습 이라고 하는 새로운 주제에 관해 이야기한다. 여기서 당신은 무엇을 찾아야 하는지 모른다. 대신에 이 데이터들은 어 떠한 공통점이 있는가? 라는 물음을 기계에 던진다. 첫 번째로 논의할 알고리즘은 k 평균 군집화(k Means clustering)이다. 다음에는 어프라이 어리(Apriori) 알고리즘으로 연관 분석(association anslysis)에 대해 살펴 본다. 12장은 FP 성장(FP Growth)이라고 하는 연관규칙 분석의 개선된 알고리즘을 살펴봄으로써 비지도 학습에 대한 논의를 결론짓는다. 4부 추가적인 도구 이 책은 기계 학습에 사용되는 몇 가지 추가적인 도구를 살펴봄으로써 끝을 맺는다. 13장과 14장에 나오는 첫 번째와 두 번째 도구는 데이터로 부터 불필요한 값(noise)을 제거하기 위해 수학적 연산을 사용한다. 이것 들은 중요한 요소를 분석하고 단일 값으로 분해한다. 마지막으로, 하나의 간단한 기계로 접근하는 것이 충분하지 못한 거대한 데이터 집합(dataset) 을 위해 기계 학습의 크기를 변경하는 데 사용되는 도구에 대하여 논한다. 예제 이 책에 포함됨 대부분의 예제는 현실 세계에서 여러분이 알고리즘을 어떻게 사용할 수 있는지를 보여준다. 우리는 어떠한 실수도 저지르지 않기 위해 다음 단계를 적용한다. 1. 매우 간단한 데이터를 가지고 작업의 개념을 잡는다. 2. 사용할 알고리즘에 맞는 형태로 실세계 데이터를 가져온다. 3. 실세계 데이터 집합에서 결과를 확인하기 위해 1, 2단계 모두를 가지고 실험한다. 3단계로 바로 넘어갈 수 없는 이유는 복잡한 시스템을 다루는 공학기술의 기본이다. 점진적으로 어떤 것을 만들기를 원한다면, 언제, 어디서, 왜 오류가 발생하는지를 이해해야만 한다. 만약 이것들을 모두 건너뛴다면, 알고리즘이 올바르게 수행되고 있는 것인지 또는 데이터의 형태가 올바 르게 되었는지를 알 수 없게 된다. 따라서 당신이 관심을 보일 만한 xxvi
이 책에 대하여 몇 가지 과거에 있었던 일을 기록에 포함한다. 코드 규약 및 다운로드 리스팅(listings)이나 텍스트로 존재하는 모든 소스 코드는 일반적인 텍스트와 구별하기 위해 고정폭 글꼴(fixed width font)로 표현한다. 코드 주석은 대부분 중요한 개념을 강조하기 위해 목록에 같이 나온다. 어떤 경우에는 중요한 목록 다음에 번호를 매겨 설명과 연결한다. 이 책에 나오는 예제의 소스 코드와 텍스트 파일은 www.manning.com/machinelearningin Action에서 다운로드하여 이용할 수 있다. xxvii
표지 삽화에 대하여 이 책의 표지 그림은 이스트리아의 남자(Man from Istria) 다. 이스트리 아는 크로아티아 외곽 아드리아(Adriatic) 해에 있는 큰 반도이다. 이 삽화 는 2008년, 스플리트(Split)에 있는 민속 박물관(Ethnographic Museum) 에서 출간한 발타자르 헤케트의 서남 동부 웬다, 일리리아족, 슬라브족 에 대한 그림과 묘사(Images and Descriptions of Southwestern and Eastern Wenda, Illyrians, and Slavs) (재판본)에서 발췌하였다. 오스트리아의 의사이자 과학자였던 헤케트(1739~1815)는 다년간 식물학, 지질학, 민족학 등 오스트리아에 관해 연구하였으며, 베네토(Veneto), 줄 리안 알프스(Julian Alps), 서부 발칸(western Balkans) 등 과거 일리리아 부족의 흔적에 대해서도 연구하였다. 그가 손으로 그린 삽화는 많은 과학 논문과 책에 포함되었다. 헤케트의 출판물에 있는 그림의 풍부한 다양성은 200년 전의 동부 알프스 와 북서부 발칸 지역의 진귀함과 개성을 생생하게 이야기한다. 몇 마일을 사이에 두고 두 마을의 복장 규정이 서로 달랐을 때, 자신과 비슷한 복장 과 그렇지 않은 것으로 부족을 확인했다. 즉, 사회 집단이나 거래의 구성 원들은 무슨 옷을 입었는지에 의해 쉽게 구별될 수 있었다. 이후 복장 규정은 지역별로 다양하게 변하여 그들 특유의 확인 방법은 사라져버렸 다. 이제 이러한 것으로는 이 대륙 주민이다, 저 대륙 주민이다. 라고 말하기 어렵다. 오늘날 슬로베니아(Slovenian)의 알프스에 있는 그림 같 은 도시와 촌락의 주민이나, 발칸 반도 해안 도시의 주민은 유럽이나 미국 등의 다른 지역 주민들과 쉽게 구별되지 않는다. xxviii
표지 삽화에 대하여 매닝 출판사는 2세기 전 의상을 기반으로 한 삽화를 표지에 넣어 우리와 가까이 했으며, 컴퓨터 사업에 재미를 더하였다. 이와 같은 매닝 출판사의 독창성과 진취력에 찬사를 보낸다. xxix
Machine Learning in Action 제1부 분류 이 책의 1, 2부에서는 지도 학습(supervised learning) 방법에 대해 다룬다. 지도 학습에서는 데이터를 학습할 때 목적 변수를 명시해야만 하며, 이렇게 얻어진 목적 변수는 입력 데이터에서 패턴을 찾는 데 필요한 컴퓨터의 작업량을 줄인다. 우리는 목적 변수에 대한 두 가지 경우를 다루게 된다. 첫 번째는 목적 변수가 명목형 값을 가지는 경우로, 참 또는 거짓을 판별할 수 있는 파충류, 어류, 포유류, 양서류, 식물, 균류 등의 형태이다. 두 번째는 목적 변수가 한정되지 않은 수치형 값을 가지는 경우로, 0.100, 42.001, 1000.743 등의 형태이다. 두 번째 경우를 회귀(regression)라고 부르며, 2부에서 공부하게 될 것이다. 1부에서는 첫 번째 목적 변수를 가지는 분류(Classification)를 중점적으로 다룬다. 우리가 공부할 분류 알고리즘은 이 책의 처음 일곱 개 장에 포함되어 있다. 2장에서는 k-최근접 이웃(K Nearest Neighbors)이라 불리는 간단한 분류 알고리즘을 소개하며, 이는 아이템을 분류하기 위해 거리 측정을 사용한다. 3장에서 는 2장보다 조금은 어렵지만, 의사결정 트리(decision trees)라는 알고리즘의 수행을 이해하기 쉽게 소개한다. 4장에서는 분류를 하는 데 있어 확률 이론(Probability theory)을 어떻게 사용할 수 있는지에 대해 다룰 것이며, 5장에서는 로지스틱 회귀(logistic regression)를 살펴볼 것이다. 여기서 우리는 데이터를 적절하게 분류하는 데 가장 좋은 매개변수를 찾는다. 그리고 가장 좋은 매개변수를 찾는 과정에서 강력한 최적화 알고리즘을 만나게 된다. 6장에서는 강력한 지지 벡터 머신(support vector machines)을 소개한다. 마지막으로 7장에서는 메타 알고리즘인 에이다부스트(AdaBoost)를 보게 될 것이다. 이는 여러 개의 분류기들을 한데 모은 하나의 분류기이다. 7장은 분류 불균형에 관한 부분과 함께 분류에 대한 1부의 결론을 내린다. 여기서 분류의 불균형이란, 어떤 분류 항목이 다른 분류 항목보다 더 많은 데이터를 가진다는 것을 의미하며, 이는 곧 현실적인 문제가 된다.
1장 기계 학습 기초 Machine Learning in Action 학습 목표 기계 학습의 간단한 개요 기계 학습의 주요 과제 기계 학습에 관해 배워야 하는 이유 파이썬이 기계 학습을 다루는 데 훌륭한 이유 내가 어떤 부부와 식사를 하고 있을 때, 그들이 내게 최근 무슨 일을 하고 있는지 물었다. 나는 기계 학습 이라고 대답했다. 아내는 남편에게 물었다. 여보, 기계 학습이 뭐예요? 남편은 싸이버다인 시스템(Cyberdyne Systems) T 800이야. 라고 대답했다. 만약에 당신이 터미네이터 란 영화를 잘 모른다면, T 800이 인공지능이라는 것을 전혀 알 수 없을 것이다. 그렇다고 이 책에서 우리는 컴퓨터 프로그램과 대화를 시도하지는 않으며, 삶의 의미도 물어 보지 않는다. 다만 여기서는 기계 학습을 이용하여 데이터에 대한 통찰력을 얻을 수 있게 한다. 즉, 컴퓨터를 사용하여 데이터에 대한 의미를 만들어 낼 것이다. 여기서 우리가 배우고 자 하는 것은 사이보그의 기계적 암기나 지각력이 있는 존재를 생성하는 것이 아니다. 기계 학습(machine learning)은 아마도 당신이 예상하는 것보다 더 많은 곳에서 활발하게 사용되고 있을 것이다. 당신은 가상의 어느 날, 여러 번 기계 학습을 만나게 될 것이다. 가령, 당신은 친구의 생일에 우편으로 카드를 보내고자 한다. 재미있는 카드를 검색하면, 검색 프로그램은 가장 관련이 있는 10개의 링크를 보여줄 것이고, 이 중 두 번째 링크를 클릭하면 검색 프로그램은 이러한 상황을 학습한다. 이메일을 살펴볼 때는 어떤가? 제약회사 광고처럼 당신에게 관심이 없는 메일은 스팸 필터에 의해 스팸 폴더로 보내지게 된다. 그러고 나서, 생일 카드를 사기 위해 가게에서 카드를 고르고, 친구의 아이를 위한 기저귀를 집어 든다. 당신이 고른 상품을 계산하려고 할 때, 점원은 당신에게 여섯 개들이 맥주 한 박스의 할인 쿠폰을 건네준다. 이는 기저귀를 구매하는 사람들이 맥주를 함께 구매하는 경향이 있기
4 1장 기계 학습 기초 때문에 금전 등록 프로그램이 생성한 쿠폰일 것이다. 이제 우체국에서 카드를 보내면, 기계는 적절한 배달 트럭으로 우편을 전달하기 위해 당신이 손으로 쓴 글씨를 인식한다. 그렇다면 대출을 받을 땐 어떤가? 당신은 여신 담당자에게로 가서 당신의 대출 가능 여부를 묻는다. 그러면 담당자는 컴퓨터로 당신에 관한 약간의 재정 정보를 살피고 대출을 결정하게 된다. 마지막으로, 늦은 밤 여흥을 즐기기 위해 카지노에 들린다. 당신이 입구로 들어갈 때, 보안 요원처럼 보이는 사람들이 갑자기 나타나 당신 뒤에서 들어오던 사람에게 접근한다. 그들은 그에게 죄송합니다. 쏠프씨, 카지노에서 나가주십시오. 트럼프 도박꾼은 들어올 수 없습니 다. 라고 말했다. 그림 1.1은 이렇게 사용되고 있는 몇 가지 프로그램을 보인 것이다. 그림 1.1 오늘날 수행되고 있는 기계 학습의 예. 왼쪽 위에서 시계방향으로 얼굴 인식, 필 기체 숫자 인식, 이메일 스팸 필터링, 아마존 닷컴(Amazon.com)의 제품 추천 앞에서 언급한 모든 시나리오에 기계 학습이 사용된다. 회사에서 사업의 의사결정을 개선하 거나 생산성을 높이기 위해, 또는 질병을 감지하고, 날씨를 예보하는 등 이미 많은 부분에서 기계 학습을 사용하고 있다. 기술의 기하급수적인 성장에 따라, 당신에게는 현재 가지고 있는 데이터를 이해하기 위한 더 좋은 도구가 있어야 하며, 우리가 얻을 수 있는 데이터를 이해하기 위한 우리 자신의 준비 또한 필요하다.
1.1 기계 학습이란 무엇인가? 5 기계 학습을 이해할 준비가 되었는가? 이번 장에서 당신은 기계 학습이 무엇인지 알게 될 것이며, 당신의 주변 어디에서 벌써 사용되고 있는지, 미래에 당신을 어떻게 도울 수 있는지 알게 될 것이다. 그런 다음, 기계 학습을 가지고 문제를 해결하기 위한 몇 가지 일반적인 접근 방식에 대해 논의할 것이다. 마지막으로, 왜 파이썬이 기계 학습을 다루는 데 훌륭한 언어인지 알게 될 것이다. 게다가 우리는 NumPy라는 파이썬 모듈을 사용하여 아주 간단한 예제를 다룰 것이며, 여기서 당신은 개념과 행렬 계산을 다루게 될 것이다. 1.1 기계 학습이란 무엇인가? 대부분의 통찰력이나 지식은 가공되지 않은 원시 데이터(raw data)를 뚫어지게 살펴본다고 해서 얻어지는 것이 아니다. 예를 들어 스팸 메일을 잡아낼 때, 어떤 한 단어의 발생 여부만을 주시하는 것은 많은 도움이 되지 못한다. 하지만, 확실한 단어들의 발생 여부를 주시하는 것과 함께 이메일의 길이와 다른 요소들을 결합하여 사용한다면, 해당 이메일이 스팸인지 아닌지 훨씬 더 명확하게 알아낼 수 있다. 기계 학습은 데이터를 정보로 변환하는 것이다. 기계 학습은 컴퓨터 과학과 기술 그리고 통계학의 교차로에 놓여있으며, 때로는 다른 학문에 서 사용되기도 한다. 나중에 보면 알 수 있겠지만, 이것은 정치에서 지구과학까지 많은 분야 에서 응용될 수 있다. 이것은 다양한 문제들에 적용할 수 있는 도구이다. 데이터를 해석하고 실행해야 하는 분야에서 기계 학습 기술을 사용한다면 이득을 얻을 수 있다. 기계 학습은 통계학을 사용한다. 대부분의 사람들에게 통계학은 회사에서 그들의 제품이 얼마나 좋은지를 알아보기 위해 사용되는 소수만이 알고 있는 주제이다. (통계학 관련 베스트셀 러로 데럴 후프(Darrell Huff)의 How to Lie with Statistics 가 있다.) 그럼 왜 우리에게 통계학 이 필요한가? 공학기술은 문제를 해결하기 위해 과학적 방법을 적용하고 있다. 공학기술에서 통계학은 결정적 문제를 해결하기 위해 사용되며, 언제나 문제를 해결해 준다. 만약에 우리가 자판기를 제어하기 위한 소프트웨어 제작을 의뢰한다고 해 보자. 의뢰 내용은 다음과 같다. 이 자판기는 돈이 들어오거나 버튼을 누르는 것에 상관없이 항상 더 좋은 작업을 할 수 있어야 한다. 이러한 방식의 제작 의뢰에는 많은 문제가 있다. 무엇을 해결해야 하는지 알 수 없기 때문이다. 즉, 우리는 문제에 대해 충분히 알지 못하고 있거나 문제를 제대로 모델링하기에 충분한 연산 능력을 갖추지 못한 것이다. 이러한 문제를 해결하기 위해 통계학 이 필요하다. 일례로서, 아직까지 인간의 동기라는 문제를 모델링하는 것은 너무 어려운 과제이다.
6 1장 기계 학습 기초 사회과학에서는 60%가 옳은 경우 성공적인 것으로 간주한다. 만약, 사람이 행동하는 방법을 60% 정도 예측할 수 있다면 아주 잘한 것이다. 어떻게 이럴 수 있는가? 항상 옳아야 하지 않을까? 항상 올바른 것이 아니라면, 우리가 무엇인가 잘못하고 있다는 것을 의미하는 것은 아닐까? 완전하게 모델링할 수 없는 문제를 설명하기 위한 하나의 예를 들어보자. 인간은 자신의 행복을 극대화하기 위해 행동하지 않는가? 우리의 이러한 가정을 바탕으로 인간과 관련된 사건의 결과를 예측하는 것이 가능하지 않을까? 하지만, 사람을 행복하게 만드는 것은 개인 마다 큰 차이가 있기 때문에 이를 정의하기는 어렵다. 비록 인간이 자신의 행복을 극대화 하는 것에 관한 우리의 가정이 옳다고 하더라도 행복에 대한 정의가 너무 복잡하기 때문에 모델링을 할 수 없다. 또한, 인간의 행동에 관한 것 외에도 아직까지 다른 다양한 예들이 모델링하는 데 어려움을 겪고 있다. 이러한 문제를 해결하기 위하여 통계학 기반의 도구를 사용하는 것이 필요하다. 1.1.1 센서 및 데이터 홍수 우리는 월드 와이드 웹(World Wide Web)으로부터 인간을 위해 생성된 엄청난 양의 데이터 를 가지게 되었으며, 최근에는 온라인을 사용하면서 인간을 위해 생성된 것이 아닌 기기들 간의 소통을 위해 생성된 데이터가 더 많아지게 되었다. 센서(sensor) 뒤에 감춰진 기술은 새로운 것이 아니지만 웹에서 이들 간의 연결은 새로운 것이었다. 아마도 이 책 출간 후 얼마 지나지 않아, 물리적 센서에 의해 생성되는 비동영상 데이터가 인터넷 통신량(traffic)의 20%를 차지할 것으로 추정된다. 주1 2) 다음은 열람이 자유로운 많은 자료를 근거로 작성된 예제로서, 데이터 정리가 필요하다. 1989년, 로머 프리에타(Loma Prieta) 지진은 북부 캘리포니아를 강타하여 63명이 사망하고 3,757명이 다쳤으며 수천 명이 집을 잃었다. 2010년, 비슷한 크기의 지진이 아이티 섬을 강타하여 23만 명 이상이 사망하였다. 로머 프리에타 지진 이후 얼마 지나지 않아, 저주파 자기장(low frequency magnetic field) 측정을 이용한 지진 예언을 주장하는 연구가 발표되었다. 주2 3)그 뒤 많은 후속 연구들은 다양 주1 주2 http://www.gartner.com/it/page.jsp?id=876512 Fraser-Smith et al., Low-frequency magnetic field measurements near the epicenter of the Ms 7.1 Loma Prieta earthquake, Geophysical Research Letters 17, no. 9 (August 1990), 1465 68.
1.1 기계 학습이란 무엇인가? 7 한 이유로 원래의 연구에 결함이 있다고 발표하였다. 주3, 주4 우리가 이 연구를 다시 진행한다고 가정하고 지진을 예측하기 위한 방법을 계속해서 찾는다면, 끔직한 결과를 피할 수도 있을 것이며 우리의 행성을 더 잘 이해할 수 있게 될 것이다. 무엇이 이 연구에 가장 좋은 방법인가? 우리는 돈을 들여 자기탐지기(magnetometer)를 구매하거나 그곳의 땅을 조금 살 수도 있다. 또, 돈과 자기탐지기를 설치할 곳의 땅을 주고 정부에 도움을 요청할 수도 있다. 그렇다면 누가 자기탐지기를 설치하러 갈 것이며, 어떻게 자기탐지기를 판독할 것인가? 여기에 비용이 저렴한 다른 해결책이 있다. 4)5) 요즘은 3축 자기탐지기가 설치된 모바일 폰이나 스마트폰을 구입할 수 있다. 스마트폰은 운영체제를 가지고 있으며 개인 프로그램을 실행시킬 수 있다. 따라서, 몇 개의 코드 라인을 가지고 자기탐지기에서 발생하는 초당 수백 개의 데이터를 판독하는 것이 가능하다. 또, 휴대폰은 이미 자체적으로 통신 시스템이 설치되어 있다. 따라서 사람들이 당신이 만든 프로 그램을 설치하고 실행할 수 있도록 확산시키는 것이 가능하다면, 당신은 매우 적은 투자로 많은 양의 자기탐지 데이터를 얻을 수 있다. 스마트폰은 자기탐지기 외에도 요레이트 자이로 (yaw rate gyros) 센서, 3축 가속도(three axis accelerometers) 센서, 온도(temperature) 센서, GPS 수신기(GPS receivers) 등 다른 센서의 데이터도 대량으로 운반한다. 모바일 컴퓨팅 과 센서 생성 데이터(sensor generated data) 라는 두 가지 동향은 미래에 우리가 다량의 데이터를 가지게 될 것이라는 것을 의미한다. 1.1.2 기계 학습은 점점 더 중요해질 것이다 20세기 후반 50년이라는 기간 동안, 기술 발전으로 세상이 급변하면서 노동자의 과반수 이상이 육체 노동에서 지식 노동(knowledge work)으로 이동하였다. 이것을 저기로 옮겨, 여기에 구덩이를 파라 처럼 명료한 일의 정의는 사라지고, 모호한 일들이 일반화되었다. 이제는 이익 최대화, 손실 최소화, 최상의 영업방법 찾기 같이 일을 배정하는 것이 모두에 게 더욱더 일반적이다. 월드 와이드 웹에서 사용 가능한 물밀듯이 밀려오는 정보들은 지식 근로자의 일을 더욱 어렵게 하고 있다. 이러한 관심 속에서 모든 데이터를 이해하는 일은 구글의 최고 경제 전문가인 핼 베어리언(Hal Varian)이 말한 것처럼 더욱 더 중요한 기술이 되고 있다. 주3 W. H. Campbell, "Natural magnetic disturbance fields, not precursors, preceding the Loma Prieta earthquake," Journal of Geophysical Research 114, A05307, doi:10.1029/2008ja013932 (2009). 주4 J. N. Thomas, J. J. Love, and M. J. S. Johnston, On the reported magnetic precursor of the 1989 Loma Prieta earthquake, Physics of the Earth and Planetary Interiors 173, no. 3 4 (2009), 207 15.
8 1장 기계 학습 기초 나는 앞으로 10년 동안 통계학자가 매력적인 직업이 될 것이라고 생각한다. 사람들은 내가 농담을 한다고 할 것이다. 과연 1990년대의 컴퓨터 기술자가 다시 매력적인 직업을 가지게 될 것이라고 누가 추측이나 하겠는가? 데이터를 얻고, 이해하고, 처리하고, 데이터에서 가치를 추출하고, 시각화하고, 전송하는 것과 같은 능력은 앞으로 10년 안에 아주 중요한 기술이 될 것이다. 전문적인 수준뿐만 아니라 초 중 고 대학교 학생들이 배우는 수준까지도 그리 될 것이다. 왜냐하면 오늘날 데이터는 기본적으로 무료이면서 실제로 언제 어디서나 찾아볼 수 있기 때문이다. 그런데 여기서 부족한 것은 데이터와 데이터로부터 추출된 값을 상호 보완적으로 이해하는 능력이다. 나는 통계학이 바로 이러한 부분을 담당하는 분야라고 생각한 다. 당신 역시 데이터를 시각화하고 전달하는 등 데이터를 효과적으로 활용할 수 있어야 한다. 데이터에 접근하고 이해하고 전송하는 등의 기술은 데이터 분석을 통해 얻어지는 것이 므로 이러한 통찰력은 매우 중요한 기술이 될 것이다. 그렇기 때문에 관리자는 스스로 데이터 에 접근하고 이해하는 능력이 있어야만 한다. - 2009년 1월, <맥킨지(Mckinsey Quarterly)>에서 이렇게 정보에 의존적인 수많은 경제활동 속에서 데이터에만 빠져 있을 여유가 없다. 바로 기계 학습이 모든 데이터에 대하여 정보를 추출할 수 있도록 도움을 줄 것이다. 이 책을 통해 우리는 기계 학습에서 일반적으로 표현하는 몇몇 어휘에 대하여 명확하게 집고 넘어갈 필요가 있다. 1.2 주요 전문용어 기계 학습 알고리즘을 다루기 전에 몇몇 전문용어를 먼저 설명하는 것이 더 좋을 것이다. 설명을 하기에 가장 좋은 방법은 만들고자 하는 가상의 시스템을 예로 들어 설명하는 것이다. 여기서 우리는 새 분류 시스템을 만드는 예를 가지고 설명하고자 한다. 여기에서 다루고자 하는 시스템의 종류는 종종 기계 학습 분야에서 전문가 시스템(expert system)이라고 불리는 것으로 흥미로운 주제이다. 새를 인식하기 위한 컴퓨터 프로그램을 만듦으로써, 컴퓨터로 조류학자를 대신할 수 있게 된다. 조류학자는 새에 관한 전문가이며 우리는 이러한 전문가 시스템을 만들기로 한다. 표 1.1은 여러 종류의 새에 대하여 네 가지 항목을 측정한 것이다. 측정한 네 가지 항목은 무게, 날개의 길이, 물갈퀴 존재 유무, 등의 색상이다. 실질적으로는 이것보다 더 많은 것이 측정되어야 하지만, 여기서는 중요하지 않다. 여기서 다루려는 것은 측정하고 정렬할 수
1.2 주요 전문용어 9 있는 거의 모든 것에 대한 일반적인 연습일 뿐이다. 여기서 측정한 네 가지를 속성(features)또 는 특성(attributes)이라고 하며, 이 책에서는 속성이라는 용어를 사용할 것이다. 표 1.1에서 각각의 열은 속성들로 구성된 사례들이다. 표 1.1 네 가지 속성을 기반으로 한 새의 종 분류 무게(g) 날개 길이(cm) 물갈퀴 등의 색상 종 1 1000.1 125.0 없음 갈색 Buteo jamaicensis 2 3000.7 200.0 없음 회색 Sagittarius serpentarius 3 3300.0 220.3 없음 회색 Sagittarius serpentarius 4 4100.0 136.0 있음 검정색 Gavia immer 5 3.0 11.0 없음 녹색 Calothorax lucifer 6 570.0 75.0 없음 검정색 Campephilus principalis 표 1.1에서 처음 두 개의 속성은 수치형(numeric)이며 십진수 값을 갖는다. 세 번째 속성(물갈 퀴 존재 유무)은 이진수로 0 또는 1을 갖는다. 네 번째 속성(등의 색상)은 색상표의 목록 중 가장 일반적인 색상을 선택해서 사용했다. 이는 사람들에게 일곱 개의 색상 중 하나를 선택하 여 측정하도록 한 것이며, 따라서 등의 색상은 곧 정수가 된다. (나는 하나의 색상으로 새의 등 색상을 표현하는 것이 무리한 선택이라는 것을 알고 있으나, 이것은 설명을 위한 것임을 이해해 주기 바란다.) 만약 아이보리색 부리를 가진 딱따구리를 발견한다면 가능한 빨리 나에게 전화를 주기 바란 다. 새에게서 눈을 떼지 말고 내가 그 곳으로 갈 때까지 그것을 보았다고 아무에게도 말하지 말고, 꼭 나에게만 전화해 주기를 바란다. (살아있는 아이보리색 부리를 가진 딱따구리를 생물학자 에게 인도하면 보상으로 $50,000를 받게 된다.) 분류(classification)는 기계 학습에서 다루는 하나의 과제이며, 표 1.1을 사용하여 설명할 것이 다. 그리고 아이보리색 부리를 가진 딱따구리에 관한 정보로 $50,000를 주는 것은 사실 우리이다. 우리는 다른 새 무리 이외에 이러한 새를 찾기를 원하고 있으며, 이것으로부터 이득을 얻기를 원한다. 여러분들이 아이보리색 부리를 가진 딱따구리를 보고 우리에게 전화 를 주면, 우리는 새의 먹이통을 설치한 다음 그것을 보기 위해 조류학자를 고용한다. 사람은 한 번에 한 장소에만 있을 수 있기 때문에 이 방법은 비용이 많이 든다. 이 작업 역시 자동으로 할 수 있다. 즉, 카메라를 부착한 새 먹이통을 많이 설치하고 그곳에 컴퓨터를 설치하면 그곳으로 오는 새들을 확인할 수 있다. 그리고 새의 먹이통 안에 측정 장치를 넣어 새의
10 1장 기계 학습 기초 무게를 얻을 수 있으며, 컴퓨터 영상 코드를 이용해 새의 날개 길이, 발의 형태, 등의 색상 등을 추출하여 기록할 수 있다. 우리는 이러한 순간을 포착하기 위한 모든 정보를 가지고 있다. 그렇다면, 먹이통 안에 있는 새가 아이보리색 부리를 가진 딱따구리인지 어떻게 구분할 수 있을까? 이 과제를 분류라고 하며, 분류에 좋은 많은 기계 학습 알고리즘이 있다. 이 예제에서의 분류 항목은 새의 종류이다. 더 명확하게 아이보리색 부리를 가진 딱따구리와 다른 모든 새로 분류 항목을 줄일 수도 있다. 말하자면, 기계 학습 알고리즘에서는 분류를 사용하여 결정하게 된다는 것이다. 다음에 해야 할 것은 알고리즘을 훈련하거나 이를 배우는 것이다. 알고리즘을 훈련하기 위해 훈련 집합 (training set)이라고 알려진 양질의 데이터가 주어진다. 훈련 집합이란 예제를 훈련하기 위한 집합으로 기계 학습 알고리즘을 훈련하는 데 사용될 것이다. 표 1.1에서 우리의 훈련 집합은 여섯 개의 훈련 예제(training examples)를 가지고 있다. 각각의 훈련 예제는 네 개의 속성과 하나의 목적 변수(target variable)를 가지며 이를 그림 1.2에서 묘사하고 있다. 목적 변수는 기계 학습 알고리즘을 가지고 예측을 하고자 하는 것이다. 분류에서 목적 변수는 명목형 값을 가지며, 회귀(regression)에서 목적 변수는 계속 되풀이될 수 있다. 훈련 집합 내에 목적 변수는 이미 알려져 있다. 기계 학습은 속성과 목적 변수 간에 관계를 찾고자 하는 것이다. 목적 변수는 앞에서 언급한 것처럼 새의 종류이며 이를 명목형 값으로 변경하여 데이터의 크기를 줄일 수 있다. 분류 문제에서 목적 변수를 분류 항목이라고 하며 분류 항목의 한정된 수를 추정한다. 주의 훈련 예제를 구성할 때에는 다른 속성들과 함께 결합하여 만들게 된다. 그래서 속성이나 특성은 개별 적으로 측정한다. 이것은 보통 훈련 집합이나 검사 집합에서 칼럼(columns)에 해당한다. 무게 날개 길이 발갈퀴 등 색상 종 없음 갈색 없음 회색 속성 목적 변수 그림 1.2 속성과 목적 변수의 구분
1.3 기계 학습의 주요 기술 11 기계 학습 알고리즘을 검사하기 위해서는 보통 데이터의 훈련 집합과 검사 집합(test set)이라고 불리는 따로 분리된 데이터 집합이 사용된다. 처음 기계 학습을 진행할 때, 훈련 예제를 먼저 프로그램에 넣는다. 그런 다음 검사 집합을 프로그램에 넣는다. 프로그램을 실행할 때 검사 집합에 있는 각각의 예제에는 목적 변수가 주어지지 않으며, 프로그램이 각 예제가 어떤 분류 항목에 속하는지 결정하게 된다. 목적 변수나 분류 항목은 훈련 예제에 있으므로 예측 값을 서로 비교할 수 있으며, 이를 통해 알고리즘이 얼마나 정확한지 짐작할 수 있게 된다. 검사 집합과 훈련 집합을 모두 사용하는 것이 좋으며, 이에 대해서는 나중에 다루기로 한다. 새를 분류하는 예제에서 추측컨대 프로그램은 정확하게 우리가 원하는 수준을 만족하도록 검사하게 될 것이다. 우리는 기계가 학습한 것을 볼 수 있을까? 이것을 지식 표현(knowledge representation)이라고 한다. 물음에 대한 답은 이 지식 표현이라고 하는 것에 의해 표현된다. 지식 표현을 하는 어떤 알고리즘은 다른 알고리즘보다 사람이 더 잘 이해할 수 있도록 한다. 지식 표현은 규칙의 집합, 즉 확률 분포나 훈련 집합에 있는 예제의 형태를 띤다. 어떤 경우에는 지식 표현에 관심을 갖지 않을 수도 있지만, 전문가 시스템을 구축하는 경우에는 지식 표현에 관심을 둔다. 이러한 지식 표현은 기계 학습 알고리즘을 훈련함으로써 습득되는 것이다. 기계 학습에는 중요하게 다루어야 할 많은 요소들이 있지만, 여기서 이 모든 것을 다루지는 않는다. 더 중요한 요소는 마지막 장에서 소개할 것이다. 지금은 기계 학습을 가지고 무엇을 할 수 있는지에 대하여 다룰 것이다. 1.3 기계 학습의 주요 기술 이 부분에서는 기계 학습의 주요 기술과 기본 구조를 설정하는 것에 대해 요약할 것이며, 기계 학습 알고리즘을 쉽게 이해할 수 있도록 견고한 응용 프로그램 작업을 수행하게 될 것이다. 예제는 이전에 분류 작업을 위해 설명했던 것을 포함한다. 여기서 하고자 하는 것은 데이터의 사례가 어떤 분류 항목에 속하는지 예측하는 것이다. 기계 학습에는 또 다른 학습 방법으로 회귀가 있다. 회귀는 수치형 값으로 예측한다. 아마도 대부분의 사람들은 특정 데이터 지점을 기반으로 데이터 지점을 일반화할 수 있는 가장 적합한 선을 그리는 회기의 예를 본 적이 있을 것이다. 분류와 회귀는 둘 다 지도 학습(supervised learning) 방법이다. 문제에 대한 이러한 설정이 지도라고 알려지게 된 이유는 알고리즘에 무엇을 예측할 것인지를 제공하기 때문이다.
12 1장 기계 학습 기초 지도 학습의 반대는 비지도 학습(unsupervised learning)으로 이 학습 방법은 주어진 데이터에 분류 항목 표시나 목적 변수가 없다. 비지도 학습 방법에는 유사한 아이템들을 함께 모으는 군집화(clustering) 방법과 통계적인 방법을 사용하여 값을 찾는 밀도 추정(density estimation) 방법이 있으며, 속성이 많은 데이터를 적은 수의 속성으로 줄이거나, 이를 통해 둘 또는 세 개의 관점으로 데이터를 적절하게 그려보는 방법을 사용하기도 한다. 표 1.2는 기계 학습 에서 일반적으로 사용되는 방법과 그에 따른 알고리즘을 정리한 목록이다. 표 1.2 분류, 회귀, 군집, 밀도 추정을 수행하기 위한 일반적인 알고리즘 지도 학습 방법 분류(Classification) k-최근접 이웃(k-Nearest Neighbors) 나이브 베이스(Naive Bayes) 지지 벡터 머신(Support vector machines) 의사결정 트리(Decision trees) 회귀(Regression) 선형 회귀(Linear) 지역적 가중치가 부여된 선형 회귀 (Locally weighted linear) 리지(Ridge) 라쏘(Lasso) 비지도 학습 방법 군집화(Clustering) k-평균(k-means) 디비스캔(DBSCAN) 밀도 추정(Density estimation) 기대 극대화(Expectation maximization) 파젠 윈도우(Parzen window) 그런데, 표 1.2에 있는 여러 가지 기술이 모두 같은 문제를 해결하기 위한 방법이라는 것에 관심을 기울인다면, 여러분은 한 가지 의문을 갖게 될 것이다. 만약, 같은 것을 하고자 하는 것이라면, 왜 다른 방법이 네 개나 있어야 하는 걸까? 왜 단 하나의 방법만 선택할 수는 없는 것인가? 이러한 질문에 대해서는 다음 절에서 답변하기로 한다. 1.4 올바른 알고리즘 선정 방법 표 1.2에 있는 알고리즘 중에서 하나를 사용할 때, 과연 어떻게 선택해야 할까? 먼저, 목적을 고려해야 한다. 얻고자 하는 것을 위해 시도하려는 것이 무엇인가? (내일 비가 올 확률이 얼마나
1.4 올바른 알고리즘 선정 방법 13 되는지 궁금한가? 혹은 유사한 관심을 가진 유권자 집단을 찾기를 원하는가?) 현재 가지고 있거나 수집할 수 있는 데이터는 어떤 것인가? 이러한 것들에는 큰 의문이 있다. 지금부터 목적에 관해 이야기해 보도록 하자. 만약에 목적 값(target value)을 예측하거나 예견하려고 한다면 지도 학습 방법을 살펴보고, 그렇지 않다면 비지도 학습 방법을 살펴보라. 만약에 지도 학습 방법을 선택했다면 목적 값은 무엇인가? 예/아니오, 1/2/3, A/B/C, 빨강/노랑/검정 과 같이 이산적인 값인가? 그렇다면 분류 방법을 살펴보면 된다. 만약에 목적 값이 0.00~100.00, 999~999, + ~ 같은 수치 값이라면 회귀를 살펴봐야 한다. 만약에 목적 값 예측을 시도하려는 것이 아니라면 비지도 학습을 살펴봐야 한다. 가지고 있는 데이터가 어떤 이산적인 무리에 알맞은지를 알아보고자 하는 것인가? 그렇다면 군집화 를 살펴봐야 한다. 각각의 무리에 알맞은 정도가 어느 정도인지를 수치적으로 평가할 것인 가? 그렇다고 한다면 아마도 밀도 추청 알고리즘을 살펴봐야 할 것이다. 여기서 설명한 규칙은 올바른 방향을 설명한 것이기는 하지만 규칙은 깨지기도 한다. 9장에 서 지도 학습 범위 내에서 구별이 뚜렷하지 않은 회귀를 이용한 분류 기술을 어떻게 사용할 수 있는지 알아볼 것이다. 두 번째로, 보유하고 있는 데이터를 고려해야만 한다. 당신은 데이터를 파악하기 위해 얼마간의 시간을 보내게 될 것이며, 데이터에 대해 더 많은 것을 알아야만 성공적인 응용 프로그램을 구축할 수 있게 될 것이다. 데이터에 대해 알고자 하는 것은 다음과 같은 것이다. 속성이 명목형인가? 연속형인가? 속성 내에 누락된 값이 있는가? 만약, 누락된 값이 있다면 데이터 가 누락된 상황은 왜 존재하는가? 데이터 내에 오류 데이터(outlier)가 있는가? 건초 더미에서 바늘을 찾는 것처럼 매우 드물게 발생하는 어떠한 것이 존재하는가? 이처럼, 데이터 속성에 대한 모든 것은 알고리즘 선택 과정의 폭을 좁히는 데 도움을 준다. 알고리즘에 대한 선택의 폭이 좁아졌다고 해서 가장 좋은 알고리즘이 무엇인지, 어떤 알고리 즘이 가장 좋은 결과를 낼 수 있는지를 모두 알 수 있는 것은 아니다. 당신은 다양한 알고리즘 을 시도해야 할 것이며 그것이 어떻게 수행되는지 알아야 한다. 또 다른 기계 학습 기술은 기계 학습 알고리즘의 성능을 향상시키기 위해 사용될 수 있다. 이렇게 두 알고리즘 간의 성능을 비교하는 것은 입력 데이터(input data)를 처리한 후에 수행된다. 추후에 이것에 대해 더욱더 세밀하게 다루겠지만, 중요한 것은 반복되는 시행착오로 가장 좋은 알고리즘을 찾게 된다는 것이다.
14 1장 기계 학습 기초 대부분의 알고리즘은 서로 다르지만, 기계 학습 알고리즘이 구축될 때 모든 알고리즘이 꼭 해야만 하는 공통적인 단계도 있다. 이러한 단계는 다음 절에서 설명하기로 한다. 1.5 기계 학습 응용 프로그램 개발 단계 기계 학습을 이용한 응용 프로그램을 이해하고 개발하기 위한 우리의 접근은 다음과 같은 절차를 따르게 된다. 1. 데이터 수집: 웹 사이트에서 필요한 정보를 수집하거나 데이터를 추출함으로써 간단한 표본들을 모을 수 있으며, RSS로부터 또는 API를 이용하여 정보를 얻을 수도 있다. 풍속 측정이나 혈당량 또는 측정 가능한 것은 무엇이든 정보를 수집하고 전송하는 기기를 설치할 수 있다. 선택할 수 있는 것에는 끝이 없다. 시간과 노력을 절약하기 위해서 공개적으로 사용 가능한 데이터를 사용할 수도 있다. 2. 입력 데이터 준비: 당연하겠지만, 우리가 가지고 있는 데이터를 유용한 형식으로 만들 필요가 있다. 유용한 형식이란 이 책에서 사용하게 될 파이썬(Python)의 리스 트 형식을 말한다. 파이썬에 대해서는 좀 더 많은 이야기를 하게 될 것이며 리스트에 대해서는 부록 A에서 다시 다룬다. 이러한 표준 형식을 사용함으로써 알고리즘과 데이터를 혼합하고 연결하는 것이 가능해진다. 이번 단계에서는 알고리즘마다 다른 특유의 형식을 만들어야만 한다. 어떤 알고리 즘은 특별한 형식의 속성을 요구하기도 하며, 문자열처럼 목적 변수와 속성을 대응 시킬 수 있고, 또 어떤 경우는 속성이 정수가 되도록 해야 한다. 나중에 알게 되겠지 만, 알고리즘 특유의 형식을 만드는 것은 일반적으로 데이터를 수집하는 것에 비하 면 대수롭지 않은 일이다. 3. 입력 데이터 분석: 이 단계는 이전 작업을 바탕으로 데이터를 주의 깊게 보고자 하는 단계이다. 1, 2단계에서 데이터를 다수의 빈 값(empty values)이 없도록 확실하게 작업하기 위해서 문서 편집기(text editor)로 분석하였다면, 이러한 데이 터를 관찰하는 것은 매우 간단할 수도 있다. 만약 데이터의 어떤 패턴을 인지할 수 있거나 무엇에 관한 데이터인지 알고 있다면, 몇 가지 데이터 포인트가 나머지 다른 데이터 집합과 매우 다르다는 것을 알아볼 수 있을 것이다. 이런 판단은 하나,
1.5 기계 학습 응용 프로그램 개발 단계 15 둘 또는 세 개의 차원으로 구성된 데이터까지는 가능할 수 있다. 하지만 대부분의 경우 세 개보다 더 많은 속성을 가질 것이며, 따라서 한 번에 데이터를 모든 속성으 로 쉽게 구성할 수 없다. 그러나 우리는 다른 고급 방법을 사용할 수 있다. 앞으로 두세 단계 밑으로 내려가면서 다차원 데이터에 관해 이야기를 나누게 될 것이며 데이터도 볼 수 있게 될 것이다. 만일 제품을 생산하는 시스템을 가지고 작업을 할 경우, 데이터가 어떻게 보여야 하는지 알고 있고 그 데이터가 믿을 만한 것이라면 이번 단계를 건너뛸 수 있다. 이번 단계에서는 사람이 직접적으로 개입하게 되며, 사람이 개입하지 않는 자동화 시스템은 필요로 하지 않는다. 여기서 다루고자 하는 것은 불필요한 데이터란 없다 는 것을 이해하는 것이다. 4. 알고리즘 훈련: 이 단계는 기계 학습이 이루어지는 부분이다. 이번 단계와 다음 단계에서는 핵심 알고리즘들을 다룬다. 우리는 처음 두 단계에서 얻어진 잘 정제된 데이터를 알고리즘에 넣어 지식이나 정보를 추출한다. 이러한 지식은 종종 하나의 형식으로 저장되며 다음 두 단계에서 기계를 이용해 이를 손쉽게 사용하도록 한다. 비지도 학습의 경우 목적 값을 가지지 않기 때문에 훈련 단계가 없다. 이 단계에서 학습한 모든 것은 다음 단계에서 사용된다. 5. 알고리즘 테스트: 이 단계는 이전 단계에서 학습된 정보를 사용하는 단계이다. 알고 리즘을 평가하는 것은 훈련이 얼마나 잘 되었는지 알아보기 위해 학습된 정보를 테스트하는 것이다. 지도 학습의 경우에는 알고리즘을 평가하는 데 사용할 수 있는 몇 가지 알려진 값을 가진다. 비지도 학습의 경우에는 성공 여부를 평가하기 위해 다른 통계를 사용하게 될 것이다. 두 경우 중 어떤 것도 만족스럽지 못하다면, 네 번째 단계로 돌아가 몇 가지를 변경하고 다시 테스트를 시도할 수 있다. 종종 데이터를 수집하고 준비하는 과정에 문제가 있기도 하며, 이러한 경우에는 1단계 로 돌아가야 한다. 6. 사용하기: 여기서는 몇 가지 작업을 위해 실질적인 프로그램을 만들고 이전의 모든 단계가 예상했던 것처럼 진행되었는지 다시 한번 살펴본다. 몇 가지 새로운 데이터 를 적용하여 1~5단계를 다시 살펴보아야만 한다.
16 1장 기계 학습 기초 이제부터 기계 학습 응용 프로그램을 수행하기 위한 언어에 대해 이야기할 것이다. 우리는 폭 넓은 범위의 사람들이 이해할 수 있는 언어가 필요하다. 그리고 행렬 수학 연산과 같은 특별한 작업이 작성된 라이브러리를 가진 언어도 필요하다. 또한 개발자들이 활발하게 활동 하고 있는 커뮤니티를 가진 언어가 있었으면 한다. 파이썬은 이러한 조건들을 만족한다. 1.6 왜 파이썬인가? 파이썬은 기계 학습을 위한 훌륭한 언어이다. 파이썬은 깔끔한 문법을 가지고 있으며, 텍스트 를 조작하는 것이 매우 쉽다. 또한, 많은 사람과 다수의 단체에서 파이썬을 사용하고 있기 때문에 충분히 많은 개발 프로그램과 설명서가 있다. 1.6.1 실행 가능한 의사코드 파이썬은 깔끔한 문법 덕분에 실행 가능한 의사코드(executable pseudo-code)라는 이름을 얻게 되었다. 파이썬은 기본 설치만 해도 이미 리스트(lists), 투플(tuples), 딕셔너리(dictionaries), 집합(sets), 큐(queues) 등과 같은 높은 수준의 데이터 형태를 포함하므로, 이를 위한 별도의 프로그램을 만들 필요가 없다. 이러한 높은 수준의 데이터 형태는 추상적인 개념을 수행하기 쉽게 만든다. (파이썬과 데이터 형태 그리고 설치 방법에 대한 모든 사항은 부록 A를 보라.) 우리는 파이썬을 가지고 객체 지향(object oriented), 절차적(procedural), 기능적(functional) 형태 등 우리에게 익숙한 어떠한 형태로도 프로그램이 가능하다. 파이썬은 텍스트를 조작하거나 처리하기 쉬우며, 수치형이 아닌 데이터를 처리하는 데 이상 적이다. 정규 표현(regular expression) 사용이 거의 없는 경우에도 파이썬으로 처리할 수 있다. 파이썬은 웹페이지를 처리하기 위한 많은 라이브러리를 가지고 있으며, 직관적인 텍스 트 조작으로 HTML로부터 데이터를 쉽게 추출할 수 있다. 1.6.2 인기 좋은 파이썬 파이썬은 인기가 좋기 때문에 많은 예제를 사용할 수 있고, 빠르게 배울 수 있다. 인기가 좋다는 것은 다양한 응용 프로그램을 위해 사용 가능한 모듈이 많다는 것을 의미한다. 뿐만 아니라, 파이썬은 과학 분야와 금융 분야에서도 인기가 좋다. SciPy나 NumPy 같은 많은 과학 라이브러리는 벡터와 행렬 처리를 가능하게 한다. 이것은 더욱더 읽기 쉬운 코드를
1.6 왜 파이썬인가? 17 만들고 선형대수학처럼 보이는 코드를 작성할 수 있게 한다. 추가적으로, 과학 라이브러리인 SciPy와 NumPy는 연산 속도를 높이기 위해 C와 포트란(Fortran) 같은 저급 언어를 사용하 여 컴파일한다. 이 책에서는 NumPy를 주로 사용할 것이다. 파이썬에서는 과학적인 도구로 매스플롯라이브러리(Matplotlib)라고 불리는 플로팅 툴 (plotting tool)을 사용한다. 매스플롯라이브러리는 2D 및 3D로 도표를 그릴 수 있으며 과학 분야에서 흔히 사용되는 대부분의 도표 형태를 다룰 수 있다. 이 책에서도 매스플롯라이브러 리를 사용하게 될 것이다. 또한 파이썬은 대화형 쉘(interactive shell)을 가지고 있으며, 이것으로 개발 중인 프로그램 요소들을 확인하고 검사하는 데 사용한다. Pylab이라고 불리는 파이썬의 새로운 모듈은 NumPy, SciPy, 매스플롯라이브러리를 하나 의 환경으로 결합하고자 한 것이다. 집필 당시 이것은 아직 완성되지 않았지만 전망은 밝다. 1.6.3 장점 이것은 매틀랩(MATLAB)과 매스플롯라이브러리처럼 행렬 수학을 처리할 수 있는 높은 수준 의 언어이다. 매틀랩은 기계 학습을 더 쉽게 만드는 많은 기능을 가지고 있으며, 매우 빠르다. 하지만, 매틀랩을 사용하기 위해서는 법률적으로 수천 달러의 비용이 소비된다는 문제가 있다. 다른 회사의 프로그램들도 매틀랩을 애드온(add on)할 수는 있지만, 소스 프로젝트가 개방되어 있는 프로그램은 거의 없다. Java와 C 같은 낮은 수준의 언어 역시 행렬 수학 라이브러리를 가지고 있다. 이러한 언어가 가진 문제는 간단한 일을 처리하기 위해 너무 많은 코드를 작성해야 한다는 것이다. 고정 변수를 선정해야 하며, 이를 위해 Java에서는 사용할 때마다 setter와 getter를 작성해야 한다. 이러한 하위 클래스(subclass) 선언을 잊어서는 안 되며, 이 프로그램들은 사용하지 않을 때조차도 이 메소드를 하위 클래스로 선언해야만 한다. 밤까지 때로는 지루하게 간단한 것을 처리하기 위해 많은 코드를 작성해야 한다. 파이썬의 경우에는 그렇지 않다. 파이썬은 읽기에 명확하고 간결하며 쉽다. 또한 프로그래머가 아닌 일반 사람이 다루기에도 쉽다. Java와 C는 다루기 쉽지 않으며 파이썬보다 훨씬 더 복잡하다.
18 1장 기계 학습 기초 우리는 누구나 2학년 때 쓰기를 배운다. 우리 대부분은 더 큰 것을 위해 나아간다. -바비 나이트(Bobby knight) 언젠가는 위 문장의 쓰기 가 코드 쓰기 로 바뀔 수도 있다. 어떤 사람들은 정말로 프로그램 을 코딩하는 것을 좋아한다. 하지만 대부분의 사람들에게 프로그램을 코딩하는 것은 단순히 몇 가지 다른 작업을 수행하는 도구일 뿐이다. 파이썬은 높은 수준의 언어이므로, 데이터의 정확도가 어느 정도인지 따지는 시간을 줄이고 데이터를 분석하는 데 더 많은 시간을 보낼 수 있도록 한다. 파이썬은 별다른 노력 없이 사용자가 하고자 하는 것을 쉽게 표현할 수 있도록 해준다. 1.6.4 단점 파이썬의 유일한 단점은 Java나 C처럼 빠르지 못하다는 것이다. 파이썬에서는 C로 컴파일된 프로그램을 불러올 수 있는데, 이 방법은 두 언어의 장점을 가지고 점진적으로 향상된 프로그 램을 개발하도록 한다. 즉, 파이썬에서 생각한 것을 실험하고 생성 시스템(production system)에서 하고자 하는 것이 무엇인지 결정한다면, 향상된 프로그램을 쉽게 만들 수 있다. 따라서 이러한 프로그램이 모듈의 형태로 되어 있다면, 우선적으로 우리는 이것을 구하여 파이썬에서 실행해 볼 수 있다. 그런 다음 속도를 향상시키기 위해 C에서 해당 코드 부분을 구축하기 시작한다. 부스트(Boost) C++ 라이브러리는 이 작업을 쉽게 할 수 있도록 한다. 이외에 일반 파이썬보다 더 좋은 성능을 위해 파이썬의 형태로 작성할 수 있는 싸이썬 (Cython)과 파이파이(PyPy) 같은 도구들도 있다. 만약에 프로그램이나 응용 프로그램에 대한 아이디어에 결함이 있다면, 저속뿐만 아니라 고속에서도 결함이 발생하게 될 것이다. 만약에 아이디어가 잘못되었다면, 신속하게 코드를 다시 작성하거나 많은 사용자들이 어떠한 변경도 가하지 못하도록 범위를 변경한다. 파이썬 이 정말 대단한 것은 아이디어를 실행을 통해 빠르게 확인해 볼 수 있도록 하는 것이며, 필요하다면 그것을 최적화할 수 있다는 것이다. 이제 여러분은 파이썬이라는 언어를 사용할 준비가 되었다. 다음 절에서는 파이썬의 쉘(shell) 과 NumPy를 사용하여 작업을 진행하게 될 것이다.
1.7 NumPy 라이브러리로 시작하기 19 1.7 NumPy 라이브러리로 시작하기 이 책에서는 몇 가지의 선형 대수를 사용할 것이기 때문에 NumPy를 자주 사용하게 된다. 선형 대수에 관해서는 걱정하지 않아도 된다. 우리는 그저 수많은 데이터를 표현하기 위해 수학 연산자를 사용할 뿐이다. 만약에 행렬로 데이터를 대신한다면, 너저분한 루프(loop) 무리들 없이 간단한 수식으로 처리할 수 있다. 우선, 어떤 기계 학습 알고리즘을 다루더라도 파이썬과 NumPy가 제대로 설치되어 있는지 확인해야 한다. NumPy는 파이썬과는 분리된 모듈이므로 파이썬의 배포판과 함께 설치되지 않는다. 따라서 파이썬을 설치한 후 NumPy를 설치해야 한다. 파이썬 쉘을 시작하면 Windows 명령어 프롬프트가 열리며 Linux와 Mac OS에서는 터미널(terminal)이 열린다. 각 명령어 줄에서, Windows는 c:\python27\python.exe 라고 입력하고, Linux와 Mac에서는 python이라고 입력한다. 이 지점에서는 언제든 다음과 같은 기호가 보인다. >>> 이 기호는 파이썬 쉘을 의미하는 것이다. 파이썬 쉘에서 다음과 같은 명령어를 입력한다. >>> from numpy import * 이 명령은 모든 NumPy 모듈을 현재의 네임스페이스(namespace)로 불러들인다. 이것은 그림 1.3에서 보는 바와 같으며, Mac OS 환경에서 실행한 것이다. 그림 1.3 명령어 줄에서 파이썬 시작하기와 파이썬 쉘에서 모듈 불러오기 그런 다음, 파이썬 쉘에서 다음과 같이 입력한다. >>> random.rand(4,4) array([[ 0.70328595, 0.40951383, 0.7475052, 0.07061094], [ 0.9571294, 0.97588446, 0.2728084, 0.5257719 ],
20 1장 기계 학습 기초 [ 0.05431627, 0.01396732, 0.60304292, 0.19362288], [ 0.10648952, 0.27317698, 0.45582919, 0.04881605]]) 이것은 임의로 4 4 크기의 행렬을 생성한 것이다. 현재 보이는 숫자와 실습해서 나온 숫자가 서로 다르더라도 걱정할 필요는 없다. 여기에 있는 숫자는 임의의 숫자임으로 매번 다르게 보일 수 있다. NumPy 행렬 대 배열 NumPy에서는 행(row, 로우)과 열(column, 칼럼)의 수라는 서로 다른 두 가지 데이터 유형이 있다. 이들은 비슷하 게 보이기 때문에 주의해야 한다. 즉, 두 가지의 데이터 유형을 곱하는 것과 같이 간단한 수학적 연산을 할 경우 다른 의미를 가질 수 있기 때문이다. 행렬 데이터 유형은 MATLAB에서 보다 더 많이 활용된다. 언제나 mat() 함수를 호출하여, 다음과 같이 행렬의 배열에 변화를 줄 수 있다. >>> randmat = mat(random.rand(4, 4)) 여기에 있는 숫자는 임의로 부여한 것이기 때문에, 아마도 실습한 값은 여기에 보이는 값과 다를 것이다. >>> randmat.i matrix([[ 0.24497106, 1.75854497, 1.77728665, 0.0834912], [ 1.49792202, 2.12925479, 1.32132491, 9.75890849], [ 2.76042144, 1.67271779, 0.29226613, 8.45413693], [ 2.03011142, 3.07832136, 1.4420448, 9.62598044]]) 위에 보이는.I 연산자는 역행렬을 표현한 것으로 매우 쉽게 해결이 된다. 그럼, 파이썬에서 NumPy 없이 시도해 보자. 역행렬을 어떻게 해결하는지 기억이 나지 않거나 배운 적이 없는 것 같다고 하더라도 걱정할 필요는 없다. 이 모든 것은 여러분을 위해 이미 프로그램으 로 준비되어 있다. >>> invrandmat = randmat.i 행렬 간의 곱하기도 할 수 있다. 다음과 같이 실행시켜 보자. >>> myeye = randmat * invrandmat >>> myeye matrix([[1.00000000e+00, 0.00000000e+00, 2.22044605e 16, 1.77635684e 15], [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00],
1.8 요약 21 [0.00000000e+00, 4.44089210e 16, 1.00000000e+00, 8.88178420e 16], [ 2.22044605e 16, 0.00000000e+00, 1.11022302e 16, 1.00000000e+00]]) 이 결과는 대각선상에 있는 원소가 1이고, 대각을 제외한 나머지 원소는 모두 0인 4 4 단위행 렬(identity matrix)이다. 하지만, 이 행렬은 정확한 단위행렬이 아니다. 이 행렬에는 매우 작은 값을 갖는 원소들이 아직 존재한다. 아직 남아 있는 원소들을 확인해 보도록 하자. >>> myeye eye(4) matrix([[0.00000000e+00, 6.59194921e 17, 4.85722573e 17, 4.99600361e 16], [2.22044605e 16, 0.00000000e+00, 6.03683770e 16, 7.77156117e 16], [ 5.55111512e 17, 1.04083409e 17, 3.33066907e 16, 2.22044605e 16], [5.55111512e 17, 1.56125113e 17, 5.55111512e 17,......]]) 여기서, eye(4) 함수는 단지 크기가 4인 단위행렬만을 생성한다. 만약 이 예제를 통해서 어떤 값을 얻었다면, NumPy가 정확하게 설치된 것이다. 이제 기계 학습을 이용하여 몇 가지 강력한 프로그램을 만들기 위한 준비를 마쳤다. 이전에 이런 함수를 본 적이 없다 하더라도 걱정하지 않아도 된다. 이 책에서는 필요할 때마다 예제를 통해서 더 많은 NumPy의 기능이 소개될 것이다. 1.8 요약 기계 학습은 우리가 인식하지 못하는 사이에도 이미 일상생활 속에서 사용되고 있다. 앞으로 도 우리에게 오는 데이터의 양은 줄어들지 않을 것이며, 데이터 기반 산업에서 이 모든 데이터를 이해하게 된다는 것은 사람들이 일을 하는 데 중요한 기술이 될 것이다. 기계 학습에서는 데이터 사례를 주의 깊게 살펴본다. 각각의 데이터 사례는 많은 속성으로 구성된다. 기계 학습의 중요한 작업이면서 인기 있는 것 중 하나인 분류는 알려지지 않은 데이터 조각들을 알려진 집단으로 배치하는 데 사용된다. 분류기를 만들거나 훈련하기 위해서 는 분류 항목을 알고 있는 데이터를 사용해야 한다. 이러한 데이터를 훈련 집합이라고 한다. 나는 조류를 인식하기 위해 사용했던 전문가 시스템이 완벽할 것이라거나 인간이 하는 것보 다 좋다고 주장하지는 않는다. 다만, 인간 전문가에 가까운 정확한 기계를 만들면 삶의 질을 크게 높일 수 있다. 인간 의사의 정확도에 견줄 만한 소프트웨어를 만들 때가 되면, 사람들은 더 빨리 치료를 받을 수 있다. 날씨 예측을 더 정확하게 하면 물부족을 없애고 더 많은
22 1장 기계 학습 기초 음식을 공급하도록 할 수 있다. 이처럼 기계 학습에 대한 유용한 예제는 끝이 없다. 다음 장에서는 첫 번째 기계 학습 알고리즘을 소개할 것이다. 이것은 분류의 한 가지 예이고 지도 학습의 한 형태이다. 향후 여섯 개 장은 분류에 대한 내용을 다룬다.
Machine Learning in Action 2장 k-최근접 이웃 알고리즘 학습 목표 k-최근접 이웃 알고리즘 텍스트 파일로부터 데이터 불러오기 및 구문 분석 매스플롯라이브러리를 이용하여 scatter 플롯 생성 수치형 값 정규화 혹시 영화를 장르별로 분류해 본 적이 있는가? 무엇이 영화의 장르를 결정하게 하는가? 그리고 누가 어떤 장르의 영화라고 말하는가? 한 장르의 영화는 비슷한데, 무엇이 이들을 비슷하게 하는가? 만약 영화 제작 관계자에게 물어본다 하더라도, 자신들이 만든 영화가 다른 어떤 영화와 비슷하다고 말하지는 않을 것이다. 하지만 우리는 어떤 식으로든 이 영화들 이 유사하다는 것을 알고 있다. 무엇이 액션 영화를 액션 영화로 불리게 만들며, 로맨스 영화와는 다르게 만드는 것일까? 액션 영화에서 키스하는 장면이 나오는 반면 로맨스 영화에 서도 발차기 장면이 나오지 않는가? 그렇다. 하지만, 로맨스 영화에 키스 장면이 더 많이 나오며, 액션 영화에는 발차기 장면이 더 많이 나온다. 아마도 키스나 발차기 또는 영화마다 다른 어떤 것을 판단 기준으로 삼는다면, 어떤 영화가 무슨 장르에 속하는지 자동적으로 알아낼 수 있게 될 것이다. 나는 k 최근접 이웃(k Nearest Neighbors) 알고리즘에 대한 개념 을 설명하기 위해 영화를 사용할 것이다. 이번 장에서는 첫 번째 기계 학습 알고리즘으로 k 최근접 이웃 알고리즘을 다룰 것이다. k 최근접 이웃은 이해하기 쉽고 매우 효과적인 알고리즘이다. 먼저, 이론을 설명하고 아이템 을 분류하기 위해 사용되는 거리 측정(distance measurement) 역주1 의 6) 개념을 어떻게 사용할 역주1 거리(distance)의 개념은 xy 좌표평면에서 두 점 간의 간격을 생각하면 쉽게 이해할 수 있을 것이다. 이 간 격이 곧 거리이다.
24 2장 k-최근접 이웃 알고리즘 수 있는지 설명한다. 그런 다음, 파이썬을 이용하여 어떻게 텍스트 파일로부터 데이터를 쉽게 불러오고 구문 분석을 하는지 알아볼 것이다. 우리는 많은 원시 데이터로부터 데이터를 가져올 때나 거리를 계산할 때, 몇 가지 일반적인 어려움에 직면하게 될 것이다. 우리는 이 모든 것을 예제를 통해 다루게 될 것이다. 여기서 사용하게 될 예제는 데이트 웹 사이트와 손으로 쓴 숫자 인식에 대한 결과를 개선하는 것이다. 2.1 거리 측정을 이용하여 분류하기 k-최근접 이웃 알고리즘 장점: 높은 정확도, 오류 데이터(outlier)에 둔감, 데이터에 대한 가정이 없음 단점: 계산 비용이 높음, 많은 메모리 요구 적용: 수치형 값, 명목형 값 첫 번째 기계 학습 알고리즘으로 k-최근접 이웃(kNN) 알고리즘을 살펴볼 것이다. knn은 다음 과 같이 동작한다. 기존에 훈련 집합이었던 예제 데이터 집합이 있다. 모든 데이터는 분류 항목 표시(labels)가 붙어 있으며, 따라서 각각의 데이터가 어떤 분류 항목으로 구분되는지 알 수 있다. 이후 분류 항목 표시가 붙어 있지 않은 새로운 데이터가 주어졌을 때, 기존의 모든 데이터와 새로운 데이터를 비교한다. 그리고 가장 유사한 데이터(가장 근접한 이웃)의 분류 항목 표시를 살펴본다. 이때, 분류 항목을 이미 알고 있는 데이터 집합에서 상위 k개의 가장 유사한 데이터를 살펴보게 된다. (이것이 k의 유래이며, 여기서 k는 일반적으로 20 미만의 정수를 사용한다.) 마지막으로, k개의 가장 유사한 데이터들 중 다수결(majority vote)을 통해 새로운 데이터의 분류 항목을 결정하게 된다. 로맨스 영화와 액션 영화를 분류하는 간단한 예제를 살펴보도록 하자. 많은 영화를 관람한 누군가가 각각의 영화마다 발차기 장면과 키스 장면의 출현 횟수를 센다. 그림 2.1에는 6편의 영화 속에 출현하는 키스 장면과 발차기 장면의 횟수가 표시되어 있다. 지금, 당신은 아직 보지 못한 영화 한 편을 찾고 있으며, 그 영화가 로맨스 영화인지 액션 영화인지를 알고자 한다. 이를 결정하기 위해 knn 알고리즘을 사용할 것이다. 우리는 물음표에 해당하는 영화를 찾고 있으며, 이 영화에 얼마나 많은 발차기 장면과 키스 장면이 나오는지 확인한다. 그림 2.1에는 몇 개의 다른 영화와 함께 하나의 큰 물음표가 위치해 있다. 각 영화들의 세부 사항은 표 2.1과 같다.
2.1 거리 측정을 이용하여 분류하기 25 (발차기 장면 횟수) 그림 2.1 영화 속 발차기 장면과 키스 장면 출현 에 따른 영화 분류 표 2.1 각 영화의 발차기 장면과 키스 장면 횟수에 따른 영화의 분류 영화 제목 발차기 장면 획수 키스 장면 횟수 영화 유형 California Man He's Not Really into Dudes Beautiful Woman Kevin Longblade Robo Slayer 3000 Amped II? 3 2 1 101 99 98 18 104 100 81 10 5 2 90 로맨스 로맨스 로맨스 액션 액션 액션 알 수 없음 물음표에 해당하는 영화의 유형이 무엇인지는 알 수 없지만, 그것을 계산하기 위한 한 가지 방법이 있다. 우선, 다른 모든 영화와의 거리를 계산하는 것이다. 표 2.2에 거리를 계산한 것을 표시하였다. (계산이 어떻게 되었는지에 대해서는 걱정하지 않아도 된다. 우리는 곧 이에 대해 다룰 것이다.) 영화 제목 California Man He's Not Really into Dudes Beautiful Woman Kevin Longblade Robo Slayer 3000 Amped II 영화? 와의 거리 20.5 18.7 19.2 115.3 117.4 118.9 표 2.2 각 영화와 알려지지 않은 영화 간의 거리 지금 이것은 알려지지 않은 영화에 대한 모든 거리를 구한 것이며, 거리를 내림차순으로 정렬하여 가장 가까운 k개의 영화를 찾아야 한다. k=3이라고 하자. 그러면 세 개의 가장 가까운 영화는 California Man, Heʹs Not Really into Dudes, Beautiful Woman이 된다.
26 2장 k-최근접 이웃 알고리즘 knn 알고리즘은 물음표에 해당하는 영화의 분류 항목을 결정하기 위하여 이 세 개의 영화에 서 다수결로 뽑힌 것을 선정한다. 즉, 세 영화 모두 로맨스이기 때문에 의문의 영화는 로맨스 영화로 예측된다. 이번 장에서는 실질적인 기계 학습 알고리즘을 다룰 것이며, 파이썬 툴과 기계 학습 용어에 대하여 소개할 것이다. 우선 알고리즘을 정확하게 사용하기 위해 knn 알고리즘의 간단한 예제를 가지고 진행할 것이다. knn의 일반적인 접근 방법 1. 수집: 모든 방법 2. 준비: 수치형 값(거리를 계산하기 위해 필요), 구조적으로 표현된 데이터 형식이 가장 좋다. 3. 분석: 모든 방법 4. 훈련: knn 알고리즘은 적용되지 않음 5. 검사: 오류율(error rate)을 계산함 6. 사용: 응용 프로그램은 입력 데이터를 받아 구조가 있는 수치형 값으로 출력하는 데 필요하다. 그런 다음, 응용 프로그램은 입력 데이터를 가지고 knn 알고리즘을 실행해서 입력 데이터가 속하는 분류 항목 을 결정한다. 응용 프로그램은 이때 계산된 분류 항목에서 몇 가지 조치를 취한다. 2.1.1 준비: 파이썬으로 데이터 불러오기 먼저, knn.py라고 불리는 파이썬 모듈을 생성하고 여기에 이번 장에서 사용될 모든 코드를 넣게 될 것이다. 각자 자신의 파일을 생성하고, 이 책을 따라 코드를 입력하거나 책에 있는 소스 코드를 다운로드받아 사용할 수도 있다. 학습을 위해 가장 좋은 방법은 빈 모듈로 시작하여 코드를 직접 입력하는 것이다. 우선 knn.py를 생성하거나 소스 코드를 다운로드받아 복사해 오도록 하자. knn 알고리즘 을 전부 생성하기 전에 몇 가지 지원 기능을 생성할 것이다. knn.py에 다음 소스 코드를 추가하자. from numpy import * import operator def createdataset(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels
2.1 거리 측정을 이용하여 분류하기 27 이 코드에서는 두 개의 모듈을 불러온다. 하나는 NumPy로 과학용 계산 패키지이다. 두 번째 모듈은 operator 모듈이며, knn 알고리즘에서 정렬 처리를 하기 위해 나중에 사용하 게 된다. createdataset() 함수는 우리의 편의를 위한 함수이다. 그림 2.1에서 보았던 것처럼 데이터 집합과 분류 항목을 생성한다. 자, 이렇게 한번 해 보도록 하자. knn.py 저장 저장할 knn.py 디렉터리 변경 파이썬 대화 세션 실행. 시작하려면 Windows에서 커맨드 프롬 프트를 여는 것처럼 Linux/Mac OS에서 새로운 터미널을 열어야 한다. Linux 또는 Mac을 사용하고 있다면, 시작하기 위해 커맨드 라인(command line)에 python이라고 입력해야 한 다. Windows 사용자는 C:\Python26\python.exe로 직접 지정해야 파이썬 프로그램을 시작 할 수 있다. 당신이 파이썬 대신 다른 이름을 사용하고 있지 않다면 말이다. 지난번에 모듈을 불러들이기 위해 파이썬에서 시도했던 것과 마찬가지로 다음과 같이 입력해 야 한다. >>> import knn 이것이 knn 모듈을 불러들이는 방법이다. 동일한 데이터 집합을 보도록 만들기 위해 createdataset이라는 함수를 생성했었다. 파이썬 커맨드 프롬프트에 다음과 같이 입력해 보자. >>> group, labels = knn.createdataset() 이것은 두 개의 변수인 group과 labels를 생성한다. 각 변수를 검토하기 위해 파이썬 커맨드 프롬프트에 변수의 이름을 입력해 보자. >>> group array([[1., 1.1], [1., 1.], [0., 0.], [0., 0.1]]) >>> labels ['A', 'A', 'B', 'B'] 여기에 네 개의 데이터가 있다. 각각의 데이터는 두 개의 속성 또는 특징을 가지고 있다. group 행렬에서 각 로우(row)는 다른 데이터이다. 이 데이터들을 일부 기록을 정리해 놓은 것으로서 서로 다른 측정값이나 항목이라고 생각해 보자. 모든 사람들이 그렇듯 하나, 둘,
28 2장 k-최근접 이웃 알고리즘 또는 세 개의 차원까지는 시각화할 수 있지만 우리 뇌의 한계는 여기까지다. 그래서 시각화를 쉽게 할 수 있도록 각 데이터 지점(data point)을 표현하는 데 2개의 속성만을 사용한다. labels 벡터는 각 데이터 지점에 주어진 분류 항목을 전달한다. 이 벡터에는 마치 group 행렬에 있는 로우처럼 많은 아이템이 있을 수 있다. 데이터 측정값 (1, 1.1)을 분류 항목 A로 할당하고, (0, 0.1)을 분류 항목 B에 할당한다. 이 예제의 값은 설명을 하기 위해 임의로 선택된 값이며, 두 개의 축에 대한 표시는 되어 있지 않다. 분류 항목 표시가 있는 네 개의 데이터 측정값은 그림 2.2에 표시하였다. 지금 여러분은 구문 분석을 어떻게 할 것이며, 데이터를 파이썬으로 어떻게 불러들일지 그리 고 knn 알고리즘을 어떻게 다루어야 할지를 생각하고 있을 것이다. 일단, 그것을 다함께 넣고 몇 가지 분류를 수행해 보도록 하자. 그림 2.2 매우 간단한 knn 예제에 대한 네 개의 데이터 측정값 2.1.2 knn 분류 알고리즘 실행하기 여기서 다룰 주제는 하나의 데이터로 knn 알고리즘을 실행하기 위해 리스팅 2.1처럼 함수 를 만드는 것이다. 우선 의사코드를 가지고 함수에 대해 설명한 다음, 실제 파이썬으로 작성 된 코드를 가지고 세부적인 설명을 할 것이다. 기억해 두자. 이 함수의 목적은 inx라고 불리는 하나의 데이터를 분류하기 위해 knn 알고리즘을 사용하는 것이라는 것을. 이러한 기능을 위한 의사코드는 다음과 같다.
2.1 거리 측정을 이용하여 분류하기 29 For every point in our dataset: //데이터 집합에 있는 모든 측정값 반복 calculate the distance between inx and the current point //inx와 현재 측정값 사이의 거리 계산 sort the distances in increasing order //오름차순으로 거리 정렬 take k items with lowest distances to inx //inx와의 거리가 가장 짧은 k개의 아이템 추출 find the majority class among these items //k개의 아이템에서 가장 많은 분류 항목 찾기 return the majority class as our prediction for the class of inx //inx의 분류 항목을 예측하기 위해 가장 많은 분류 항목을 반환함 classify0() 함수의 파이썬 코드는 다음에 나오는 리스팅과 같다. 리스팅 2.1 k-최근접 이웃 알고리즘 def classify0(inx, dataset, labels, k): datasetsize = dataset.shape[0] diffmat = tile(inx, (datasetsize, 1)) dataset sqdiffmat = diffmat ** 2 sqdistances = sqdiffmat.sum(axis = 1) distances = sqdistances ** 0.5 sorteddistindicies = distances.argsort() classcount={} for i in range(k): voteilabel = labels[sorteddistindicies[i]] classcount[voteilabel] = classcount.get(voteilabel, 0) + 1 sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true) return sortedclasscount[0][0] 1 거리 계산 가장 짧은 k 거리를 투표 3 2 아이템 정렬 함수 classify0()는 네 가지 입력을 처리한다. 분류를 위한 입력 벡터를 inx라 하고, 훈련을 위한 예제의 전체 행렬을 dataset이라고 하며, 분류 항목을 표시한 벡터를 labels라고 한다. 마지막으로 k는 투표에서 사용하게 될 최근접 이웃 수이다. labels 벡터 안에는 많은 요소들 이 있으며, 이 요소들이 곧 dataset 행렬 안의 로우를 뜻한다. 거리 ❶은 유클리드(Euclidian) 거리를 사용하여 계산된다. 여기서 두 가지 요소, 즉 두 벡터 와 간의 거리는 다음 수식으로 구한다.
30 2장 k-최근접 이웃 알고리즘 예를 들어, 측정값 (0, 0)과 (1, 2) 간의 거리는 다음과 같이 계산된다. 만약에 네 개의 속성을 가지고 계산하면, 측정값 (1, 0, 0, 1)과 (7, 6, 9, 4) 간의 거리는 다음과 같이 계산될 것이다. 거리를 계산한 다음에는 가장 짧은 것에서 가장 긴 것 순으로 정렬된다. (이것이 기본 설정이 다.) 다음 ❷에서 처음 k개 또는 거리가 가장 짧은 k개가 inx의 분류 항목에서 투표를 하는 데 사용된다. 입력 k의 값은 항상 양의 정수 값이다. 마지막으로, ❸ classcount 딕셔너리 (dictionary)를 가지고 투플(tuple) 형태의 리스트로 분해한다. 그런 다음, 투플에 있는 두 번째 아이템으로 itemgetter 메소드를 사용하여 투플을 정렬한다. itemgetter 메소드는 프로그램 두 번째 줄에서 불러들인 operator 모듈에 있는 메소드이다. 이 정렬은 반대로 이루어지기 때문에 가장 작은 것이 가장 큰 것이 된다. 마지막으로, 가장 빈번하게 발생한 아이템의 분류 항목 표시를 돌려보내게 된다. 분류 항목을 예측하기 위해서는 파이썬 프롬프트에서 다음과 같이 입력해야 한다. >>> knn.classify0([0, 0], group, labels, 3) 이것의 결과는 B가 될 것이다. 답변이 어떻게 변경되는지 보기 위해서 [0, 0]을 넣어 변화시켜 보자. 당신의 첫 번째 분류기 완성을 축하한다. 이 간단한 분류기를 가지고 더 많은 것을 분류해 볼 수 있으며, 비슷한 예제를 주변에서 쉽게 구할 수 있다. 2.1.3 분류기 검사하기 우리는 knn 알고리즘을 만들었고 기대했던 주어진 답변을 보게 되었다. 스스로에게 물어 보자. 어떠한 관점에서도 이것을 사용할 수 있는가? 또는 이 방법이 항상 옳은 것인가? 그렇지 않다. 이 방법이 항상 옳다고는 할 수 없다. 분류기가 옳은 답을 얼마나 잘 찾는지를
2.2 예제: knn을 이용하여 데이트 사이트의 만남 주선 개선하기 31 분석하는 다양한 방법이 있다. 또한, 마치 분류기와 데이터 집합을 설정하는 것처럼 분류기의 성능에 영향을 미치는 다양한 요소들도 존재한다. 다양한 알고리즘은 다양한 데이터 집합으 로 다양하게 수행된다. 이 책에는 분류 방법에 대한 여섯 개의 장이 준비되어 있다. 분류기를 검사하기 위하여 알려진 데이터에서 분류기가 답을 알 수 없도록 감춘 다음, 분류기 에게 가장 좋은 예측을 하도록 요청할 수 있다. 그리고 분류기가 데이터를 잘못 분류한 횟수를 합산하여 제공된 데이터를 검사한 총 횟수로 나누어 보자. 이것을 오류율(error rate)이 라고 하며, 분류기가 데이터 집합을 얼마나 잘 분류하는지 판단하기 위한 일반적인 기준이 된다. 오류율이 0이라는 것은 분류기가 완벽하다는 것을 의미하며, 오류율이 1.0이라는 것은 분류기가 분류한 것이 모두 잘못되었다는 것을 의미한다. 한정된 데이터를 가지고 실험을 해 보면 알 수 있을 것이다. 이번 절에서 다룬 예제는 동작하기는 하지만 유용하지는 않다. 따라서, 다음 두 가지 실제 예제를 사용하여 knn을 간단하게 시험해 보고자 한다. 우선, knn을 가지고 데이트 사이트 에서 결과를 개선하는 것에 대해 살펴볼 것이며, 그런 다음 인상적인 필기체 인식에 관한 예제를 살펴볼 것이다. 즉, knn 알고리즘이 동작하는지 알아보기 위해 필기체 인식에 적용해 볼 것이다. 2.2 예제: knn을 이용하여 데이트 사이트의 만남 주선 개선하기 내 친구 헬렌은 함께 데이트할 상대를 찾기 위해 몇 개의 온라인 데이트 사이트에 가입했다. 그녀는 사이트의 권고에도 불구하고 데이트했던 모든 사람을 좋아하지 않았었다는 것을 깨달았다. 약간의 반성을 한 후, 그녀는 데이트했던 사람들에게 세 가지 유형이 있다는 것을 알게 되었다. 좋아하지 않았던 사람들 조금 좋아했던 사람들 많이 좋아했던 사람들 그러나 헬렌은 무엇에 의해 이러한 유형의 사람들이 결정되는지 이해할 수 없었다. 그들 모두는 데이트 사이트에서 그녀에게 추천했던 사람들이다. 그녀가 조금 좋아했던 사람들은 월요일부터 금요일 사이에 만났다. 하지만 주말에는 많이 좋아했던 사람들과 더 많은 시간을 보냈었다. 헬렌은 우리에게 앞으로 만날 사람들을 걸러내기 위해 분류하는 것을 도와달라고