1장. 한눈에 보는 머신러닝¶
대부분 사람들은 '머신러닝 machine learning' 이란 말을 들으면 로봇을 떠올린다. 누구에게 묻는지에 따라 믿음직한 집사 로봇이나 살인 병기 터미네이터를 생각할 것이다. 하지만 머신러닝은 초현실 판타지가 아니고 이미 우리 주위에 있다. 사실 광학 문자 판독기 optical character recognition(OCR) 같은 특별한 몇 가지 애플리케이션이 수십 년 동안 사용되어왔다. 수억 명의 생활을 편리하게 만들어 주류가 된 첫 번째 머신러닝 애플리케이션은 1990년대에 시작되었다. 바로 스팸 필터 spam filter 이다. 스스로 생각하는 스카이넷 Skynet 정도는 아니지만 기술적으로 머신러닝이라고 할 수 있다. (실제로 잘 학습되어 있어서 여러분은 더는 이메일에 스팸이라고 표시할 일이 거의 없다.) 이후 추천과 음성 검색으로 발전했으며, 매일 사용하는 많은 제품과 기능을 소리없이 향상시킨 수백 개의 머신러닝 애플리케이션이 나왔다.
머신러닝의 세상을 탐험하기 전에 전체 머신러닝의 그림을 조망하고 주요 영역과 가장 중요한 랜드마크인 지도 학습과 비지도 학습, 온라인 학습과 배치 학습, 사례 기반 학급과 모델 기반 학습을 알아보겠다. 또한 전형적인 머신러닝 프로젝트의 작업 흐름을 살펴보고 만날 수 있는 주요 문제점과 머신러닝 시스템을 평가하고 세밀하게 튜닝하는 방법을 다루겠다.
1.1 머신러닝이란?¶
머신러닝은 데이터에서부터 학습하도록 컴퓨터를 프로그래밍하는 과학(또는 예술)이다. 조금 더 일반적인 정의는 다음과 같다.
[머신러닝]은 명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구 분야다.
조금 더 공학적인 정의는 다음과 같다.
어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 P에 대해 경험 E로 학습한 것이다.
스팸필터는 스팸메일과 일반메일의 샘플을 이용해 스팸메일 구분법을 배울 수 있는 머신러닝 프로그램이다. 시스템이 학습하는 데 사용하는 샘플을 훈련세트 trainning set라고 하고 각 훈련 데이터를 훈련 사례 trainnig instance 혹은 샘플라고 한다. 이 경우 작업 T는 새로운 메일이 스팸인지 구분하는 것이고, 경험 E는 훈련 데이터 trainnig data이며, 성능 측정 P는 직접 정의해야 한다. 예를 들면 정확히 분류된 메일의 비율을 P로 사용할 수 있다. 이 성능 측정을 정확도 accuracy라고 부르며 분류 작업에 자주 사용된다. 위키백과 문서를 모두 내려받으면 우리 컴퓨터는 아주 많은 데이터를 갖게 된다. 그렇다고 해서 어떤 작업이 갑자기 좋아지는 것은 아니다. 그러므로 위키백과 문서를 다운로드하는 것은 머신러닝이 아니다.
1.2 왜 머신러닝을 사용하는가?¶
전통적인 프로그래밍 기법을 사용해 어떻게 스팸 필터를 만들 수 있을지 생각해보자.
- 먼저 스팸에 어떤 단어들이 주로 나타나는지 살펴본다. 그러면 '4U','신용카드','무료','굉장한' 같은 단어나 구절이 제목에 많이 나타나는 경향이 있다는 것을 알 수 있다. 어쩌면 보낸이의 이름이나 메일 주소, 본문이나 이메일의 다른 요소에서 다른 패턴을 감지할 수도 있다.
- 발견한 각 패턴을 감지하는 알고리즘을 작성하여 프로그램이 이런 패턴을 발견했을 때 그 메일을 스팸으로 분류하게 된다.
- 프로그램을 테스트하고 론칭할 만큼 충분한 성능이 나올 때까지 1단계와 2단계를 반복한다.
문제가 어렵기 때문에 규칙이 점점 길고 복잡해지므로 유지 보수하기 매우 힘들어진다.
그림 1-1 전통적인 접근 방법
반면 머신러닝 기법에 기반을 둔 스팸 필터는 일반 메일에 비해 스팸에 자주 나타나는 패턴을 감지하여 어떤 단어와 구절이 스팸 메일을 판단하는 데 좋은 기준인지 자동으로 학습한다. 그러므로 프로그램이 훨씬 짧아지고 유지 보수하기 쉬우며 대부분 정확도가 더 높다.
그림 1-2 머신러닝 접근 방법
스팸 메일 발송자가 '4U'를 포함한 모든 메일이 차단된다는 것을 안다면 어떻게 될까? 아마도 '4U'대신 'For U'를 쓰기 시작할지도 모른다. 전통적인 프로그래밍 방식의 스팸 필터는 'For U'메일을 구분하기 위해 수정이 필요하다. 스팸 메일 방송자가 스팸 필터에 대항해 계속 단어를 바꾸면 영원히 새로운 규칙을 추가해야 한다.
하지만 머신러닝 기반의 스팸 필터는 사용자가 스팸으로 지정한 메일에 유독 'For U'가 자주 나타나는 것을 자동으로 인식하고 별도의 작업을 하지 않아도 자동으로 이 단어를 스팸으로 분류한다.
머신러닝이 유용한 또 다른 분야는 전통적인 방식으로는 너무 복잡하거나 알려진 알고리즘이 없는 문제이다. '음성 인식'을 예로 들 수 있다. 'one'과 ''two'두 단어를 구분하는 프로그램을 작성한다고 하자. 단어 'two'는 높은 피치 pich의 사운드('T')로 시작하므로 높은 피치의 사운드 강도를 측정하는 알고리즘을 하드코딩해서 'one'과 'two'를 구분할 수도 있다. 당연히 이 방법은 소음이 있는 환경에서 수백만 명이 말하는 여러 언어로 된 수천개의 단어를 구분하는 것으로 확장하기 어렵다. 각 단어를 녹음한 샘플을 사용해 스스로 학습하는 알고리즘을 작성하는 것이 현재 가장 좋은 솔루션이다.
우리는 머신러닝을 통해 배울 수도 있다. 즉, 머신러닝 알고리즘이 학습한 것을 조사할 수 있다. 예를 들어 스팸필터가 충분한 스팸 메일로 훈련되었다면 스팸을 예측하는 데 가장 좋은 단어 및 단어의 조합이 무엇인지 확인할 수 있다. 가끔 예상치 못한 연관 관계나 새로운 추세가 발견되기도 해서 해당 문제를 더 잘 이해하도록 도와준다. 머신러닝 기술을 적용해서 대용량의 데이터를 분석하면 겉으로는 보이지 않던 패턴을 발견할 수 있다. 이를 데이터 마이닝 data mining이라고 한다.
요약하면 머신러닝은 다음 분야에 뛰어납니다.
- 기존 솔루션으로는 많은 수동 조정과 규칙이 필요한 문제: 하나의 머신러닝 모델이 코드를 간단하게 만들고 전통적인 방법보다 더 잘 수행되도록 할 수 있다.
- 전통적인 방식으로는 해결 방법이 없는 복잡한 문제: 가장 뛰어난 머신러닝 기법으로 해결 방법을 찾을 수 있다.
- 유동적인 환경: 머신러닝 시스템은 새로운 데이터에 적응할 수 있다.
- 복잡한 문제와 대량의 데이터에서 통찰 얻기
1.3 애플리케이션 사례¶
구체적인 머신러닝 작업의 사례와 이를 위한 기술을 함께 살펴보겠다.
- 생산 라인에서 제품 이미지를 분석해 자동으로 분류하기: 이미지 분류 작업이다. 일반적으로 합성공 신경망(convolutional neural network CNN)을 사용하여 수행한다.
- 뇌를 스캔하여 종양 진단하기: 시맨틱 분할 작업이다. 일반적으로 CNN을 사용해 이미지의 각 픽셀을 분류한다.(종양의 정화간 위치와 모양을 결정해야 한다.)
- 자동으로 뉴스 기사를 분류하기: 자연어 처리 netural language processing NLP 작업이다. 더 구체적으로 말하면 텍스트 분류이다. 순환 신경망 recurrent neural network(RNN),CNN,트래스포머 Transformer를 사용해 해결할 수 있다.
- 토론 포럼에서 부정적인 코멘트를 자동으로 구분하기: 역시 텍스트 분류작업이다.
- 긴 문서를 자동으로 요약하기: 텍스트 요약이라고 불리는 NLP의 한 분야이다.
- 챗봇 chatbot 또는 개인 비서 만들기: 자연어 이해 natural language understanding NLU와 질문-대답 모듈을 사용해 여러가지 NLP 컴포넌트가 필요하다.
- 다양한 성능 지표를 기반으로 회사의 내년도 수익을 예측하기: 회귀 regression 작업이다.(즉 숫자로 값을 예측한다) 선형 회귀, 다항 회귀, 회귀 랜덤포레스트, 인공 신경망 artificial neural network과 같은 회귀 모델을 사용해서 해결 할 수있다. 지난 성능 지표의 시퀀스를 고려한다면 RNN, CNN 또는 트랜스포머를 사용할 수 있다.
- 음성 명령에 반응하는 앱을 만들기: 음성 음식 작업이다. 오디오 샘플 처리해야 한다. 이는 길고 복잡한 시퀀스이므로 일반적으로 RNN, CNN 또는 트랜스포머를 사용한다.
- 신용 카드 부정 거래 감지하기: 이상치 탐지 작업이다.
- 구매 이력을 기반으로 고객을 나누고 각 집합마다 다른 마케팅 전략을 계회하기: 군집 clustering 작업이다.
- 고차원의 복잡한 데이터셋을 명확하고 의미 있는 그래프로 표현하기: 데이터 시각화 작업이다. 차원 축소 dimensionality reduction 기법을 많이 사용한다.
- 과거 구매 이력을 기반으로 고객이 관심을 가질 수 있는 상품 추천하기: 추천시스템이다. 과구 구매 이력을 인공 신경망에 주입하고 다음에 구매할 가능성이 가장 높은 상품을 출력하는 것이 한 가지 방법이다. 일반적으로 모든 고객의 구매이력을 기반으로 훈련한다.
- 지능형 게임 봇 만들기: 보통 강화 학습 reinforcement leanring으로 해결한다. 시간이 지나면 주어진 환경에서 보상이 최대가 되는 행동을 선택하는 에이전트를 훈련하는 머신러닝의 한 분야이다. (예를 들어 상대 플레이어 점수가 잃을 때마다 봇이 보상을 받을 수 있다) ex)알파고
이 목록이 전부는 아니지만 머신러닝이 다룰 수 있는 작업의 복잡도와 다양성을 물론 이런 작업에 사용할 수 있는 기술에 대한 감을 얻어기를 바란다.
1.4 머신러닝 시스템의 종류¶
머신러닝 시스템의 종류는 굉장히 많으므로 넓은 범주에서 분류하면 도움이 된다.
- 사람의 감독하에 훈련하는 것인지 그렇지 않은 것인지(지도, 비지도, 준지도, 강화학습)
- 실시간으로 점진적인 학습을 하는지 아닌지(온라인 학습과 배치 학습)
- 단순하게 알고 있는 데이터 포인트와 새 데이터 포인트를 비교하는 것인지 아니면 과학자들이 하는 것처럼 훈련 데이터셋에서 패턴을 발견하여 예측 모델을 만드는지(사례 기반 학습과 모델 기반 학습)
이 범주들은 서로 배타적이지 않으며 원하는 대로 연결할 수 있다. 예를 들어 최첨단 스팸필터가 심층 신경망 모델을 사용해 스팸과 스팸이 아닌 메일에서부터 실시간으로 학습할지도 모른다. 그렇다면 이 시스템은 온라인이고 모델 기반이며 지도학습 시스템이다.
이 범주들을 조금 더 자세히 들여다 보자.
1.4.1 지도 학습과 비지도 학습¶
머신러닝 시스템을 '학습하는 동안의 감독 형태나 정보량'에 따라 분류할 수 있다. 지도학습, 비지도 학습, 준지도 학습, 강화 학습 등 네 가지 주요 범주가 있다.
지도 학습¶
지도 학습 supervised learning에는 알고리즘에 주입하는 훈련 데이터에 레이블 lable 이라는 원하는 답이 포함된다. 분류 classification가 전형적인 지도 학습 작업이며, 스팸 필터가 좋은 예이다. 스팸 필터는 많은 메일 샘플과 소속 정보(스팸인지 아닌지)로 훈련되어야 하며 어떻게 새 메일을 분류할지 학습해야한다.
또 다른 전형적인 예측 변수 predictor variable라 부르는 특성 feature (주행거리, 연식, 브랜드 등)을 사용해 중고차 가격 같은 타깃 targit 수치를 예측하는 것이다. 이런 종류의 작업을 회귀 regression라고 부른다. 시스템을 훈련하려면 예측 변수와 레이블(중고차 가격)이 포함된 중고차 데이터가 많이 필요하다.
일부 회귀 알고리즘은 분류에 사용할 수도 있다. 반대로 일부 분류 알고리즘을 회귀에 사용할 수도 있다. 예를 들어 분류에 널리 쓰이는 로지스틱 회귀는 클래스에 속할 확률을 출력한다.(예를 들면 스팸일 가능성 20%)
다음은 가장 중요한 지도 학습 알고리즘들이다.
- k-최근접 이웃 k-nearest neightbors
- 선형 회귀 linear regression
- 로지스틱 회귀 logistic regression
- 서포트 벡터 머신 support vector machine(SVM)
- 결정 트리 decision tree 와 랜덤 포레스트 random forest
- 신경망 neural networks
비지도 학습¶
비지도 학습 unsupervised learning에는 말 그대로 훈련 데이터에 레이블이 없다. 시스템이 아무런 도움 없이 학습해야 한다.
다음은 가장 중요한 비지도 학습 알고리즘이다.
- 군집 clustering
- k-평균 k-means
- DBSCAN
- 계층 군집 분석 hierarchical cluster analysis (HCA)
- 이상치 탐지 outlier detection와 특이치 탐지 novelty detection
- 원-클래스 one-class SVM
- 아이솔레이션 포레스트 isolation detection
- 시각화 visualization 와 차원 축소 dimensionality reduction
- 주성분 분석 principal component analysis (PCA)
- 커널 kernel PCA
- 지역적 선형 임베딩 locally-linear embedding (LLE)
- t-SNE t-distributed stochastic neighbor embedding
- 연관 규칙 학습 association rule learnig
- 어프라이어리 Apriori
- 이클렛 Eclat
예를 들어 블로그 방문자에 대한 데이터가 많이 있다고 하자. 비슷한 방문자들을 그룹으로 묶기 위해 군집 알고리즘을 적용하려 한다. 하지만 방문자가 어떤 그룹에 속하는지 알고리즘에 알려줄 수 있는 데이터 포인트가 없다. 그래서 알고리즘이 스스로 방문자 사이의 연결고리를 찾는다. 예를 들어 40%의 방문자가 만화책을 좋아하며 저녁때 블로그 글을 읽는 남성이고, 20%는 주말에 방문하는 SF를 좋아하는 젊은 사람임을 알게 될지도 모른다. 계층 군집 hiearchical clustering 알고리즘을 사용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있다. 그러면 각 그룹에 맞춰 블로그에 글을 쓰는 데 도움이 될 것이다.
시각화 알고리즘도 비지도 학습 알고리즘의 좋은 예이다. 레이블이 없는 대규모의 고차원 데이터를 넣으면 도식화가 가능한 2D, 3D 표현을 만들어 준다. 이런 알고리즘은 가능한 구조를 그대로 유지하려 하므로(예를 들어 입력 공간에서 떨어져 있던 클러스터는 시각화된 그래프에서 겹치지지 않게 유지된다.)데이터가 어떻게 조직되어 있는지 이해할 수 있고 예상하지 못한 패턴을 발견할 수도 있다.
비슷한 작업으로는 너무 많은 정보를 잃지 않으면서 데이터를 간소화하려는 차원 축소가 있다. 이렇게 하는 한 가지 방법은 상관관계가 있는 여러 특성을 하나로 합치는 것이다. 예를 들어 차의 주행거리는 연식과 강하게 연관되어 있으므로 차원 축소 알고리즘으로 두 특성을 차의 마모 정도를 나타내는 하나의 특성으로 합칠 수 있다. 이를 특성 추출이라고 한다.
또 하나의 중요한 비지도 학습은 이상치 탐지이다. 예를 들어 부정 거래를 막기 위해 이상한 신용카드 거래를 감지하고, 제조 결함을 잡아내고, 학습 알고리즘에 주입하기 전에 데이터셋에서 이상한 값을 자동으로 제거하는 것 등이다. 시스템은 훈련하는 동안 대부분 정상 샘플을 만나 이를 인식하도록 훈련된다. 그다음 새로운 샘플을 보고 정상 데이터인지 혹은 이상치인지 판단한다. 매우 비슷한 작업으로 특이치 탐지가 있다. 훈련 세트에 있는 모든 샘플과 달라 보이는 새로운 샘플을 탐지하는 것이 목적이다. 알고리즘으로 감지하고 싶은 모든 샘플을 제거한 매우 '깨끗한' 훈련 세트가 필요하다. 예를 들어 강아지 사진 수천 장이 있고 그중에 1%가 치와와 사진이라면 특이치 탐지 알고리즘이 치와와 사진을 새로운 특이한 것으로 처리하지 못한다.
널리 사용되는 또 다른 비지도 학습은 대량의 데이터에서 특성 간의 흥미로운 관계를 찾는 연관 규칙 학습이다. 예를 들어 여러분이 슈퍼마켓을 운연한다고 가정하자. 판매 기록에 연관 규칙을 적용하면 바비큐 소스와 감자를 구매한 사람이 스테이크도 구매하는 경향이 있다는 것을 찾을지도 모른다. 아마 이 상품들을 서로 가까이 진열하고 싶을 것이다.
준지도 학습¶
데이터에 레이블을 다는 것은 일반적으로 시간과 비용이 많이 들기 때문에 레이블이 없은 샘플이 많고 레이블된 샘플은 적은 경우가 많다. 어떤 알고리즘은 일부만 레이블이 있는 데이터를 다룰 수 있다. 이를 준지도 학습이라고 한다.
구글 포토 호스팅 서비스가 좋은 예이다. 이 서비스에 가족사진을 모두 올리면 사람 A는 사진 1,5,11에 있고, 사진 B는 사진 2,5,7에 있다고 자동으로 인식한다. 이는 비지도 학습(군집)이다. 이제 시스템에 필요한 것은 이 사람들이 누구인가 하는 정보이다. 사람마다 레이블을 하나만 추가하면 사진에 있는 모든 사람의 이름을 알 수 있고, 편리하게 사진을 찾을 수 있다.
대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있다. 예를 들어 심층 신뢰 신경망DBN은 여러 겹으로 쌓은 제한된 볼츠만 머신RBM이라 불리는 비지도 학습에 기초한다. RBM이 비지도 학습 방식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조정된다.
강화 학습¶
강화학습은 매우 다른 종류의 알고리즘이다. 여기서는 학습하는 시스템을 에이전트라고 부르며 환경을 관찰해서 행동을 실행하고 그 결과로 보상 또는 벌점을 받는다. 시간이 지나면서 가장 큰 보상을 얻기 위해 정책이라고 부르는 최상의 전략을 스스로 학습한다. 정책은 주어진 상황에서 에이전트가 어떤 행동을 선택해야 할지 정의 한다.
예를 들어 보행 로봇을 만들기 위해 강화 학습 알고리즘을 많이 사용한다. 딥마인드의 알파고 프로그램도 강화 학습의 좋은 예이다. 알파고는 수백만 개의 게임을 분석해서 승리에 대한 전략을 학습했으며 자기 자신과 많은 게임을 했다. 알파고가 세계 챔피언과 게임할 때는 학습 기능을 끄고 그동안 학습했던 전략을 적용한 것이다.
1.4.2 배치 학습과 온라인 학습¶
머신러닝 시스템을 분류하는 데 사용하는 다른 기준은 입력 데이터의 스트림으로부터 점진적으로 학습할 수 있는지 여부이다.
배치 학습¶
배치학습에서는 시스템이 점진적으로 학습할 수 없다. 가용한 데이터를 모두 사용해 훈련시켜야 한다. 일반적으로 이 방식은 시간과 자원을 많이 소모하므로 보통 오프라인에서 수행된다. 먼저 시스템을 훈련시키고 그런 다음 제품 시스템에 적용하면 더 이상의 학습없이 실행된다. 즉, 학습한 것을 단지 적용만 한다. 이를 오프라인 학습이라고 한다.
배치 학습 시스템이(새로운 종류의 스팸 같은) 새로운 데이터에 대해 학습하려면 (새로운 데이터뿐만 아니라 이전 데이터도 포함한) 전체 데이터를 사용하여 시스템의 새로운 버전을 처음 부터 다시 훈련해야 한다. 그런 다음 이전 시스템을 중지시키고 새 시스템으로 교체한다.
다행히 머신러닝 시스템을 훈련, 평가,론칭하는 전체 과정이 쉽게 자동화될 수 있어서 배치 학습 시스템도 변화에 적응할 수 있다. 데이터를 업데이트하고 시스템의 새 버전을 필요한 만큼 자주 훈련시키면 된다.
이런 방식이 간단하고 잘 작동하지만 전체 데이터셋을 사용해 훈련하는 데 몇 시간이 소요될 수 있다. 보통 24시간마다 또는 매주 시스템을 훈련시킨다. 시스템이 빠르게 변하는 데이터에 적응해야 한다면(예를 들면 주식 가격) 더 능동적인 방법이 필요하다.
또한 전체 데이터셋을 사용해 훈련한다면 많은 컴퓨팅 자원이 필요하다. 대량의 데이터를 가지고 있는데 매일 처음부터 새로 훈련시키도록 시스템을 자동화 한다면 큰 비용이 발생할 것이다. 데이터 양이 아주 많으면 배치 학습 알고리즘을 사용하는게 불가능할 수도 있다.
마지막으로, 자원이 제한된 시스템(예를 들면 스마트폰 또는 화성 탐사 로버)이 스스로 학습해야 할 때 많은 양의 훈련 데이터를 나르고 학습을 위해 매일 몇 시간씩 많은 자원을 사용하면 심각한 문제를 일으킨다.
이런 경우에는 점진적으로 학습할 수 있는 알고리즘을 사용하는 편이 낫다.
온라인 학습¶
온라인 학습에서는 데이터를 순차적으로 한 개씩 또는 미니 배치라 부르는 작은 묶음 단위로 주입하여 시스템을 훈련시킨다. 매 학습 단계가 빠르고 비용이 적게 들어 시스템은 데이터가 도착하는 대로 즉시 학습할 수 있다.
온라인 학습은 연속적으로 데이터를 받고(예를 들면 주식가격) 빠른 변화에 스스로 적응해야 하는 시스템에 적합하다. 컴퓨팅 자원이 제한된 경우에도 좋은 선택이다. 온라인 학습 시스템이 새로운 데이터 샘플을 학습하면 학습이 끝난 데이터는 더는 필요하지 않으므로 버리면 된다. ( 이전 상태로 되돌릴 수 있도록 데이터를 재사용하기 위해 보관할 필요가 없다면).그러면 많은 공간을 절약할 수 있다.
컴퓨터 한 대의 메인 메모리에 들어갈 수 없는 아주 큰 데이터셋을 학습하는 시스템에도 온라인 학습 알고리즘을 사용할 수 있다.(이를 외부 메모리 학습이라고 한다.) 알고리즘이 데이터 일부를 읽어 들이고 훈련 단계를 수행한다. 전체 데이터가 모두 적용될 때까지 이 과정을 반복한다.
온라인 학습 시스템에서 중요한 파라미터 하나는 변화하는 데이터에 얼마나 빠르게 적응할 것인지 이다. 이를 학습률이라고 한다. 학습률을 높게 하면 시스템이 데이터에 빠르게 적응하지만 예전 데이터를 금방 잊어버릴 것이다. 반대로 학습률이 낮으면 시스템의 관성이 더 커져서 더 느리게 학습됩니다.하지만 새로운 데이터에 있는 잡음이나 대표성 없는 데이터 포인트에 덜 미감해진다.
온라인 학습에서 사장 큰 문제점은 시스템에 나쁜 데이터가 주입되었을 때 시스템 성능이 점진적으로 감소한다는 점이다. 운영 중인 시스템이라면 고객이 눈치 챌지 모른다. 예를 들어 로봇의 오작동 센서에서부터, 혹은 검색 엔진을 속여 검색 결과 상위에 노출시키려는 누군가로부터 나쁜 데이터가 올 수 있다. 이런 위험을 줄이려면 시스템을 면밀히 모니터링하고 성능 감소가 감지되면 즉각 학습을 중지시켜야 한다. (가능하면 이전 운영 상태로 되돌린다.) 입력 데이터를 모니터링해서 비정상 데이터를 잡아낼 수도 있다.(예를 들면 이상치 탐지 알고리즘을 사용해서)
1.4.3 사례 기반 학습과 모델 기반 학습¶
머신러닝 시스템은 어떻게 일반화되는가에 따라 분류할 수도 있다. 대부분의 머신러닝 작업은 예측을 만드는 것이다. 이 말은 주어진 훈련 데이터로 학습하고 훈련 데이터에서는 본 적 없는 새로운 데이터에서 좋은 예측을 만들어야 한다는 뜻이다. 훈련 데이터에서 높은 성능을 내는 것이 좋지만 그게 전부는 아니다. 진짜 목표는 새로운 샘프레 잘 작동하는 모델이다.
일반화를 위한 두 가지 접근법은 사례 기반 학습과 모델 기반 학습이다.
사례 기반 학습¶
아마도 가장 간단한 형태의 학습은 단순히 기억하는 것이다.스팸 필터를 이러한 방식으로 만들면 사용자가 스팸이라고 지정한 메일과 동일한 모든 메일을 스팸으로 분류한다. 최악의 방법은 아니지만 최선도 아니다.
스팸 메일과 동일한 메일을 스팸이라고 지정하는 대신 스팸 메일과 매우 유사한 메일을 구분하도록 스팸 필터를 프로그래밍할 수도 있다. 이렇게 하려면 두 메일 사이의 유사도를 측정해야 한다. 두 메일 사이의 매우 간단한 유사도 측정 방법은 공통으로 포함한 단어의 수를 세는 것이다. 스팸메일과 공통으로 가지고 있는 단어가 많으면 스팸으로 분류한다.
이를 사례 기반 학습 이라고 한다. 시스템이 훈련 샘프을 기억함으로써 학습한다. 그리고 유사도 측정을 사용해 새로운 데이터와 학습한 샘플을 비교하는 식으로 일반화 한다.
모델 기반 학습¶
샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측에 사용하는 것이다. 이를 모델 기반 학습이라고 한다.
이 함수는 OECD의 삶의 만족도(life satisfaction) 데이터와 IMF의 1인당 GDP(GDP per capita) 데이터를 합칩다.
예제 1-1) OECD 데이터에 없는 키프로스 사람들이 얼마나 행복한지 예측하기 (사이킷런을 이용한 선형 모델의 훈련과 실행)¶
def prepare_country_stats(oecd_bli, gdp_per_capita):
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")
gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
gdp_per_capita.set_index("Country", inplace=True)
full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,
left_index=True, right_index=True)
full_country_stats.sort_values(by="GDP per capita", inplace=True)
remove_indices = [0, 1, 6, 8, 33, 34, 35]
keep_indices = list(set(range(36)) - set(remove_indices))
return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]
import os
datapath = os.path.join("datasets", "lifesat", "")
# 주피터에 그래프를 깔끔하게 그리기 위해서
%matplotlib inline
import matplotlib as mpl
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
# 데이터 다운로드
import urllib.request
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/rickiepark/handson-ml2/master/"
os.makedirs(datapath, exist_ok=True)
for filename in ("oecd_bli_2015.csv", "gdp_per_capita.csv"):
print("Downloading", filename)
url = DOWNLOAD_ROOT + "datasets/lifesat/" + filename
urllib.request.urlretrieve(url, datapath + filename)
Downloading oecd_bli_2015.csv
Downloading gdp_per_capita.csv
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model
# 데이터 적재
oecd_bli = pd.read_csv(datapath +"oecd_bli_2015.csv", thousands= ',')
gdp_per_capita = pd.read_csv(datapath +"gdp_per_capita.csv",thousands=',',delimiter='\t',
encoding='latin1', na_values="n/a")
#데이터 준비
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# 데이터 시각화
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# 선형 모델 선택
model = sklearn.linear_model.LinearRegression()
model.fit(X, y)
LinearRegression()
# 키프로스에 대한 예측 만들기
X_new = [[22587]] # 키프로스 나라의 1인당 GDP
print(model.predict(X_new)) # 결과
[[5.96242338]]
# 3-최근접 이웃 회귀 모델로 바꿉니다.
import sklearn.neighbors
model1 = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)
model1.fit(X, y)
KNeighborsRegressor(n_neighbors=3)
# 키프로스에 대한 예측을 만듭니다.
print(model1.predict(X_new)) # 출력
[[5.76666667]]
모든 게 다 잘되면 모델은 좋은 예측을 내놓을 것이다. 아니면 더 많은 특성(고용률,건강,대기오염 등)을 사용하거나, 좋은 훈련 데이터를 더 많이 모으거나, 더 강력한 모델(예를 들면 다항 회귀 모델)을 선택해야 할지 모른다.
지금까지의 작업을 요약해 보겠다.
- 데이터를 분석한다.
- 모델을 선택한다.
- 훈련데이터로 모델을 훈련시킨다.(즉, 학습 알고리즘이 비용 함수를 최소화하는 모델 파라미터를 찾는다.)
- 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고(이를 추론이라고 한다.) 이 모델이 잘 일반화 되길 기대한다.
이것이 전형적이 머신러닝 프로젝트의 형태이다.
1.5 머신러닝의 주요 도전 과제¶
간단하게 말해 우리의 주요 작업은 학습알고리즘을 선택해서 어떤 데이터에 훈련시키는 것이므로 문제가 될 수 있는 두 가지는 '나쁜 알고리즘'과 '나쁜 데이터'이다. 이 절에서는 이 두 가지에 대해 알아보자.
1.5.1 충분하지 않은 양의 훈련 데이터¶
대부분의 머신러닝 알고리즘이 잘 작동하려면 데이터가 많아야 한다. 아주 간단한 문제에서조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제라면 수백만 개가 필요할지도 모른다.
1.5.2 대표성 없는 훈련 데이터¶
일반화가 잘되려면 우리가 일반화하기 원하는 새로운 사례를 훈련 데이터가 잘 대표하는 것이 중요하다. 이는 사례 기반 학습이나 모델 기반 학습 모두 마찬가지이다.
일반화하려는 사례들을 대표하는 훈련 세트를 사용하는 것이 매우 중요하지만, 이게 생각보다 어려울 때가 많다. 샘플이 작으면 샘플링 잡음sample noise(즉, 우연에 의한 대표성 없는 데이터)이 생기고, 매우 큰 샘플도 표본 추출 방법이 잘못되면 대표성을 띠지 못할 수 있다. 이를 샘플링 편향 sampling bisa 이라고 한다.
1.5.3 낮은 품질의 데이터¶
훈련 데이터가 에러, 이상치, 잡음(예를 들면 성능이 낮은 측정 장치 때문에)으로 가득하다면 머신러닝 시스템이 내재된 패턴을 찾기 어려워 잘 작동하지 않을 것이다. 그렇기 때문에 훈련 데이터 정제에 시간을 투자할 만한 가치는 충분하다. 사실 대부분의 데이터 과학자가 데이터 정제에 많은 시간을 쓰고 있다. 다음은 훈련 데이터 정제가 필요한 경우이다.
- 일부 샘플이 이상치라는 게 명확하면 간단히 그것들을 무시하거나 수동으로 잘못된 것을 고치는 것이 좋다.
- 일부 샘플에 특성 몇 개가 빠져있다면(예를 들면 고객 중 5%가 나이를 기록하지 않음), 이 특성을 모두 무시할지, 이 샘플을 무시할지, 빠진 값을 채울지(예를 들면 평균 나이로),또는 이 특성을 넣은 모델과 제외한 모델을 따로 훈련시킬 것인지 결정해야 한다.
1.5.4 관련 없는 특성¶
훈련 데이터에 관련 없는 특성이 적고 관련 있는 특성이 충분해야 시스템이 학습할 수 있을 것이다. 성공적인 머신러닝 프로젝트의 핵심 요소는 훈련에 사용할 좋은 특성들을 찾는 것이다. 이 과정을 특성 공학 이라 하며 다음과 같은 작업이다.
- 특성 선택 feature selection: 가지고 있는 특성 중에서 훈련에 가장 유용한 특성을 선택한다.
- 특성 추출 feature extration: 특성을 결합하여 더 유용한 특성을 만든다. 앞서 본 것처럼 차원 축소 알고리즘이 도움이 될 수 있다.
- 새로운 데이터를 수집해 새 특성을 만든다.
지금까지 나쁜 데이터의 사례를 살펴보았다. 이제 나쁜 알고리즘의 예를 살펴본다.
1.5.5 훈련 데이터 과대 적합¶
해외여행 중 택시운전사가 내 물건을 훔쳤다고 가정하자. 아마도 그 나라의 모든 택시운전사를 도둑이라고 생가할 수도 있다. 사람은 종종 과도하게 일반화를 하지만 주의하지 않으면 기게도 똑같은 함정에 빠질 수 있다. 머신러닝에서는 이를 과대적합 이라고 한다. 이는 모델이 훈련 데이터에 너무 잘 맞지만 일반성이 떨어진다는 뜻이다.
학습하는 동안 적용할 규제의 양은 하이퍼파라미터가 결정한다. 하이퍼파라미터는 학습 알고리즘의 파라미터이다. 그래서 학습 알고리즘으로부터 영향을 받지 않으며, 훈련 전에 미리 지정되고, 훈련하는 동안에는 상수로 남아 있다. 규제 하이퍼 파라미터를 매우 큰 값으로 지정하면 (기울기가 0에 가까운) 거의 평편한 모델을 얻게 된다. 그러면 학습 알고리즘이 훈련 데이터에 과대적합될 가능성을 거의 없겠지만 좋은 모델을 찾지 못한다. 머신러닝 시스템을 구축할 때 하이퍼파라미터 튜닝으 매우 중요한 과정이다.
1.5.6 훈련 데이터 과소 적합¶
과대적합의 반대이다. 이는 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못할 때 일어난다. 예를 들어 삶의 만족도에 대한 선형 모델은 과소적합되기 쉽다. 현실은 이 모델보다 더 복잡하므로 훈련 샘플에서조차도 부정확한 예측을 만들어낸다. 이 문제를 해결하는 주요 기법은 다음과 같다.
- 모델 파라미터가 더 많은 강력한 모델을 선택한다.
- 학습 알고리즘에 더 좋은 특성을 제공한다.(특성 공학)
- 모델의 제약을 줄인다.(예를 들면 규제 하이퍼파라미터를 감소시킨다.)
.1.5.7 한걸음 물러서서¶
- 머신러닝은 명시적인 규칙을 코딩하지 않고 기계가 데이터로부터 학습하여 어떤 작업을 더 잘하도록 만드는 것이다.
- 여러 종류의 머신러닝 시스템이 있다. 지도학습과 비지도학습, 배치 학습과 온라인 학습, 사례 기반 학습과 모델 기반 학습 등이다.
- 머신러닝 프로젝트에서는 훈련 세트에 데이터를 모아 학습 알고리즘에 주입한다. 학습 알고리즘이 모델 기반이면 훈련 세트에 모델을 맞추기 위해 모델 파라미터를 조정하고(즉, 훈련 세트에서 좋은 예측을 만들기 위해), 새로운 데이터에서도 좋은 예측을 만들 거라 기대한다. 알고리즘이 사례기반이면 샘플을 기억하는 것이 학습이고 유사도 측정을 사용하여 학습한 샘플과 새로운 샘플을 비교하는 식으로 새로운 샘플에 일반화 한다.
- 훈련 세트가 너무 작거나, 대표성이 없는 데이터거나, 잡음이 많고 관련없는 특성으로 오염되어 있다면 시스템이 잘 작동하지 않는다. 마지막으로 모델이 너무 단순하거나 너무 복잡하지 않아야 한다.
1.6 테스트와 검증¶
모델이 새로운 샘플에 얼마나 잘 알반화될지 아는 유일한 방법은 새로운 샘플에 실제로 적용해 보는 것이다. 이를 위해 실제 서비스에 모델을 넣고 잘 작동하는지 모니터링하는 방법이 있다. 이것은 좋은 방법은 아니다.
더 나은 방법은 훈련 데이터를 훈련세트와 테스트 세트 두 개로 나누는 것이다. 이름에서도 알 수 있듯이 훈련 세트를 사용해 모델을 훈련하고 테스트 세트를 사용해 모델을 테스트한다. 새로운 샘플에 대한 오류 비율을 일반화 오차라고하며, 테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값을 얻는다. 이 값은 이전에 본 적이 없는 새로운 샘플에 모델이 얼마나 잘 작동할지 알려준다.
훈련 오차가 낮지만(즉, 훈련세트에서 모델의 오차가적음) 일반화 오차가 높다면 이는 모델이 훈련 데이터에 과대적합되었다는 뜻이다.
- 보통 데이터의 80%를 훈련에 사용하고 20%는 테스트용으로 떼어놓는다. 하지만 이는 데이터셋 크기에따라 다르다.
1.6.1 하이퍼파라미터 튜닝과 모델 선택¶
모델 평가는 아주 간단하다. 그냥 테스트 세트를 사용하면 된다. 두 모델 중 어떤 것을 선택할지 갈등하고 있다고 해보자.둘 중에 하나를 어떻게 결정할 수 있을까? 두 모델 모두 훈련 세트로 훈련하고 테스트 세트를 사용해 얼마나 잘 일반화되는지 비교해보면된다.
일반화 오차를 테스트 세트에서 여러 번 측정했으므로 모델과 하이퍼파라미터가 테스트 세트에 최적화된 모델을 만들었기 때문이다. 이는 모델이 새로운 데이터에 잘 작동하지 않을 수 있다는 뜻이다.
이 문제에 대한 일반적인 해결 방법은 홀드아웃 검증이다. 간단하게 훈련 세트의 일부를 떼어내서 여러 후보 모델을 평가하고 가장 좋은 하나를 선택한다. 이 새로운 홀드 아웃 세트를 검증 세트라고 부른다. 구체적으로 말하면 줄어든 훈련 세트(즉, 전체 훈련 세트에서 검증 세트를 뺀 데이터)에서 다양한 하이퍼파라미터 값을 가진 여러 모델을 훈련한다. 그다음 검증 세트에서 가장 높은 성능을 내는 모델을 선택한다. 홀드아웃 검증 과정이 끝나면 이 최선의 모델을 전체 훈련 세트에서 다시 훈련하여 최종 모델을 만든다. 마지막으로 최종 모델을 테스트 세트에서 평가하여 일반화 오차를 추정한다.
이 방법은 일반적으로 잘 작동한다. 하지만 검증 세트가 너무 작으면 모델이 정확하게 평가 되지 않을 것이다. 최적이 아닌 모델을 잘못 선택할 수있다. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아진다. 이 문제를 해결하는 한 가지 방법은 작은 검증 세트를 여러 개를 사용해 반복적인 교차 검증을 수행하는 것이다. 검증 세트마다 나머지 데이터에서 훈련한 모델을 해당 검증 세트에서 평가한다. 모든 모델의 평가를 평균하면 훨씬 정확한 성능을 측정할 수 있다. 하지만 단점도 있다. 훈련 시간이 검증 세트의 개수에 비례해 늘어난다.
데이터 불일치¶
어떤 경우에는 쉽게 많은 양의 훈련 데이터 얻을 수 있지만 이 데이터가 실제 제품에 사용될 데이터를 완벽하게 대표하지 못할 수 있다. 예를 들어 꽃 사진을 찍어 꽃 이름을 자동으로 찾아주는 모바일 앱을 만든다고 가정해보자. 웹에서 수백만 개의 꽃 사진을 쉽게 다운로드할 수 있다. 하지만 모바일 앱을 사용해 실제로 찍을 사진을 완벽하게 대신하지는 못한다. 대신할 수 있는 사진이 10,000개만 있을 수 있다. 이 경우 가장 중요한 규칙은 검증 세트와 테스트 세트가 실전에서 기대하는 데이터를 가능한 한 잘 대표해야 한다는 것이다. 따라서 검증 세트와 테스트 세트에 대표 사진이 배타적으로 포함되어야 한다. 이 사진을 섞어서 반은 검증 세트에 반은 테스트 세트에 넣는다.(양쪽 세트에 중복되거나 비슷한 사진이 들어가지 않게 한다.) 하지만 웹에서 다운로드한 사진에 모델을 후련한 후에 검증 세트에서 모델의 성능을 측정하면 매우 실망할 것이다.
모델이 훈련세트에 과대적합되었기 때문인지 또는 웹 사진과 모바일 앱 사진의 데이터가 불일치하기 때문인지 알기 어렵다.훈련-개발 세트은 모델을 훈련한 다음 훈련-개발 세트에서 평가한다. 모델이 잘 작동하면 훈련 세트에 과대적합된 것이 아니다. 이 모델이 검증 세트에서 나쁜 성능을 낸다면 이 문제를 데이터 불일치에서 오는 것이다. 웹 이미지를 모바일 앱에서 찍은 사진처럼 보이도록 전처리한 다음 이 모델을 다시 훈련하여 이 문제를 해결할 수 있다. 반대로 모델이 훈련-개발 세트에서 잘 작동하지 않는다면 이는 훈련 세트에 과대적합된 것이다. 따라서 모델을 규제하거나 더 많은 훈련 데이터를 모으거나 훈련 데이터 정제를 시도해봐야 한다.