2.3.1 작업환경 만들기
2.3.2 데이터 다운로드
일반적으로 여러분이 다룰 데이터는 관계형 데이터베이스(또는 다른 데이터 저장소)에 들어 있고 여러 테이블, 문서, 파일로 나눠어 있을 것입니다. 이런 데이터에 접근하려면 먼저 보안 자격과 접근 권한이 있어야 하고 그 데이터의 구조를 잘 알고 있어야 합니다. 하지만 이 프로젝트는 간단합니다. 모든 데이터가 들어 있는 CSV(comma-separated value)파일인 housing.csv를 압축한 housing.tgz 파일을 내려받기만 하면 됩니다.
웹 브라우저를 사용해 이 파일을 내려받고 tar xzf housing.tgz 명령을 실행해서 압축을 풀어 CSV 파일을 얻을 수 있지만, 간단한 함수를 만들어 사용하면 더 편합니다. 특히 데이터가 정기적으로 변경되면 최근 데이터가 필요할 때마다 스크립트를 실행하면 되니 유용합니다(또는 스케줄링하여 주기적으로 자동 실행할 수도 있습니다). 데이터를 내려받는일을 자동화하면 여러 기기에 데이터셋을 설치해야 할 때도 편리합니다.
다음 코드가 데이터를 추출하는 함수입니다.
fetch_housing_data() 를 호출하면 작업공간에 datasets/housing 디렉터리를 만들고 housing.tgz 파일을 내려받고 같은 디렉터리에 압축을 풀어 housing.csv 파일을 만듭니다.
이제 판다스를 사용하여 데이터를 읽어 들이겠습니다. 데이터를 읽어 들이는 간단한함수도 하나 만듭니다.
이 함수는 모든 데이터를 담은 판다스의 데이터프레임 객체를 반환합니다.
2.3.3 데이터 구조 흝어보기
DataFrame의 head() 메서드를 사용해 처음 다섯 행을 확인해보겠습니다.
각 행은 하나의 구역을 나타냅니다. 특성은 longitude, latitude, housing_median_age, total_rooms, tatal_bedrooms, population, households, median_incom, median_house_value, ocean_proximity등 10개입니다.
info() 메서드는 데이터에 대한 간략한 설명과 특히 전체 행 수, 각 특성의 테이터 타입과 널null이 아닌 값의 갯수를 확인하는 데 유용합니다.
데이터셋에 20,640개의 샘플이 들어 있습니다. 머신러닝 프로젝트치고는 상당히 작은 편이지만, 처음 시작하기에는 적당한 크기입니다. total_bedrooms 특성은 20,433개만 널 값이 아닙니다. 207개의 구역은 이 특성을 가지고 있지 않다는 것을 뜻합니다. 나중에 이 문제를 적절히 처리하겠습니다.
ocean_proximity 필드만 빼고 모든 특성이 숫자형입니다. ocean_proximity 필드의 데이터 타입이 object이므로 어떤 파이썬 객체도 될 수 있지만, 데이터를 CSV파일에서 읽어 들였기 때문에 텍스트 특성일 것입니다. 처음 다섯 행을 출력했을 때 ocean_proximity 열의 값이 반복되는 것으로 보아서 이 특성은 아마도 범주형(categorical)일 것입니다. 어떤 카테고리가 있고 각 카테고리마다 얼마나 많은 구역이 있을지 value_counts()메서드로 확인합니다.
describe()메소드는 숫자형 특성의 요약 정보를 보여줍니다.
count, mean, min, max 행이 의미하는 바는 쉽게 할 수 있습니다. 널 값이 제외된 것을 볼 수 있습니다(예를 들어 tatal_bedrooms의 count는 20,640dl dkslrh 20,433입니다). std행은 값이 퍼져 있는 정도를 측정하는 표준편차를 나타냅니다. 25%, 50%, 75%행은 백분위수(percentile)를 나타냅니다. 백분위수는 전체 관측값에서 주어진 백분율이 속하는 하위 부분의 값을 나타냅니다. 예를 들어 25%의 구역은 housing)media)Age가 18보다 작고, 50%는 29보다 작고, 75%는 37보다 작습니다. 이를 25번째 백분위수(또는 제1사분위수), 중간값, 75번째 백분위수(또는 제 3사분위수)라고도 합니다.
데이터의 형태를 빠르게 검토하는 다른 방법은 각 숫자형 특성을 히스토그램으로 그려보는 것입니다. 히스토그램은 주어진 값의 범위(수평축)에 속한 샘플 수(수직축)를 나타냅니다. 특성마다 따로 히스토그램을 그릴 수도 있고 전체 데이터셋에 대해 hist()메소드를 호출하면 모든 숫자형 특성에 대한 히스토그램을 출력합니다. 얘를 들어 median_house)value가 약 $100,000인 구역은 800개가 조금 넘는 것을 볼 수 있습니다.
hist()메서드는 맷플로십을 사용하고 결국 화면에 그래프를 그리기 위해 사용자 컴퓨터의 그래픽 백엔드를 필요로 합니다. 그래서 그래프를 그리기 전에 맷를롯립이 사용할 백엔드를 지정해줘야 합니다. 주피터의 매직 명령 %matplotlib inline을 사용하면 편리합니다. 이 명령은 맷플롯립이 주피터 자체의 벡엔드를 사용하도록 설정합니다. 그러면 그래프는 노트븍 안에 그려지게 됩니다. 주피터 노트북에서 그래프를 그릴 때 show()메소드를 호출하는 것은 선택사항입니다. 주피터는 셀이 실행될 때 자동으로 그래프를 그려줍니다.
이 히스토그램에서 몇 가지 사항을 확인할 수 있습니다.
1. 먼저 중간 소득(median income)특성이 US달러로 표현되어 있지 않은 것 같습니다. 데이터를 취합한 팀에 확인해보니 스케일을 조정하고, 상한이 15(실제로는 15.0001), 하한이 0.5(실제로는 0.49999)가 되도록 만들었다고 합니다. 머신러닝에서는 전처리된 데이터를 다루는 경우가 흔하고 이것이 문제가 된지는 않지만 데이터가 어떻게 계산된 것인지 반드시 이해하고 있어야 합니다.
2. 중간 주택 연도(housing median age)와 중간 주택 가격(median house value)역시 최댓값과 최솟값을 한정햇습니다. 중간 주ㅐㄱ 가격의 경우는 타깃 속성(레이블)으로 사용되기 때문에심가한 문제가 될 수 있습니다. 가격이 한곗값을 넘어가지 않도록 머신러닝 알고리즘이 학습될지도 모릅니다. 이것이 문제가 될지 안될지는 클라이언트 팀(이 시스템의 출력을 사용할 팀)과 함께 검토하는 것이 좋습니다. 만약 그 팀에서 $500,000를 넘어가더라도 정확한 예측값이 필요하다고 한다면 우리가 선택할 수 있는 방법은 두가지입니다.
a. 한곗값 밖의 구역에 대한 정확한 레이블을 구합니다.
b. 훈련 세ㅡ에서 이런 구역을 제거합니다($500,000가 넘는 값에 대한 예측은 평가 결과가 매우 나쁠것이므로 테스트 세트에서도 제거합니다).
3. 특성들의 스케일이 서도 많이 다릅니다. 특성 스케일링에 대해서는 이 장의 뒷부분에서 살펴보겠습니다.
4. 마지막으로 많은 히스토그램의 꼬리가 두껍습니다. 가운데에서 왼쪽보다 오른쪽으로 더 멀리 뻗어 있습니다. 이런 형태는 일부 머신러닝 알고리즘에서 패턴을 찾기 어렵게 만듭니다. 나중에 이런 특성들을 좀 더 종 모양의 분포가 되도록 변형시키겠습니다.
이제 우리가 다룰 데이터를 많이 이해하게 되었습니다.
CAUTION_ 데이터를 더 갚게 들여다 보기 전에 테스트 세트를 따로 떠어놓아야 합니다. 그리고 테스트 세트를 절대 들여다보면 안 됩니다.
2.3.4 테스트 세트 만들기
이 단계에서 데이터 일부를 자진해서 떠어놓으라는 것이 이상하게 들리지 모르겟습니다. 지금 까지 데이터를 잠시 살펴봤을 뿐이고 어떤 알고리즘을 사용할지 정하기 전에 전체 데이터를 자세히 파악해야 하지 않을까요? 사실 맞습니다. 하지만 우리 뇌는 매우 과대적합되기 쉬운 엄청난 패턴 감지 시스템입니다. 막약 테스트 세트를 들여다본다면 테스트 세트에서 거으로 드러난 어떤 패턴ㅇ 속아 특정 머신러닝 모델을 선택하게 될지도 모릅니다. 이 테스트 세트로 일반화 오차를 추정하면 매우 낙관적인 추정이 되며 시스템을 론칭했을 때 기대한 성능이 나오지 않을 것입니다. 이를 테이터 스누핑(data snooping)편향이라고 합니다.
테스트 세트를 생성하는 일은 이론적으로 매우 간단합니다. 그냥 무작위로 어떤 샘플을 선택해서 데이터셋의 20%정도를 떼어놓으면 됩니다.
일반적인 해결책은 샘플의 식별자를 사용하여 테스트 세트로 보낼지 말지 정하는 것입니다(샘플이 고유하고 변경 불가능한 식별자를 가지고 있다고 가정합니다). 예를 들어 각 샘플마다 식별자의 해시값을 계산하여 해시의 마지막 바이트 값이 51(256의 20% 정도) 보다 작거나 같은 샘플만 테스트 세트로 보낼 수 있습니다. 이렇게 하면 여러 번 반복 실행되면서 데이터셋이 갱신되더라도 테스트 세트가 동일하게 유지됩니다. 새로운 테스트 세트는 새 샘플의 20%를 갖게 되지만 이전에 훈련 세트에 있던 샘플은 포함시키지 않을 것입니다.
행의 인텍스를 고유 식별자로 사용할 때 새 데이터는 데이터셋의 끝에 추가되어야 하고 어떤 행도 삭제되지 않아야 합니다. 이것이 불가능할 땐 고유 식별자를 만드는데 안전한 특성을 사용해야 합니다. 예를 들어 구역의 위도와 경도는 몇백 년 후까지 안정적이라고 보장할 수 있으므로 두 값을 연결하여 다음과 같이 ID를 만들수 있습니다.
사이킷런은 데이터셋을 여러 서브셋으로 나누는 다양항 방법을 제공합니다. 가장 간단한 함수는 train_test_split으로, 앞서 우리가 만든 split_train_test와 아주 비슷하지만 두 가지 특징이 더 있습니다. 첫째 앞서 설명한 난수 초긱값을 지젖ㅇ할 수 있는 random_state 매개변수가 있고, 둘째 행의 개수가 같은 여러 개의 데이터셋을 넘겨서 같은 인덱스를 기반으로 나눈 수 있습니다(이느 예를 들어 데이터프레임이 레이블에 따라 여러 개로 나눠어 있을 때 매우 유용합니다).
지금까지는 순수한 무작위 샘플링 방식을 보았습니다. 데이터셋이 충분히 크다면 (특히 특성 수에비해)일반적으로 괜찮지만, 그렇지 않다면 샘플링 편향이 생길 가능성이 큽니다. 설문 조사 기관에서 1,000명에게 질문 몇 개를 하려 할때 그냥 전화번호부에서 1,000명을 무작위로 뽑는 것은 아닙니다. 전체 인구를 대표할 수 있는 10,000명을 선택하기 위해 노력합니다. 미국 인구의 51.3%가 여성이고 48.7%가 남성이라면, 잘 구성된 설문조사는 샘플에서도 이 비율을 유지해야 합니다. 즉, 여성은 513명, 남성은 487명이어야 합니다. 이를 계층적 샘플링(stratified sampling)이라고 합니다. 전체 모수 계층(strata)이라는 동질의 그룹으로 나뉘고, 테스트 세트가 전체 모수를 대표하도록 각 계층에서 올바른 수의 샘플을 추출합니다. 기본 무작위 샘플링을 사용하면 49%보다 적거나 54%보다 많은 여성이 테스트 세트에 들어갈 확률이 약 12%입니다. 어느 방법을 사용하든 설문 조사 결과를 크게 편향시키게됩니다.
전문가가 중간 소득이 중간 주택 가격을 예측하는 데 매우 중요하다고 이야기해주었다고 가정합시다. 이 경우 테스트 세트가 전체 데이터셋에 있는 여러 소득 카테고리를 잘 대표해야합니다. 중간 소득이 연속적인 숫자형 특성이므로 소득에 대한 카테고리 특성을 만들어야 합니다. 중간 소득의 히스토그램을 조금 더 자세히 살펴보겠습니다([그림 2-8] 참조). 중간 소득 대분분은 $20,000~$50,000 사이에 모여 있지만 일부는 $60,000를 넘기도 합니다. 계층별로 데이터셋에 충분한 샘플 수가 있어야 합니다. 그렇지 않으면 계층의 중요도를 추정하는 데 편향이 발생할 것입니다. 이 말은 너무 많은 계층으로 나누면 안 된다는 뜻이고 각 계층이 충분히 커야 합니다. 다음 코드는 중간 소득을 1.5로 나누고(소득의 카테고리 수를 제한하기 위해), ceil함수를 사용하여 반올림해서 소득 카테고리를 특성을 만들고(이산적인 카테고리를 만들기 위해), 5보다 큰 카테고리는 5로 합니다.
2018년 7월 20일 금요일
2018년 7월 17일 화요일
2.2 큰 그림 보기
머신러닝 주택 회사에 오신 것을 환영합니다! 해야 할 일은 캘리포니아 인구조사 데이터를 사용해 캘리포니아의 주택 가격 모델을 만드는 것입니다. 이 데이터는 캘리포니아의 블록 그룹block group마다 인구population, 중간 소득median income, 중간 주택 가격median housing price 등을 담고 있습니다. 블록 그룹은 미국 인구조사국에서 샘플 데이터를 발표하는데 사용하는 최소한의 지리적 단위입니다(하나의 블록 그룹은 보통 600~3,000명의 인구를 나타냅니다). 여기서는 간단하게 구역이라고 부르겠습니다.
이 데이터 모델을 학습시켜서 다른 측정 데이터가 주어졌을 때 구역의 중간 주책 가격을 예측해야 합니다.
TIP 여러분은 잘 훈련된 데이터 과학자이므로 첫 번째로 할 일은 머신러닝 프로젝트 체크리스트를 준비하는 것입니다. 부록 B에 준비한 것을 사용해도 됩니다. 대부분의 머신러닝 프로젝트에 잘 드어맞지만 필요에 따라 수정하는 것이 좋습니다. 이 장에서는 체크리스트에 있는 많은 항목을 다루겠지만 스스로 충분히 이해할 수 있는 항목이나 다음 장에서 논의할 항목은 건너뛰겠습니다.
2.2.1 문제 정의
상사에게 첫 버째로 할 질문은 '비즈니스의 목적이 정확히 무엇인가요? 입니다. 아마도 모델 만들기가 최종 목적은 아닐 것입니다. 회사에서는 이 모델을 어떻게 사용해 이익을 얻으려고 할까요? 이는 문제를 어떻게 구성할지, 어떤 알고리즘을 선택할지, 모델 평가에 어떤 성능 지표를 사용할지, 모델 튜닝을 위해 얼마나 노력을 투여할지 결정하기 때문에 아주 중요한 질문입니다.
상사가 이 모델의 출력(구역의 중간 주택 가격에 대한 예측)이 여러 가지 다른 신호SIGNAL와 함께 다른 머신러닝 시스템에 입력으로 사용된다고 이야기합니다. 뒤따르는 시스템이 해당 지역에 투자할 가치가 있는지 결정합니다. 이 결정이 수익에 직결되기 때문에 올바르게 예측하는 것은 매우 중요합니다.
파이프라인
데이터 처리 컴포넌트component들이 연속되어 있는 것을 데이터 파이프라인pipeline이라고 합니다.
머신러닝 시스템은 데이터를 조작하고 변환할 일이 암ㅎ아 파이프라인을 사용하는 일이 매우 흔합니다.
보통 컴포넌트들은 비동기적으로 동작합니다. 각 컴포넌트는 많은 데이터를 추출해 처리하고 그 결과를 다른 데이터 저장소로 보냅니다. 그러면 일정 시간 후 파이프라인의 다음 컴포넌트가 그 데이터를 추출해 자신의 출력결과를 만드는 식입니다. 각 컴포넌트는 완전히 독립적입니다. 즉, 컴포ㅓㄴ트 사이의 인터페이스는 데이터 저장소뿐입니다. 이는 (데이터 흐름도 덕분에) 시스템을 이해하기 쉽게 만들고,각 팀은 각자의 컴포넌트에 집중할 수 있습니다. 한 컴포넌트가 다운되더라도 하위 컴포넌트는 문제가 생긴 컴포넌트의 마지막 출력을 사용해 (적어도 한동안은) 평상시와 같이 계속 동작할 수 있습니다. 그래서 시스템이 매우 견고해집니다.
한편 모니터일이 적절히 되지 않으면 고장난 컴포넌트를 한동안 모를 수 있습니다. 데이터가 만들어진지 오래 되면 전체시스템의 성능이 떨어집니다.
다음으로 던질 질문은 '현재 솔루션은 어떻게 구성되어 있나요? 입니다(만약 있다면). 이는 문제 해결 방법에 대한 정보는 물론이고 참고 성능으로도 사용할 수 있습니다. 상사가 현재는 구역 주택 가격을 전문가가 수동으로 추정한다고 알려주었습니다. 한 팀이 구역에 관한 최신 정보를 모으고 있는데 중간 주책 가격을 얻을 수 없을 때는 복잡한 규칙을 사용하여 추정을 합니다. 이는 비용과 시간이 많이 들고 추정 결과도 썩 좋지 않습니다. 실제 중간 주택 가격을 구해보면 팀에서 추정한 것이 10%이상 벗어났음을 알게 될 때가 많습니다. 이런 이유로 회사는 구역의 데이터를 기반으로 중간 주택 가격을 예측하는 모델을 훈련시키는 쪽이 유용하다고 생각합니다. 인구 조사 데이터에는 다른 데이터는 물론 수천 개 구역의 중간 주택 가격을 포함하므로 이 작업에 매우 적합한 데이터세으로 보입니다.
좋습니다. 이제 이런 정보들을 가지고 시스템을 설계할 준비가 되었습니다. 먼저 문제를 정의해야 합니다. 이는 지도 학습, 비지도 학습, 강화 학습 중 무엇일까요? 분류나 회귀인가요 아니면 다른 어떤 작업인가요? 배치 학습과 온라인 학습중 어느 것을 사용해야 하나요? 이 책을 계속 읽어 나가기 전에 잠시 멈추고 이 질문들의 답을 찾아보세요.
답을 찾았나요? 같이 한번 보겠습니다. 레이블된 훈련 샘플이 있으니(각 샘플이 개대 출력값, 즉 구역의 중간 주택 가격을 가지고 있습니다) 이는 전형적인 지도 학습 작업입니다. 또한 값을 예측해야 하므로 전형적인 회귀 문제입니다. 좀 더 구체적으로는 예측에 사용할 특성이 여러 개(구역의 인구, 중간 소득 등)이므로 다변량 회귀multivariate regression 문제입니다. 1 장에서는 1인당 GDP 하나의 특성을 기반으로 삶의 만족도를 예측했으므로 단변량 회귀univariate regression 문제 였습니다. 마지막으로 이 시스템으로 들어오는 데이터에 연속적인 흐름이 없으므로 빠르게 변하는 데이터에 적응하지 않아도 되고, 데이터가 메모리에 들어갈 만큼 충분히 작으므로 일반겅니 배치 학습이 적절합니다.
TIP 데이터가 매우 크면(맵리듀스MapReduce 기술을 사용하여) 배치 학습을 여러 서버로 분할하거나, 대신 오라인 학습기법을 사용할 수 있습니다.
2.2.2 성능 측정 지표 선택
다음 단계는 성능 측정 지표를 선택하는 것입니다. 회귀 문제의 전형적인 성능 지표는 평균 제곱근 오차Root Mean Square Error(RMSE)입니다. 오차가 커질수록 이 값은 더욱 커지므로 예측에 얼마나 많은 오류가 있는지 가늠하게 해줍니다. [식2-1]이 RMSE를 계산하는 공식입니다.
표기법
[식2-1]에서 이 책 전체에 걸쳐 사용할 대표적인 머신러닝 분야의 표기법 몇 가지를 볼 수 있습니다.
- m 은 RMSE를 측정할 데이터셋에 있는 샘플 수입니다.
예를 들어 2,000개 구역의 검증 세트에 대해 RMSE를 평가한다면 m = 2,000입니다.
- x(i)는 데이터셋에 있는 i번째 샘플(레이블은 제외한)의 저체 특성값의 벡터이고, y(i)는 해당 레이블(해당 샘플의 기대출력값)입니다.
예를 들어 데이터셋에 있는 첫 번째 구역의 경도 -118.29도, 위도 33.91도에 위치하고, 중간 소득이 $38,372이며, 주민이 1,416명, 중간 주택 가격이 $156,400라면 x(i)과 y(i)은 다음과 같습니다(여기서 다른 특성은 고려하지 않았습니다).
- 118.29
33.91
x(i) = 1,416
38,372
y(i) = 156,400
- X는 데이터셋에 있는 모든 샘플의 모든 특성값(레이블은 제외)을 포함하는 행렬입니다. 샘플 하나가 하나의 행이어서 i번째 행은 x(i)의 전치와 같고 (x(i))T으로 표기합니다.
예를 들어 첫번째 구역이 앞의 예와 같다면 행렬 X는 다음과 같습니다.
(x(1))T
(x(2))T
: - 119.29 33.91 1,416 38,372
X = : = : : : :
(x(1999))T : : : :
(x(2000))T
- h는 시스템의 예측 함수며 가설hypothesis이라고 합니다. 시스템이 하나의 샘플 특성 벡터X(i)를 받으면 그 샘플에 대한 예측값 y(i) = h(x(i))를 출력합니다(y은 y-햇이라고 읽습니다).
예를 들어 시스템이 첫 번째 구역의 중간 주택 가격을 $158,400이라고 예측한다면 y(i) = h(x(i)) = 158,400입니다. 이 구역에 대한 예측 오차는 y(i) = y(1) = 2,000입니다.
- RMSE(X,h)는 가설 h를 사용하여 일련의 샘플을 평가하는 비용 함수입니다.
스칼라 값이나 함수를 나타낼 때는 m이나 y(i)또는 h와 같이 이탤릭체 소문자, 벡터를 나타낼 때는 x(i)와 같이 굵은 소문자, 행렬을 나타낼 때는 X와 같이 굵은 대문자를 사용하겠습니다.
RMSE가 일반적으로 회귀 문제에 선호되는 성능 측정 방법이지만 경우에 따라 다른 함수를 사용할 수도 있습니다. 예를 들어 이상치로 보이는 구역이 많다고 가정합시다. 이런 경우에는 평균 절대 오차Mean Absolute Error(평균 절대 편차Mean Absolute Deviation라고도 합니다)를 고려해볼수 있습니다. [식2-2]를 참조하세요
RME와 MAE 모두 예측값의 벡터와 타깃값의 벡터 사이의 거리를 재는 방법입니다. 거리 측정에는 여러 가지 방법(또는 노름nom)이 가능합니다.
- 제곱항을 합한 것의 접곱근(RMSE) 계산은 유크리디안 노름Euclidan nom에 해당합니다. 우리와 친숙한 거리 개념입니다. 또는 l2 노름이라고 부르며 ||.||2 (또는 그냥 ||.||)로 표시합니다.
- 절댓값의 합을 계산하는 것은 l1노름에 해당하며 ||.||1로 표기합니다. 이는 도시의 구획이 직각으로 나눠어 있을때 이 도시의 두 지점 사이의 거리를 측정하는 것과 같아 맨해튼 노름Manhattan nom이라고 합니다.
- 일반적으로 원소 n개인 벡터v의 lk 노름은 ||v||k = (|v0|k + |v1|k + ..... + |vn|k)1/k 으로 정의합니다. l0은 단순히 벡터에 있는 0이 아닌 원소의 수이고, l무한대 는 벡터에서 가장 큰 절댓값이 됩니다.
- 노름의 지수가 클수록 큰 값의 원소에 치우치며 작은 값은 무시됩니다. 그래서 RMSE가 MAE보다 조금 더 이상치에 민감합니다. 하지만 (종 모양 분포의 양 끝단처럼) 이상치가 매우 드물면 RMSE가 잘 맞아 일반적으로 널리 사용됩니다.
2.2.3 가정 검사
마지막으로 (여러분과 동료들이) 지금까지 만든 가정을 나열하고 검사해보는 것이 좋습니다. 이 과정에서 심각한 문제를 일찍 발견할 수도 있습니다. 예를 들어 시스템이 출력한 구역의 가격이 다음 머신러닝 시스템의 입력으로 들어가게 되는데 이 값이 있는 그대로 사용될 거라 가정했습니다. 하지만 하위 시스템에서 이 값을('저렴', '보통', '고가' 같은) 캍고리고 바꾸고 가격 대신 카테고리를 사용하면 어떻게 될까요? 이럴 때는 정확한 가격을 구하는 것이 전혀 중요하지 않습니다. 올바른 카테고리를 구하는 시스템이 필요합니다. 그렇다면 이제 이 문제는 회귀가 아니라 분류 작업이 됩니다. 몇 달 동안 회귀 시스템을 구축하고 나서야 이런 사실을 깨닫게 되는 것을 아무도 원치 않을 것입니다.
다행이도 하위 시스템을 담당하는 팀과 대화 후 그들이 카테고리가 아니라 실제 가격을 사용한다는 것을 확인했습니다. 훌륭합니다! 모든 것이 준비되었고 출발선에 섰습니다. 이제 코딩을 시작할 수 있습니다.
이 데이터 모델을 학습시켜서 다른 측정 데이터가 주어졌을 때 구역의 중간 주책 가격을 예측해야 합니다.
TIP 여러분은 잘 훈련된 데이터 과학자이므로 첫 번째로 할 일은 머신러닝 프로젝트 체크리스트를 준비하는 것입니다. 부록 B에 준비한 것을 사용해도 됩니다. 대부분의 머신러닝 프로젝트에 잘 드어맞지만 필요에 따라 수정하는 것이 좋습니다. 이 장에서는 체크리스트에 있는 많은 항목을 다루겠지만 스스로 충분히 이해할 수 있는 항목이나 다음 장에서 논의할 항목은 건너뛰겠습니다.
2.2.1 문제 정의
상사에게 첫 버째로 할 질문은 '비즈니스의 목적이 정확히 무엇인가요? 입니다. 아마도 모델 만들기가 최종 목적은 아닐 것입니다. 회사에서는 이 모델을 어떻게 사용해 이익을 얻으려고 할까요? 이는 문제를 어떻게 구성할지, 어떤 알고리즘을 선택할지, 모델 평가에 어떤 성능 지표를 사용할지, 모델 튜닝을 위해 얼마나 노력을 투여할지 결정하기 때문에 아주 중요한 질문입니다.
상사가 이 모델의 출력(구역의 중간 주택 가격에 대한 예측)이 여러 가지 다른 신호SIGNAL와 함께 다른 머신러닝 시스템에 입력으로 사용된다고 이야기합니다. 뒤따르는 시스템이 해당 지역에 투자할 가치가 있는지 결정합니다. 이 결정이 수익에 직결되기 때문에 올바르게 예측하는 것은 매우 중요합니다.
파이프라인
데이터 처리 컴포넌트component들이 연속되어 있는 것을 데이터 파이프라인pipeline이라고 합니다.
머신러닝 시스템은 데이터를 조작하고 변환할 일이 암ㅎ아 파이프라인을 사용하는 일이 매우 흔합니다.
보통 컴포넌트들은 비동기적으로 동작합니다. 각 컴포넌트는 많은 데이터를 추출해 처리하고 그 결과를 다른 데이터 저장소로 보냅니다. 그러면 일정 시간 후 파이프라인의 다음 컴포넌트가 그 데이터를 추출해 자신의 출력결과를 만드는 식입니다. 각 컴포넌트는 완전히 독립적입니다. 즉, 컴포ㅓㄴ트 사이의 인터페이스는 데이터 저장소뿐입니다. 이는 (데이터 흐름도 덕분에) 시스템을 이해하기 쉽게 만들고,각 팀은 각자의 컴포넌트에 집중할 수 있습니다. 한 컴포넌트가 다운되더라도 하위 컴포넌트는 문제가 생긴 컴포넌트의 마지막 출력을 사용해 (적어도 한동안은) 평상시와 같이 계속 동작할 수 있습니다. 그래서 시스템이 매우 견고해집니다.
한편 모니터일이 적절히 되지 않으면 고장난 컴포넌트를 한동안 모를 수 있습니다. 데이터가 만들어진지 오래 되면 전체시스템의 성능이 떨어집니다.
다음으로 던질 질문은 '현재 솔루션은 어떻게 구성되어 있나요? 입니다(만약 있다면). 이는 문제 해결 방법에 대한 정보는 물론이고 참고 성능으로도 사용할 수 있습니다. 상사가 현재는 구역 주택 가격을 전문가가 수동으로 추정한다고 알려주었습니다. 한 팀이 구역에 관한 최신 정보를 모으고 있는데 중간 주책 가격을 얻을 수 없을 때는 복잡한 규칙을 사용하여 추정을 합니다. 이는 비용과 시간이 많이 들고 추정 결과도 썩 좋지 않습니다. 실제 중간 주택 가격을 구해보면 팀에서 추정한 것이 10%이상 벗어났음을 알게 될 때가 많습니다. 이런 이유로 회사는 구역의 데이터를 기반으로 중간 주택 가격을 예측하는 모델을 훈련시키는 쪽이 유용하다고 생각합니다. 인구 조사 데이터에는 다른 데이터는 물론 수천 개 구역의 중간 주택 가격을 포함하므로 이 작업에 매우 적합한 데이터세으로 보입니다.
좋습니다. 이제 이런 정보들을 가지고 시스템을 설계할 준비가 되었습니다. 먼저 문제를 정의해야 합니다. 이는 지도 학습, 비지도 학습, 강화 학습 중 무엇일까요? 분류나 회귀인가요 아니면 다른 어떤 작업인가요? 배치 학습과 온라인 학습중 어느 것을 사용해야 하나요? 이 책을 계속 읽어 나가기 전에 잠시 멈추고 이 질문들의 답을 찾아보세요.
답을 찾았나요? 같이 한번 보겠습니다. 레이블된 훈련 샘플이 있으니(각 샘플이 개대 출력값, 즉 구역의 중간 주택 가격을 가지고 있습니다) 이는 전형적인 지도 학습 작업입니다. 또한 값을 예측해야 하므로 전형적인 회귀 문제입니다. 좀 더 구체적으로는 예측에 사용할 특성이 여러 개(구역의 인구, 중간 소득 등)이므로 다변량 회귀multivariate regression 문제입니다. 1 장에서는 1인당 GDP 하나의 특성을 기반으로 삶의 만족도를 예측했으므로 단변량 회귀univariate regression 문제 였습니다. 마지막으로 이 시스템으로 들어오는 데이터에 연속적인 흐름이 없으므로 빠르게 변하는 데이터에 적응하지 않아도 되고, 데이터가 메모리에 들어갈 만큼 충분히 작으므로 일반겅니 배치 학습이 적절합니다.
TIP 데이터가 매우 크면(맵리듀스MapReduce 기술을 사용하여) 배치 학습을 여러 서버로 분할하거나, 대신 오라인 학습기법을 사용할 수 있습니다.
2.2.2 성능 측정 지표 선택
다음 단계는 성능 측정 지표를 선택하는 것입니다. 회귀 문제의 전형적인 성능 지표는 평균 제곱근 오차Root Mean Square Error(RMSE)입니다. 오차가 커질수록 이 값은 더욱 커지므로 예측에 얼마나 많은 오류가 있는지 가늠하게 해줍니다. [식2-1]이 RMSE를 계산하는 공식입니다.
표기법
[식2-1]에서 이 책 전체에 걸쳐 사용할 대표적인 머신러닝 분야의 표기법 몇 가지를 볼 수 있습니다.
- m 은 RMSE를 측정할 데이터셋에 있는 샘플 수입니다.
예를 들어 2,000개 구역의 검증 세트에 대해 RMSE를 평가한다면 m = 2,000입니다.
- x(i)는 데이터셋에 있는 i번째 샘플(레이블은 제외한)의 저체 특성값의 벡터이고, y(i)는 해당 레이블(해당 샘플의 기대출력값)입니다.
예를 들어 데이터셋에 있는 첫 번째 구역의 경도 -118.29도, 위도 33.91도에 위치하고, 중간 소득이 $38,372이며, 주민이 1,416명, 중간 주택 가격이 $156,400라면 x(i)과 y(i)은 다음과 같습니다(여기서 다른 특성은 고려하지 않았습니다).
- 118.29
33.91
x(i) = 1,416
38,372
y(i) = 156,400
- X는 데이터셋에 있는 모든 샘플의 모든 특성값(레이블은 제외)을 포함하는 행렬입니다. 샘플 하나가 하나의 행이어서 i번째 행은 x(i)의 전치와 같고 (x(i))T으로 표기합니다.
예를 들어 첫번째 구역이 앞의 예와 같다면 행렬 X는 다음과 같습니다.
(x(1))T
(x(2))T
: - 119.29 33.91 1,416 38,372
X = : = : : : :
(x(1999))T : : : :
(x(2000))T
- h는 시스템의 예측 함수며 가설hypothesis이라고 합니다. 시스템이 하나의 샘플 특성 벡터X(i)를 받으면 그 샘플에 대한 예측값 y(i) = h(x(i))를 출력합니다(y은 y-햇이라고 읽습니다).
예를 들어 시스템이 첫 번째 구역의 중간 주택 가격을 $158,400이라고 예측한다면 y(i) = h(x(i)) = 158,400입니다. 이 구역에 대한 예측 오차는 y(i) = y(1) = 2,000입니다.
- RMSE(X,h)는 가설 h를 사용하여 일련의 샘플을 평가하는 비용 함수입니다.
스칼라 값이나 함수를 나타낼 때는 m이나 y(i)또는 h와 같이 이탤릭체 소문자, 벡터를 나타낼 때는 x(i)와 같이 굵은 소문자, 행렬을 나타낼 때는 X와 같이 굵은 대문자를 사용하겠습니다.
RMSE가 일반적으로 회귀 문제에 선호되는 성능 측정 방법이지만 경우에 따라 다른 함수를 사용할 수도 있습니다. 예를 들어 이상치로 보이는 구역이 많다고 가정합시다. 이런 경우에는 평균 절대 오차Mean Absolute Error(평균 절대 편차Mean Absolute Deviation라고도 합니다)를 고려해볼수 있습니다. [식2-2]를 참조하세요
RME와 MAE 모두 예측값의 벡터와 타깃값의 벡터 사이의 거리를 재는 방법입니다. 거리 측정에는 여러 가지 방법(또는 노름nom)이 가능합니다.
- 제곱항을 합한 것의 접곱근(RMSE) 계산은 유크리디안 노름Euclidan nom에 해당합니다. 우리와 친숙한 거리 개념입니다. 또는 l2 노름이라고 부르며 ||.||2 (또는 그냥 ||.||)로 표시합니다.
- 절댓값의 합을 계산하는 것은 l1노름에 해당하며 ||.||1로 표기합니다. 이는 도시의 구획이 직각으로 나눠어 있을때 이 도시의 두 지점 사이의 거리를 측정하는 것과 같아 맨해튼 노름Manhattan nom이라고 합니다.
- 일반적으로 원소 n개인 벡터v의 lk 노름은 ||v||k = (|v0|k + |v1|k + ..... + |vn|k)1/k 으로 정의합니다. l0은 단순히 벡터에 있는 0이 아닌 원소의 수이고, l무한대 는 벡터에서 가장 큰 절댓값이 됩니다.
- 노름의 지수가 클수록 큰 값의 원소에 치우치며 작은 값은 무시됩니다. 그래서 RMSE가 MAE보다 조금 더 이상치에 민감합니다. 하지만 (종 모양 분포의 양 끝단처럼) 이상치가 매우 드물면 RMSE가 잘 맞아 일반적으로 널리 사용됩니다.
2.2.3 가정 검사
마지막으로 (여러분과 동료들이) 지금까지 만든 가정을 나열하고 검사해보는 것이 좋습니다. 이 과정에서 심각한 문제를 일찍 발견할 수도 있습니다. 예를 들어 시스템이 출력한 구역의 가격이 다음 머신러닝 시스템의 입력으로 들어가게 되는데 이 값이 있는 그대로 사용될 거라 가정했습니다. 하지만 하위 시스템에서 이 값을('저렴', '보통', '고가' 같은) 캍고리고 바꾸고 가격 대신 카테고리를 사용하면 어떻게 될까요? 이럴 때는 정확한 가격을 구하는 것이 전혀 중요하지 않습니다. 올바른 카테고리를 구하는 시스템이 필요합니다. 그렇다면 이제 이 문제는 회귀가 아니라 분류 작업이 됩니다. 몇 달 동안 회귀 시스템을 구축하고 나서야 이런 사실을 깨닫게 되는 것을 아무도 원치 않을 것입니다.
다행이도 하위 시스템을 담당하는 팀과 대화 후 그들이 카테고리가 아니라 실제 가격을 사용한다는 것을 확인했습니다. 훌륭합니다! 모든 것이 준비되었고 출발선에 섰습니다. 이제 코딩을 시작할 수 있습니다.
2018년 7월 10일 화요일
2.1 실제 데이터로 작업하기
머신러닝을 배울 때는 인공적으로 만들어진 데이터셋이 아닌 셀제 데이터로 실험해보는 것이 가장 좋습니다. 다행이 여러 분야에 걸쳐 공개된 데이터셋이 아주 많습니다. 다음 데이터를 구하기 좋은 곳입니다.
- 유명한 공개 데이터 저장소
- UC 얼바인Irnine 머신러닝 저장소(http://archive.ics.uci.edu/ml/)
- 캐글Kaggle 데이터셋(http://kaggle.com/datasets)
- 아마존AWS데이터셋(http://aws.amazon.com/datasets)
- 메타 포털(공개 데이터 저장소가 나열되어 있습니다)
- http://dataportals.org/
- http://opendatamonitor.eu/
- http://quandl.com
- 인기 있는 공개 데이터 저장소가 나열되어 있는 다른 페이지
- 위키백과 머신러닝 데이터셋 목록(https://goo.gl/SJHN2K)
- Quora.com 질문(http://goo.gl/zDR78y)
- 데이터셋 서브레딧subreddit(http://www.reddit.com/r/datasets)
이 장에서는 StatLib 저장소에 있는 캘리포니아 주택 가격Califormia Housing Prices 데이터셋을 사용합니다. 이 데이터셋은 1990년 캘리포니아 인구조사 데이터를 기반으로 합니다. 최근 데이터는 아니지만 학습용으로 아주 좋기 때문에 최근데이터라고 생각하겠습니다. 교육목적으로 사용하기 위해 범주형 특성을 추가하고 몇 개 특성을 제외했습니다.
- 유명한 공개 데이터 저장소
- UC 얼바인Irnine 머신러닝 저장소(http://archive.ics.uci.edu/ml/)
- 캐글Kaggle 데이터셋(http://kaggle.com/datasets)
- 아마존AWS데이터셋(http://aws.amazon.com/datasets)
- 메타 포털(공개 데이터 저장소가 나열되어 있습니다)
- http://dataportals.org/
- http://opendatamonitor.eu/
- http://quandl.com
- 인기 있는 공개 데이터 저장소가 나열되어 있는 다른 페이지
- 위키백과 머신러닝 데이터셋 목록(https://goo.gl/SJHN2K)
- Quora.com 질문(http://goo.gl/zDR78y)
- 데이터셋 서브레딧subreddit(http://www.reddit.com/r/datasets)
이 장에서는 StatLib 저장소에 있는 캘리포니아 주택 가격Califormia Housing Prices 데이터셋을 사용합니다. 이 데이터셋은 1990년 캘리포니아 인구조사 데이터를 기반으로 합니다. 최근 데이터는 아니지만 학습용으로 아주 좋기 때문에 최근데이터라고 생각하겠습니다. 교육목적으로 사용하기 위해 범주형 특성을 추가하고 몇 개 특성을 제외했습니다.
CHAPTER 2 머신러닝 프로젝트 처음부터 끝까지
이 장에서는 여러분이 부동산 회사에 막 고용된 데이터 과학자라고 가정하고 예제 프로젝트의 처음부터 끝까지 진행해보겠습니다. 진행할 주요 단계는 다음과 같습니다.
1. 큰 그림을 봅니다.
2. 데이터를 구합니다.
3. 데이터로부터 통찰을 얻기 위해 탐색하고 시각화합니다.
4. 머신러닝 알고리즘을 위해 데이터를 준비합니다.
5. 모델을 선택하고 훈련시킵니다.
6. 모델을 상세하게 조정합니다.
7. 솔루션을 제시합니다.
8. 시스템을 론칭하고 모니터링하고 유지 보수합니다.
1. 큰 그림을 봅니다.
2. 데이터를 구합니다.
3. 데이터로부터 통찰을 얻기 위해 탐색하고 시각화합니다.
4. 머신러닝 알고리즘을 위해 데이터를 준비합니다.
5. 모델을 선택하고 훈련시킵니다.
6. 모델을 상세하게 조정합니다.
7. 솔루션을 제시합니다.
8. 시스템을 론칭하고 모니터링하고 유지 보수합니다.
1.5 테스트와 검증
모델이 새로운 샘플에 얼마나 잘 일반화될지 아는 유일한 방법은 새로운 샘플에 실제로 적용해 보는 것입니다. 이를 위해 실제 서비스에 모델을 넣고 잘 동작하는지 모니터링하는 방법이 있습니다. 이 방법이 괜찮긴 하지만 만약 모델이 아주 나쁘다면 고객이 불만을 토로할 테니 좋은 생각이 아닙니다.
더 나은 방법은 훈련 데이터를 훈련세트와 데스트 세트 두개로 나누는 것입니다. 이름에서도 알 수 있듯이 훈련 세트를 사용해 모델을 훈련시키고 테스트 세트를 사용해 모델을 테스트합니다. 새로운 샘플에 대한 오류 비율을 일반환 오차generalization error(또는 외부 샘플오차out-of-sample error)라고 하며, 테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값estimation을 얻습니다. 이 값은 이전에 본 적이 없는 새로운 샘플에 모델이 얼마나 잘 작도할지 알려줍니다.
훈련 오차가 낮지만(즉, 훈련 세트에서 모델의 오차가 적음) 일반화 오차가 높다면 이는 모델이 훈련 데이터에 과대적합되었다는 뜻입니다.
TIP 보통 데이터의 80%를 훈련에 사용하고 20%는 데트트용으로 떠어놓습니다.
모델 평가는 아주 간단합니다. 그냥 테스트 세트를 사용하면 됩니다. 두 모델(선형 모델과 다항 모델)중 어떤 것을 선택할지 갈등하고 있다고 합시다. 어떻게 결정할 수 있을까요? 두 모델 모두 훈련 세트로 훈련시키고 테스트 세트를 사용해 얼마나 잘 일반화되는지 비교해보면 됩니다.
이제 선형 모델이 더 잘 일반화되었다고 가정하고 과대적합을 피하기 위해 규제를 적용하려고 합니다. 이때 하이퍼파라미터 값을 어떻게 선택할까요? 100개의 하이퍼파라미터 값으로 1000개의 다른 모델을 훈련시키는 방법이 있습니다. 일반화 오차가 가장 낮은 모델(5%라고 합시다)을 만드는 최적의 하이퍼파라미터를 찾았다고 가정합시다.
이제 이 모델을 실제 서비스에 투입합니다. 하지만 성능이 예상만큼 좋지 않고 오차를 15%나 만듭니다. 왜 그럴까요?
일반화 오차를 테스트 세트에서 여러 번 측정했으므로 모델과 하이퍼파라미터가 테스트세트에 최적화된 모델을 만들었기 때문입니다. 이는 모델이 새로운 데이터에 잘 작동하지 않을 수 있다는 뜻입니다.
이 문제에 대한 일반적인 해결 방법은 검증 세트validation set라 부르는 두 번째 홀드아웃holdout세트를 만드는 것입니다. 훈련 세트를 사용해 다양한 하이퍼파라미터로 여러 모델을 훈련시키고 검증 세트에서 최상의 성능을 내는 모델과 하이퍼파라미터를 선택합니다. 만족스러운 모델을 찾으면 일반화 오차의 추정값을 얻기 위해 테스트 세트로 단 한번의 최종 테스트를 합니다.
훈련 데이터에서 검증 세트로 너무 많은 양의 데이터를 뺏기지 않기 위해 일반적으로 교차 검증cross-validation 기법을 사용합니다. 훈련 세트르 여러 서브셋subset으로 나누고 각 모델을 이 서브셋의 조합으로 후련시키고 나머지 부분으로 검증합니다. 모델과 하이퍼파라미터가 선택되면 전체 훈련 데이터를 사용하여 선택한 하이퍼파라미터로 최종 모델을 훈련시키고 테스트 세트에서 일반화 오차를 측정합니다.
공짜 점심 없음 이론
모델은 관측한 것을 감소화한 것입니다. 간소화의 의미는 새로운 샘플에 일반적이지 않을 것 같은 불필요한 세부사항을 제거하는 것입니다. 그러나 어떤 데이터를 버리고 어떤 데이터를 남길지 정하기 위해 가정을 해야 합니다. 예를 들어 선형 모델은 데이터가 근본적으로 선형이고 샘플과 직선 사이의 거리는 무시할 수 있는 잡음이라고 가정합니다.
1996년에 발효한 유명한 논문에서 데이비드 월퍼트David Wolperts는 데이터에 관해 완벽하게 어떤 가정도 하지 않으면 한 모델을 다른 모델보다 선호할 근거가 없음을 보였습니다. 이를 공짜 점심 없음No Free Lunch(NFL) 이론이라 합니다. 어떤 데이터셋에서는 선형 모델이 가장 잘 들어잠지만 다른 데이터셋에서는 신경망이 잘 들어맞습니다. 경험하기 전에 더 잘 맞을 거라고 보장할 수 있는 모델은 없습니다(이 이론의이름이 유래된 이유입니다). 어떤 모델이 최선인지 확실히 아는 유일한 방법은 모든 모델을 평가해보는 것뿐입니다. 이것이 불가능하기 때문에 실정에서는 데이터에 관해 타당한 가정을 하고 적절한 모델 몇 가지만 평가합니다. 예를 들어 간단한 작업에서는 규제의 수준이 다양한 선형 모델을 평가하고, 복잡한 문제라면 여러 가지 신경망을 평가합니다.
더 나은 방법은 훈련 데이터를 훈련세트와 데스트 세트 두개로 나누는 것입니다. 이름에서도 알 수 있듯이 훈련 세트를 사용해 모델을 훈련시키고 테스트 세트를 사용해 모델을 테스트합니다. 새로운 샘플에 대한 오류 비율을 일반환 오차generalization error(또는 외부 샘플오차out-of-sample error)라고 하며, 테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값estimation을 얻습니다. 이 값은 이전에 본 적이 없는 새로운 샘플에 모델이 얼마나 잘 작도할지 알려줍니다.
훈련 오차가 낮지만(즉, 훈련 세트에서 모델의 오차가 적음) 일반화 오차가 높다면 이는 모델이 훈련 데이터에 과대적합되었다는 뜻입니다.
TIP 보통 데이터의 80%를 훈련에 사용하고 20%는 데트트용으로 떠어놓습니다.
모델 평가는 아주 간단합니다. 그냥 테스트 세트를 사용하면 됩니다. 두 모델(선형 모델과 다항 모델)중 어떤 것을 선택할지 갈등하고 있다고 합시다. 어떻게 결정할 수 있을까요? 두 모델 모두 훈련 세트로 훈련시키고 테스트 세트를 사용해 얼마나 잘 일반화되는지 비교해보면 됩니다.
이제 선형 모델이 더 잘 일반화되었다고 가정하고 과대적합을 피하기 위해 규제를 적용하려고 합니다. 이때 하이퍼파라미터 값을 어떻게 선택할까요? 100개의 하이퍼파라미터 값으로 1000개의 다른 모델을 훈련시키는 방법이 있습니다. 일반화 오차가 가장 낮은 모델(5%라고 합시다)을 만드는 최적의 하이퍼파라미터를 찾았다고 가정합시다.
이제 이 모델을 실제 서비스에 투입합니다. 하지만 성능이 예상만큼 좋지 않고 오차를 15%나 만듭니다. 왜 그럴까요?
일반화 오차를 테스트 세트에서 여러 번 측정했으므로 모델과 하이퍼파라미터가 테스트세트에 최적화된 모델을 만들었기 때문입니다. 이는 모델이 새로운 데이터에 잘 작동하지 않을 수 있다는 뜻입니다.
이 문제에 대한 일반적인 해결 방법은 검증 세트validation set라 부르는 두 번째 홀드아웃holdout세트를 만드는 것입니다. 훈련 세트를 사용해 다양한 하이퍼파라미터로 여러 모델을 훈련시키고 검증 세트에서 최상의 성능을 내는 모델과 하이퍼파라미터를 선택합니다. 만족스러운 모델을 찾으면 일반화 오차의 추정값을 얻기 위해 테스트 세트로 단 한번의 최종 테스트를 합니다.
훈련 데이터에서 검증 세트로 너무 많은 양의 데이터를 뺏기지 않기 위해 일반적으로 교차 검증cross-validation 기법을 사용합니다. 훈련 세트르 여러 서브셋subset으로 나누고 각 모델을 이 서브셋의 조합으로 후련시키고 나머지 부분으로 검증합니다. 모델과 하이퍼파라미터가 선택되면 전체 훈련 데이터를 사용하여 선택한 하이퍼파라미터로 최종 모델을 훈련시키고 테스트 세트에서 일반화 오차를 측정합니다.
공짜 점심 없음 이론
모델은 관측한 것을 감소화한 것입니다. 간소화의 의미는 새로운 샘플에 일반적이지 않을 것 같은 불필요한 세부사항을 제거하는 것입니다. 그러나 어떤 데이터를 버리고 어떤 데이터를 남길지 정하기 위해 가정을 해야 합니다. 예를 들어 선형 모델은 데이터가 근본적으로 선형이고 샘플과 직선 사이의 거리는 무시할 수 있는 잡음이라고 가정합니다.
1996년에 발효한 유명한 논문에서 데이비드 월퍼트David Wolperts는 데이터에 관해 완벽하게 어떤 가정도 하지 않으면 한 모델을 다른 모델보다 선호할 근거가 없음을 보였습니다. 이를 공짜 점심 없음No Free Lunch(NFL) 이론이라 합니다. 어떤 데이터셋에서는 선형 모델이 가장 잘 들어잠지만 다른 데이터셋에서는 신경망이 잘 들어맞습니다. 경험하기 전에 더 잘 맞을 거라고 보장할 수 있는 모델은 없습니다(이 이론의이름이 유래된 이유입니다). 어떤 모델이 최선인지 확실히 아는 유일한 방법은 모든 모델을 평가해보는 것뿐입니다. 이것이 불가능하기 때문에 실정에서는 데이터에 관해 타당한 가정을 하고 적절한 모델 몇 가지만 평가합니다. 예를 들어 간단한 작업에서는 규제의 수준이 다양한 선형 모델을 평가하고, 복잡한 문제라면 여러 가지 신경망을 평가합니다.
1.4 머신러닝의 주요 도전 과제
간단하게 말해 우리의 주요 작업은 학습 알고리즘을 선택해서 어떤 데이터에 훈련시키는 것이므로 문제가 될 수 있는 두 가지 '나쁜 알고리즘'과 '나쁜 데이터'입니다. 이 절에서는 이 두가지에 대해 알아봅니다. 나쁜 데이터의 사례부터 알아보겠습니다.
1.4.1 충분하지 않은 양의 훈련 데이터
어린아이에게 사과에 대해 알려주려면 사과를 가리키면서 '사과'라고 말하기만 하면 됩니다(아마도 이 과정을 여러 번 반복해야 합니다). 그러면 아이는 색깔과 모야이 달라도 모든 종류의 사과를 구분할 수 있습니다. 정말 똑똑하지요.
머신러닝은 아직 이렇게까지는 못합니다. 대부분의 머신러닝 알고리즘이 잘 작동하려면 데이터가 많아야 합니다. 아주 간단한 문제에서조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제라면 수백만 개가 필요할지도 모릅니다(이미 만들어진 모델을 재사용할 수 없다면 말이죠).
믿을 수 없는 데이터의 효과
2001년에 발표한 유명한 노문에서 마이크로소프트 연구자인 미셀 반코와 에릭 브릴은 아주 간단한 모델을 포함하여 여러 다른 머신러닝 알고리즘에 충분한 데이터가 주어지면 복잡한 자연어 중의성 해소 문제를 거의 비슷하게 잘 처리한다는 것을 보였습니다.
이 논문의 저자들이 말한 것처럼 '이 결과가 제시하는 것은 시간과 돈을 알고리즘 개발에 쓰는것과 말뭉치 개발에 쓰는것 사이트 트레이드오프에 대해 다시 생각해봐야 한다는 것입니다.'
복잡한 문제에서 알고리즘보다 데이터가 더 중요하다는 이 생각은 2009년에 피터 노르빅등이 쓴 'The Unreasonable Effectiveness of Data'논문 때문에 더 유명해졌습니다. 하지만 기억할 점은 작거나 중간 규모의 데이터셋이 여전히 매우 흔하고, 훈련 데이터를 추가로 모으는 것이 항상 쉽거나 저렴한 일은 아니므로, 아직은 알고리즘을 무시하지 말아야 한다는 것입니다.
1.4.2 대표성 없는 훈련 데이터
일반화가 잘되려면 우리가 일반화하기 원하는 새로운 사례를 훈련 데이터가 잘 대표하는 것이 중요합니다. 이는 사례 기반 학습이나 모델 기반 학습 모두 마찬가지입니다.
예를 들어 앞서선형 모델을 훈련시키기 위해 사용한 나라의 집합에는 일부 나라가 빠져있어 대표성이 완벽하지 못합니다. 누락된 나라를 추가했을때 데이터가 어떻게 나타나는지 보여줍니다.
이 데이터에 선형 모델을 훈련시키면 실선으로 된 모델을 얻습니다. 반면 이전 모델은 점선으로 나타나 있습니다. 그림에서 알 수 있듯이 누락된 나라를 추가하면 모델이 크게 변경될 뿐만 아니라 이런 간단한 선형 모델은 잘 작도하지 않는다는 걸 확실히 보여줍니다. 매우 부유한 나라가 중간 정도의 나라보다 행복하지 않고, 반대로 일부 가나한 나라가 부유한 나라보다 행복한 것 같습니다.
대표성 없는 훈련 데이터를 사용했으므로 정확한 예측을 하지 못하는, 특히 매우 가난하거나 부유한 나라에서 잘못 예측하는 모델을 훈련시켰습니다.
일반화하려는 사례들을 대표하는 훈련 세트를 사용하는 것이 매우 중요하지만, 이게 생각보다 어려울 때가 많습니다. 샘플이 작으면 샘플링 잡음sampling noise(즉, 우연에 의한 대표성 없는 데이터)이 생기고, 매우 큰 샘플도 표본 추출 방법이 잘못되면 대표성을 띠지 못할 수 있습니다. 이를 샘플링 편향sampling bias이라고 합니다.
유명한 샘플링 편향 사례
아마도 샘플링 편향에 대한 가장 유명한 사례는 랜던과 루즈벨트가 경쟁했던 1936년 미국 대통령 선거에서 Literary Digest잡지사가 천만 명에게 우편물을 보내 수행한 대규모 여론조사일 것입니다. 240만 명의 응답을 받았고 랜던이 선거에서 57% 득표를 얻을 것이라고 높은 신뢰도로 예측했습니다.
하지만 루즈벨트가 62% 득표로 당선되었습니다. 문제는 Literary Digest의 샘플링 방법에 있었습니다.
- 첫째, 여론조사용 주소를 얻기 위해 전화번호부, 자사의 구독자 명부, 클럽 회원 명부등을 사용했습니다. 이런 명부는 모두 공화당(따라서 랜던)에 투표할 가능성이 높은 부유한 계층에 편중된 경향이 있습니다.
- 둘째, 우편물 수신자 중 25%미만의 사람이 응답했습니다. 이른 정치에 관심 없는 사람, Literary Digest를 싫어하느 사람과 다른 중요한 그룹을 제외시킴으로써 역시 표본을 편형되게 만들었습니다. 특히 이러한 종류의 샘플링 편향을 비응답 편향nonresponse bias이라고 합니다.
다른 예로 펑크 음악 비디올르 분휴하는 시스템을 만든다고 가정합시다. 이를 위한 훈련 세트를 유투브에서 '펑크 음악'을 검색해 마련할 수 있습니다. 하지만 이는 유투브 검색 엔진이 결괏값으로 유투브 내의 모든 펑크 음알그 대표하는 동영상을 반환한다는 가정하는 것입니다. 현실에서는 검색 결과가 인기 음악가들로 편중될 가능성이 큽니다. 그렇다면 어떻게 대량의 훈련 세트를 구할 수 있을까요?
1.4.3 낮은 품질의 데이터
훈련 데이터가 에러, 이상치outlier, 잡음(예를 들면 성능이 낮은 측정 장치 때문에)으로 가득하다면 머신러닝 시스템이 내재된 패턴을 찾기 어려워 잘 작동하지 않을 것입니다. 그렇기 때문에 훈련 데이터 정제에 시간을 투자할 만한 가치는 충분합니다. 사실 대부분의 데이터 과학자가 데이터 정제에 많은 시간을 쓰고 있습니다. 예를 들어보겠습니다.
- 일부 샘플이 이상치라는 게 명학하면 그것히 그긋들을 무시하거나 수종으로 잘못된 것을 고치는 것이 좋습니다.
- 일부 샘플에 특성 몇 개가 빠져있다면(예를 들면 고객 중 5%가 나이를 기록하지 않음), 이 특성을 모두 무시할지, 이 샘플을 무시할지, 빠진 값을 채울지(예를 들면 평균 나이로), 또는 이 특성을 넣은 모델과 제외한 모델을 따로 훈련시킬 것인지 등을 정해야 합니다.
1.4.4 관련 없는 특성
속담에도 있듯이 엉터리가 들어가면 엉터리가 나옵니다garbage in, garbage out. 훈련 데이터에 관련없는 특성이 적고 관련 있는 특성이 충분해야 시스템이 학습할 수 있을 것입니다. 성공적인 머신러닝 프로젝트의 핵심 요소는 훈련에 사용할 좋은 특성들을 찾는 것 입니다. 이 과정을 특성공학feature engineering이라 하며 다음 작업을 포함합니다.
- 특성 선택feature selection: 가지고 있는 특성 중에서 훈련에 가장 유용한 특성을 선택합니다.
- 특성 추출(feature extraction): 특성을 결합하여 더 유용한 특성을 만듭니다(앞서 본 것처럼 차원 축소 알고리즘을 사용할 수 있습니다.)
- 새로운 데이터를 수집해 새 특성을 만듭니다.
지금까지 나쁜 데이터의 사례를 살펴보았고 이제 나쁜 알고리즘의 예를 몇 가지 살펴보겠습니다.
1.4.5 훈련 데이터 과대적합
해외여행 중 택시운전사가 내 물건을 후쳤다고 가정합시다. 아마도 그 나라의 모든 택시운전사를 도둑이라고 생각할 수도 있습니다. 사람은 종종 과도하게 일반화를 하지만 주의하지 않으면 기계도 똑같은 함정에 빠질 수 있습니다. 머신러닝에서는 이를 과대적합(overfitting)이라고 합니다. 이는 모델이 훈현 데이터에 너무 잘 맞지만 일반성이 떨어진다는 뜻입니다.
[그림 1-22]는 고차원의 다항 회귀 모델이 삶의 만족도 훈련 데이터에 크게 과대적합된 사례를 보여줍니다. 간단한 선형 모델보다 이 모델이 훈련 데이터에 더 잘 맞는다라도 실제로 이 예측을 믿기는 힘든니다.
심층 신경망 같은 복잡한 모델은 데이터에서 미묘한 패턴을 감지할 수 있지만, 훈련 세트에 잡음이 많거나 데이터셋이 너무 작으면(샘플링 잡음이 발생하므로) 잡음이 섞인 패턴을 감지하게 됩니다. 당연히 이런 패턴은 새로운 샘플에 일반화되지 못합니다. 예를 들어 삶의 만족도 모델에 나라 이름 같은 관련 없는 특성을 많이 추가한다고 합시다. 이 경우 복잡한 모델이 이름에 'w'가 들어간 나라들의 삶의 만족도가 7보다 크다는 패턴을 감지할지 모릅니다. 뉴질랜드New Zealand(7.3), 노르웨이Norway(7.4), 스웨덴Sweden(7.2), 스위스Switzerland(7.5)가 여기에 속합니다. 이 W-만족도 규칙을 르완다Rewanda나 잠바브웨Zimbabwe에 일반화하면 얼마나 신뢰할 수 있을까요? 확실히 이 패턴은 우연히 훈련 데이터에서 찾은 것이지만 이 패턴이 진짜인지 잡음데이터로 인한 것인지 모델이 구분해낼 방법은 없습니다.
CAUTION_ 과대적합은 훈련 데이터에 있는 잡음의 양에 비해 모델이 너무 복잡할 때 일어납니다. 해결 방법은 다음과 같습니다.
- 파라미터 수가 적은 모델을 선택하거나(예를 들면 고차원 다항 모델보다 선형 모델), 훈련 데이터에 있는 특성 수를 줄이거나, 모델에 제약을 가하여 단순화시킵니다.
- 훈련 데이터를 더 많이 모읍니다.
- 훈련 데이터의 잡음을 줄입니다(예를 들면 오류 데이터 수정과 이상치 제거).
모델을 단순하게 하고 과대적합의 위험을 감소시키기 위해 모델에 제약을 가하는 것을 규제regularization라고 합니다. 예를 들어 앞서 만든 선형 모델은 두 개의 파라미터 @0과 @1을 가지고 있습니다. 이는 훈련 데이터에 모델을 맞추기 위한 두 개의 자유도degree of freedom를 학습 할고리즘에 부여합니다. 모델은 직석읜 절편(@0)과 기울기(@1)를 조절할 수 있습니다. 우리가 @1=0이 되도록 강제하면 알고리즘에 한 개의 자유도만 남게 되고 데이터에 적절하게 맞춰지기 힘들것 입니다. 즉, 할 수 있는 것이 훈련 데이터에 가능한 한 가깝게 되도록 직선을 올리거나 내리는 것이 전부이므로 결국 평균 근거가 됩니다. 진짜 아주 간단한 모델이네요! 알고리즘 @1을 수정하도록 허락되는 작은 값을 유지시키면 학습 알고리즘이 자유도 1과 2 사이의 적절한 어딘가에 위치할 것입니다. 이 자유도 2인 모델보다는 단순하고 자유도 1인 모델보다는 복잡한 모델을 만듭니다. 데이터에 왁변히 맞추는 것과 일반화를 위해 단순한 모델을 유지하는 것 사이의 올바른 균형을 찾는것이 좋습니다.
[그림 1-23]에 세 가지 모델이 있습니다. 점선은 나라 몇 개가 빠진 채로 훈련한 모델이고 파선은 모든 나라를 포함시켜 훈련한 두 번째 모델이며 실선은 첫 번째 모델과 같은 데이터에 규제를 적용해 만든 선형 모델입니다. 규제가 모델의 기울기를 더 작게 만들어 훈련 데이터에는 덜 맞지만 새로운 샘플에는 더 잘 일반화됩니다.
학습하는 동안 적용할 규제의 양은 하이퍼파라미터hyperparameter가 결정합니다. 하이퍼파라미터는 (모델이 아니라) 학습 알고리즘의 파라미터입니다. 그래서 학습 알고리즘으로부터 영향을 받지 않으며, 훈련 전에 미리 지정되고, 훈련하는 동안에는 상수로 남아 있습니다. 규제 하이퍼 파라미터를 매운 큰 값으로 지정하면 (기울기가 0에 가까운) 거의 평면한 모델을 얻게 됩니다. 그러면 학습 알고리즘이 훈련 데이터에 과대적합될 가능성은 거의 없겠지만 좋은 모델을 찾지 못합니다. 머신러닝 시스템을 구축할 때 하이퍼파라미터 튜닝은 매우 중요한 과정입니다(다음 장에서 자세한 예를 보겠습니다).
1.4.6 훈련 데이터 과소적합
이미 짐작했겠지만 과소적합underfitting은 과대적합의 반대입니다. 이는 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못할 때 일어납니다. 옐르 들어 삶의 만족도에 대한 선형 모델은 과소적합되기 쉽습니다. 현실은 이 모델보다 더 복잡하므로 훈련 샘플에서조차도 부정확한 예측을 만들 것입니다.
이 문제를 해결하는 주요 기법은 다음과 같습니다.
- 파라미터가 더 많은 강력한 모델을 선택합니다.
- 학습 알고리즘에 더 좋은 특성을 제고합니다(특성 엔지니어링).
- 모델의 제약을 줄입니다(예를 들면 규제 하이퍼라라미터를 감소시킵니다).
1.4.7 한걸음 물러서서
지금까지 여러분은 벌써 머신러닝에 관해 많은 것을 배웠습니다. 그러나 많은 개념을 한꺼번에 다루다 보니 정리가 제대로 되지 않았을 것입니다. 한걸음 물러서서 큰 그림을 보겠습니다.
- 머신러닝은 명시적인 규칙을 코딩하지 않고 기계가 데이터로부터 학습하여 어떤 작업을 더 잘하도록 만드는 것입니다.
- 여러 종륭의 머신러닝 시스템이 있습니다. 지도 학습과 비지도 학습, 배치 학습과 오라인 학습, 사례 기간 학습과 모델 기반 학습 등입니다.
- 머신러닝 프로젝트에서는 훈련 세트에 데이터를 모아 학습 알고리즘에 주입합니다. 학습 알고리즘이 모델 기반이면 훈련 세트에 모델을 맞추기 위해 파라미터를 조정하고(즉, 훈련 세트에서 좋은 예측을 만들기 위해). 새로운 데이터에서도 좋은 예측을 만들거라 기대합니다. 알고리즘이 사례 기반이면 샘플을 기억하는 것이 학습이고 새오룬 샘플에 일반화하기 위해 유사도 측정을 사용합니다.
- 훈련 세트가 너무 작거나, 대표성이 없는 데이터이거나, 잡음이 많고 관련 없는 특성으로 오염되어 있다면 시스템이 잘 작동하지 않습니다(엉터리가 들어가면 엉터리가 나옵니다). 마지막으로, 모델이 너무 단순하거나(과소적합된 경우) 너무 복잡하지 않아야 합니다(과대적합된 경우).
마지막으로 다루어야 할 중요한 주제가 하나 있습니다. 모델을 학습시켰다 해서 새로운 샘플에 일반화되길 그냥 바라기만 해서는 안 됩니다. 모델을 평가하고 필요하면 상세하게 튜닝해야 합니다. 어떻게 하는지 살펴보겠습니다.
1.4.1 충분하지 않은 양의 훈련 데이터
어린아이에게 사과에 대해 알려주려면 사과를 가리키면서 '사과'라고 말하기만 하면 됩니다(아마도 이 과정을 여러 번 반복해야 합니다). 그러면 아이는 색깔과 모야이 달라도 모든 종류의 사과를 구분할 수 있습니다. 정말 똑똑하지요.
머신러닝은 아직 이렇게까지는 못합니다. 대부분의 머신러닝 알고리즘이 잘 작동하려면 데이터가 많아야 합니다. 아주 간단한 문제에서조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제라면 수백만 개가 필요할지도 모릅니다(이미 만들어진 모델을 재사용할 수 없다면 말이죠).
믿을 수 없는 데이터의 효과
2001년에 발표한 유명한 노문에서 마이크로소프트 연구자인 미셀 반코와 에릭 브릴은 아주 간단한 모델을 포함하여 여러 다른 머신러닝 알고리즘에 충분한 데이터가 주어지면 복잡한 자연어 중의성 해소 문제를 거의 비슷하게 잘 처리한다는 것을 보였습니다.
이 논문의 저자들이 말한 것처럼 '이 결과가 제시하는 것은 시간과 돈을 알고리즘 개발에 쓰는것과 말뭉치 개발에 쓰는것 사이트 트레이드오프에 대해 다시 생각해봐야 한다는 것입니다.'
복잡한 문제에서 알고리즘보다 데이터가 더 중요하다는 이 생각은 2009년에 피터 노르빅등이 쓴 'The Unreasonable Effectiveness of Data'논문 때문에 더 유명해졌습니다. 하지만 기억할 점은 작거나 중간 규모의 데이터셋이 여전히 매우 흔하고, 훈련 데이터를 추가로 모으는 것이 항상 쉽거나 저렴한 일은 아니므로, 아직은 알고리즘을 무시하지 말아야 한다는 것입니다.
1.4.2 대표성 없는 훈련 데이터
일반화가 잘되려면 우리가 일반화하기 원하는 새로운 사례를 훈련 데이터가 잘 대표하는 것이 중요합니다. 이는 사례 기반 학습이나 모델 기반 학습 모두 마찬가지입니다.
예를 들어 앞서선형 모델을 훈련시키기 위해 사용한 나라의 집합에는 일부 나라가 빠져있어 대표성이 완벽하지 못합니다. 누락된 나라를 추가했을때 데이터가 어떻게 나타나는지 보여줍니다.
이 데이터에 선형 모델을 훈련시키면 실선으로 된 모델을 얻습니다. 반면 이전 모델은 점선으로 나타나 있습니다. 그림에서 알 수 있듯이 누락된 나라를 추가하면 모델이 크게 변경될 뿐만 아니라 이런 간단한 선형 모델은 잘 작도하지 않는다는 걸 확실히 보여줍니다. 매우 부유한 나라가 중간 정도의 나라보다 행복하지 않고, 반대로 일부 가나한 나라가 부유한 나라보다 행복한 것 같습니다.
대표성 없는 훈련 데이터를 사용했으므로 정확한 예측을 하지 못하는, 특히 매우 가난하거나 부유한 나라에서 잘못 예측하는 모델을 훈련시켰습니다.
일반화하려는 사례들을 대표하는 훈련 세트를 사용하는 것이 매우 중요하지만, 이게 생각보다 어려울 때가 많습니다. 샘플이 작으면 샘플링 잡음sampling noise(즉, 우연에 의한 대표성 없는 데이터)이 생기고, 매우 큰 샘플도 표본 추출 방법이 잘못되면 대표성을 띠지 못할 수 있습니다. 이를 샘플링 편향sampling bias이라고 합니다.
유명한 샘플링 편향 사례
아마도 샘플링 편향에 대한 가장 유명한 사례는 랜던과 루즈벨트가 경쟁했던 1936년 미국 대통령 선거에서 Literary Digest잡지사가 천만 명에게 우편물을 보내 수행한 대규모 여론조사일 것입니다. 240만 명의 응답을 받았고 랜던이 선거에서 57% 득표를 얻을 것이라고 높은 신뢰도로 예측했습니다.
하지만 루즈벨트가 62% 득표로 당선되었습니다. 문제는 Literary Digest의 샘플링 방법에 있었습니다.
- 첫째, 여론조사용 주소를 얻기 위해 전화번호부, 자사의 구독자 명부, 클럽 회원 명부등을 사용했습니다. 이런 명부는 모두 공화당(따라서 랜던)에 투표할 가능성이 높은 부유한 계층에 편중된 경향이 있습니다.
- 둘째, 우편물 수신자 중 25%미만의 사람이 응답했습니다. 이른 정치에 관심 없는 사람, Literary Digest를 싫어하느 사람과 다른 중요한 그룹을 제외시킴으로써 역시 표본을 편형되게 만들었습니다. 특히 이러한 종류의 샘플링 편향을 비응답 편향nonresponse bias이라고 합니다.
다른 예로 펑크 음악 비디올르 분휴하는 시스템을 만든다고 가정합시다. 이를 위한 훈련 세트를 유투브에서 '펑크 음악'을 검색해 마련할 수 있습니다. 하지만 이는 유투브 검색 엔진이 결괏값으로 유투브 내의 모든 펑크 음알그 대표하는 동영상을 반환한다는 가정하는 것입니다. 현실에서는 검색 결과가 인기 음악가들로 편중될 가능성이 큽니다. 그렇다면 어떻게 대량의 훈련 세트를 구할 수 있을까요?
1.4.3 낮은 품질의 데이터
훈련 데이터가 에러, 이상치outlier, 잡음(예를 들면 성능이 낮은 측정 장치 때문에)으로 가득하다면 머신러닝 시스템이 내재된 패턴을 찾기 어려워 잘 작동하지 않을 것입니다. 그렇기 때문에 훈련 데이터 정제에 시간을 투자할 만한 가치는 충분합니다. 사실 대부분의 데이터 과학자가 데이터 정제에 많은 시간을 쓰고 있습니다. 예를 들어보겠습니다.
- 일부 샘플이 이상치라는 게 명학하면 그것히 그긋들을 무시하거나 수종으로 잘못된 것을 고치는 것이 좋습니다.
- 일부 샘플에 특성 몇 개가 빠져있다면(예를 들면 고객 중 5%가 나이를 기록하지 않음), 이 특성을 모두 무시할지, 이 샘플을 무시할지, 빠진 값을 채울지(예를 들면 평균 나이로), 또는 이 특성을 넣은 모델과 제외한 모델을 따로 훈련시킬 것인지 등을 정해야 합니다.
1.4.4 관련 없는 특성
속담에도 있듯이 엉터리가 들어가면 엉터리가 나옵니다garbage in, garbage out. 훈련 데이터에 관련없는 특성이 적고 관련 있는 특성이 충분해야 시스템이 학습할 수 있을 것입니다. 성공적인 머신러닝 프로젝트의 핵심 요소는 훈련에 사용할 좋은 특성들을 찾는 것 입니다. 이 과정을 특성공학feature engineering이라 하며 다음 작업을 포함합니다.
- 특성 선택feature selection: 가지고 있는 특성 중에서 훈련에 가장 유용한 특성을 선택합니다.
- 특성 추출(feature extraction): 특성을 결합하여 더 유용한 특성을 만듭니다(앞서 본 것처럼 차원 축소 알고리즘을 사용할 수 있습니다.)
- 새로운 데이터를 수집해 새 특성을 만듭니다.
지금까지 나쁜 데이터의 사례를 살펴보았고 이제 나쁜 알고리즘의 예를 몇 가지 살펴보겠습니다.
1.4.5 훈련 데이터 과대적합
해외여행 중 택시운전사가 내 물건을 후쳤다고 가정합시다. 아마도 그 나라의 모든 택시운전사를 도둑이라고 생각할 수도 있습니다. 사람은 종종 과도하게 일반화를 하지만 주의하지 않으면 기계도 똑같은 함정에 빠질 수 있습니다. 머신러닝에서는 이를 과대적합(overfitting)이라고 합니다. 이는 모델이 훈현 데이터에 너무 잘 맞지만 일반성이 떨어진다는 뜻입니다.
[그림 1-22]는 고차원의 다항 회귀 모델이 삶의 만족도 훈련 데이터에 크게 과대적합된 사례를 보여줍니다. 간단한 선형 모델보다 이 모델이 훈련 데이터에 더 잘 맞는다라도 실제로 이 예측을 믿기는 힘든니다.
심층 신경망 같은 복잡한 모델은 데이터에서 미묘한 패턴을 감지할 수 있지만, 훈련 세트에 잡음이 많거나 데이터셋이 너무 작으면(샘플링 잡음이 발생하므로) 잡음이 섞인 패턴을 감지하게 됩니다. 당연히 이런 패턴은 새로운 샘플에 일반화되지 못합니다. 예를 들어 삶의 만족도 모델에 나라 이름 같은 관련 없는 특성을 많이 추가한다고 합시다. 이 경우 복잡한 모델이 이름에 'w'가 들어간 나라들의 삶의 만족도가 7보다 크다는 패턴을 감지할지 모릅니다. 뉴질랜드New Zealand(7.3), 노르웨이Norway(7.4), 스웨덴Sweden(7.2), 스위스Switzerland(7.5)가 여기에 속합니다. 이 W-만족도 규칙을 르완다Rewanda나 잠바브웨Zimbabwe에 일반화하면 얼마나 신뢰할 수 있을까요? 확실히 이 패턴은 우연히 훈련 데이터에서 찾은 것이지만 이 패턴이 진짜인지 잡음데이터로 인한 것인지 모델이 구분해낼 방법은 없습니다.
CAUTION_ 과대적합은 훈련 데이터에 있는 잡음의 양에 비해 모델이 너무 복잡할 때 일어납니다. 해결 방법은 다음과 같습니다.
- 파라미터 수가 적은 모델을 선택하거나(예를 들면 고차원 다항 모델보다 선형 모델), 훈련 데이터에 있는 특성 수를 줄이거나, 모델에 제약을 가하여 단순화시킵니다.
- 훈련 데이터를 더 많이 모읍니다.
- 훈련 데이터의 잡음을 줄입니다(예를 들면 오류 데이터 수정과 이상치 제거).
모델을 단순하게 하고 과대적합의 위험을 감소시키기 위해 모델에 제약을 가하는 것을 규제regularization라고 합니다. 예를 들어 앞서 만든 선형 모델은 두 개의 파라미터 @0과 @1을 가지고 있습니다. 이는 훈련 데이터에 모델을 맞추기 위한 두 개의 자유도degree of freedom를 학습 할고리즘에 부여합니다. 모델은 직석읜 절편(@0)과 기울기(@1)를 조절할 수 있습니다. 우리가 @1=0이 되도록 강제하면 알고리즘에 한 개의 자유도만 남게 되고 데이터에 적절하게 맞춰지기 힘들것 입니다. 즉, 할 수 있는 것이 훈련 데이터에 가능한 한 가깝게 되도록 직선을 올리거나 내리는 것이 전부이므로 결국 평균 근거가 됩니다. 진짜 아주 간단한 모델이네요! 알고리즘 @1을 수정하도록 허락되는 작은 값을 유지시키면 학습 알고리즘이 자유도 1과 2 사이의 적절한 어딘가에 위치할 것입니다. 이 자유도 2인 모델보다는 단순하고 자유도 1인 모델보다는 복잡한 모델을 만듭니다. 데이터에 왁변히 맞추는 것과 일반화를 위해 단순한 모델을 유지하는 것 사이의 올바른 균형을 찾는것이 좋습니다.
[그림 1-23]에 세 가지 모델이 있습니다. 점선은 나라 몇 개가 빠진 채로 훈련한 모델이고 파선은 모든 나라를 포함시켜 훈련한 두 번째 모델이며 실선은 첫 번째 모델과 같은 데이터에 규제를 적용해 만든 선형 모델입니다. 규제가 모델의 기울기를 더 작게 만들어 훈련 데이터에는 덜 맞지만 새로운 샘플에는 더 잘 일반화됩니다.
학습하는 동안 적용할 규제의 양은 하이퍼파라미터hyperparameter가 결정합니다. 하이퍼파라미터는 (모델이 아니라) 학습 알고리즘의 파라미터입니다. 그래서 학습 알고리즘으로부터 영향을 받지 않으며, 훈련 전에 미리 지정되고, 훈련하는 동안에는 상수로 남아 있습니다. 규제 하이퍼 파라미터를 매운 큰 값으로 지정하면 (기울기가 0에 가까운) 거의 평면한 모델을 얻게 됩니다. 그러면 학습 알고리즘이 훈련 데이터에 과대적합될 가능성은 거의 없겠지만 좋은 모델을 찾지 못합니다. 머신러닝 시스템을 구축할 때 하이퍼파라미터 튜닝은 매우 중요한 과정입니다(다음 장에서 자세한 예를 보겠습니다).
1.4.6 훈련 데이터 과소적합
이미 짐작했겠지만 과소적합underfitting은 과대적합의 반대입니다. 이는 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못할 때 일어납니다. 옐르 들어 삶의 만족도에 대한 선형 모델은 과소적합되기 쉽습니다. 현실은 이 모델보다 더 복잡하므로 훈련 샘플에서조차도 부정확한 예측을 만들 것입니다.
이 문제를 해결하는 주요 기법은 다음과 같습니다.
- 파라미터가 더 많은 강력한 모델을 선택합니다.
- 학습 알고리즘에 더 좋은 특성을 제고합니다(특성 엔지니어링).
- 모델의 제약을 줄입니다(예를 들면 규제 하이퍼라라미터를 감소시킵니다).
1.4.7 한걸음 물러서서
지금까지 여러분은 벌써 머신러닝에 관해 많은 것을 배웠습니다. 그러나 많은 개념을 한꺼번에 다루다 보니 정리가 제대로 되지 않았을 것입니다. 한걸음 물러서서 큰 그림을 보겠습니다.
- 머신러닝은 명시적인 규칙을 코딩하지 않고 기계가 데이터로부터 학습하여 어떤 작업을 더 잘하도록 만드는 것입니다.
- 여러 종륭의 머신러닝 시스템이 있습니다. 지도 학습과 비지도 학습, 배치 학습과 오라인 학습, 사례 기간 학습과 모델 기반 학습 등입니다.
- 머신러닝 프로젝트에서는 훈련 세트에 데이터를 모아 학습 알고리즘에 주입합니다. 학습 알고리즘이 모델 기반이면 훈련 세트에 모델을 맞추기 위해 파라미터를 조정하고(즉, 훈련 세트에서 좋은 예측을 만들기 위해). 새로운 데이터에서도 좋은 예측을 만들거라 기대합니다. 알고리즘이 사례 기반이면 샘플을 기억하는 것이 학습이고 새오룬 샘플에 일반화하기 위해 유사도 측정을 사용합니다.
- 훈련 세트가 너무 작거나, 대표성이 없는 데이터이거나, 잡음이 많고 관련 없는 특성으로 오염되어 있다면 시스템이 잘 작동하지 않습니다(엉터리가 들어가면 엉터리가 나옵니다). 마지막으로, 모델이 너무 단순하거나(과소적합된 경우) 너무 복잡하지 않아야 합니다(과대적합된 경우).
마지막으로 다루어야 할 중요한 주제가 하나 있습니다. 모델을 학습시켰다 해서 새로운 샘플에 일반화되길 그냥 바라기만 해서는 안 됩니다. 모델을 평가하고 필요하면 상세하게 튜닝해야 합니다. 어떻게 하는지 살펴보겠습니다.
2018년 7월 4일 수요일
1.3 머신러닝 시스템의 종류
머신러닝 시스템의 종류는 굉장히 많으므로 다음을 기준으로 넓은 범주에서 분류하면 도움이 됩니다.
- 사람이 감독 하에 훈련하는 거신지 그렇지 않은 것인지(지도, 비지도, 준지도, 강화 학습)
- 실시간으로 점진적인 학습을 하는지 아닌지(온라인 학습과 배치학습)
- 단순하게 알고 있는 데이터 포인트와 새 데이터 포인트를 비교하는 것인지 아니면 훈련 데이터셋에서 과학자들처럼 패턴을 발견하여 예측 모델을 만드는지(사례 기반 학습과 모델 기반 학습)
이 범주들은 서로 배타적이지 않으며 원하는 대로 연결할 수 있습니다. 예를 들어 최첨단 스팸 필터가 심층 신경망 모델을 사용해 스팸과 스팸이 아닌 페일로부터 실시간으로 학습할 지도 모릅니다. 그렇다면 이 스스템은 온라인이고 모델 기반이며 지도 학습 시스템입니다.
이 범주들을 조금 더 차세히 들여다보겠습니다.
1.3.1 지도 학습과 비지도 학습
머신러닝 시스템을 '학습하는 동안의 감독 형태나 정보량'에 따라 분류할 수 있습니다. 지도 학습, 비지도 학습, 준지도 학습, 강화 학습 등 네 가지 주요 범주가 있습니다.
지도학습
지도 학습supervised learning에는 알고리즘에 주입하는 훈련 데이터에 레이블label이라는 원하는 답이 포함됩니다.
분류classification가 전형적인 지도 학습 작업이며, 스팸 필터가 좋은 예입니다. 스팸 필터는 많은 메일 샘플과 소속 정보(스팸인지 아닌지)로 훈련되어야 하며 어떻게 새 메일을 분류할지 학습해야 합니다.
또 다른 전형적인 작업은 예측 변수predictor variable라 부르는 특성feature(주행거리, 연식, 브랜드 등)을 사용해 중고차 가격 같은 타긱 수치를 예측하는 것입니다. 이런 종류의 작업을 휘귀regression라고 부릅니다. 시스템을 훈련시키려면 예측 변수와 레이블(중고차 가격)이 포함된 중고차 데이터가 많이 필요합니다.
NOTE 머신러닝에서 속성(attribute)은 데이터 타입(예를 들면 주행거리)을 말합니다. 특성은 문맥에 따라 여러 의미를 갖지만 일반적으로 속성과 값이 합쳐진 것을 의미합니다.(예를 들면 주행거리=15,000). 하지만 많은 사람이 속성과 특성을 구분하지 않고 사용합니다.
일부 희귀 알고리즘은 분류에 사용할 수도 있고 또 반대의 경우도 있습니다. 옐르 들어 분류에 널리 쓰이는 로지스틱 희귀는 클래스에 속할 확률을 출력합니다(예를 들면 스팸일 가능성 20%).
다음은 가장 중요한 지도 학습 알고리즘들입니다
- k-최근접 이웃k-Nearest Neighbors
- 선형 희귀(Linear Regression)
- 로지스틱 희귀(Logistic Regression)
- 서포트 벡터 머신(Support Vector Machines SVM)
- 결정트리(Decision Tree)와 랜덤 포레스트(Random Forests)
- 신경망(Neural networks)
비지도 학습
비지도 학습(unsupervised learning)에는 말 그대로 훈련 데이터에 레이블이 없습니다. 시스템이 아무런 도움 없이 학습해야 합니다.
다음은 가장 중요한 비지도 학습 알고리즘 입니다.
- 군집(Clustering)
- k-평균(k-Means)
- 계층 군집 분석(Hierarchical Cluster Analysis. HCA)
- 기댓값 최대화(Expectaion Maximization)
- 시각화(visualization)와 차원 축소(dimensionality reduction)
- 주성분 분석(Principal Component Analysis. PCA)
- 커널(kernel)PCA
- 지역적 선형 임베딩(Locally-Linear Embedding. LLE)
- t-SNE (t-distributed Stochastic Neighbor Embedding)
- 연관 규칙 학습(Association rule learning)
- 어프라이어리(Apriori)
- 이클렛(Eclat)
예를 들어 블로그 방문자에 대한 데이터가 많이 있다고 합시다. 비슷한 방문자들을 그룹으로 묶기 위해 군집 알고리즘을 적용하려 합니다. 하지만 방문자가 어떤 그룹에 속하는지 알고리즘에 알려줄 수 있는 데이터 포이트가 없습니다. 그래서 알고리즘이 스스로 방문자 사이의 연결고리를 찾습니다. 예를 들어 40%의 방문자가 만화책을 좋아하며 저녁때 블로그 글을 읽는 남성이, 20%는 주말에 방문하는 공상 과학을 좋아하는 젋은 사람임을 알게 될지도 모릅니다. 계층 군집(hierachical clustering)알고리즘을 사용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있습니다. 그러면 각 그룹에 맞춰 블로그에 글을 쓰는데 도움이 될 것입니다.
시각화(visualization)알고리즘도 비지도 학습 알고리즘의 좋은 예입니다. 레이블이 없는 대규모의 데이터를 넣으면 도식화가 가능한 2D나 3D 표현을 만들어 줍니다. 이런 알고리즘은 가능한 한 구조를 그대로 유지하려 하므로(예를 들어 입력 공간에서 떨어져 있던 클러스트(cluster)는 시각화된 그래프에서 겹쳐지지 않게 유지됩니다) 데이터가 어떻게 조직되어 있는지 이해할 수 있고 예상하지 못한 패턴을 발견할 수도 있습니다.
비슷한 작업으로는 너무 많은 정보를잃지 않으면서 데이터를 간소화하려는 차원 축소(dimensionlity reduction)가 있습니다. 이렇게 하는 한가지 방법은 상관관계가 있는 여러 특성을 하나로 합치는 것입니다. 예를 들어 차의 주행거리가 연식과 매우 연관되어 있으므로 차원 축소 알고리즘으로 두 특성을 차의 마모 정도를 나타내는 하나의 특성으로 합칠 수 있습니다. 이를 특성 추출(feature extraction)이라고 합니다.
TIP (지도 학습 알고리즘 같은) 머신러닝 알고리즘에 데이터를 주입하기 전에 차원 축소 알고리즘을 사용하여 훈련 데이터의 차원을 줄이는 것이 유용할 때가 많습니다. 살행 속도가 훨씬 빨라지고 디스크와 메모리를 차지하는 공간도 줄고 경우에 따라 성능이 좋아지기도 합니다.
또 하나의 중요한 비지도 학습은 이상치 탐지(anomaly detection)입니다. 예를 들어 부정 거래를 막기 위해 이상한 신용카드 거래를 감지하고, 제조 결함을 잡아내고, 학습 알고리즘에 주입하기전에 데이터셋에서 이상한 값을 자동으로 제거하는 것 등입니다. 시스템은 정상 샘플로 훈련되고, 새로운 샘플이 정상 데이터인지 혹은 이상치인지 판단합니다.
널리 사용되는 또 다른 비지도 학습은 대량의 데이터에서 특성 간의 흥미로운 관계를 찾는 연관 규칙 학습(association rule learning)입니다. 예를 들어 여러분의 슈퍼마켓을 운영한다고 가정합시다. 판매 기록에 연관 규칙을 적용하면 바비규 소스와 감자를 구매한 사람이 스테이크도 구매하는 경향이 있다는 것을 찾을지도 모릅니다.
준지도 학습
어떤 알고리즘은 레이블이 일부만 있는 데이터도 다룰 수 있습니다. 보통은 레이블이 없는 데이터가 많고 레이블이 있는 데이터는 아주 조금입니다. 이를 준지도 학습(semisupervised learning)이라고 합니다.
구글 포토 호스팅 서비스가 좋은 예입니다. 이 서비스에 가족 사진을 모두 올리면 사람 A는 사진1, 5, 11에 있고, 사람 B는 사진 2, 5, 7에 있다고 자동으로 인식합니다. 이는 비지도학습(군집)입니다. 이제 시스템에 필요한 것은 이 사람들이 누구인가 하는 정보입니다. 사람마다 레이블이 하나씩만 주어지면 사진에 있는 모든 사람의 이름을 알 수 있고, 편리하게 사진을 찾을 수 있습니다.
대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있습니다. 예를 들어 심층 신뢰 신경망 deep belief network (DBN)은 여러 겹으로 쌓은 제한된 볼츠만머신 restricted Bolzmann machine(RBM)이라 불리는 비지도 학습에 기초합니다. RBM이 비지도 학습 장식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조정됩니다.
강화 학습
강화 학습(Reinforcement learning)은 매우 다른 종류의 알고리즘입니다. 여기서느 학습하는 시스템을 에이전트라고 부르며 환경environment을 관찰해서 해동action을 실행하고 그 결과로 보상reward(또는 부정적인 보상에 해당하는 벌점 penalty)을 받습니다. 시간이 지나면서 가장 큰 보상을 얻기 위해 정책policy이라고 부르는 최상의 전략을 스스로 학습합니다. 정책은 주어진 상황에서 에이전트가 어떤 해동을 선택 할지 정의합니다.
예를 들어 보행 로봇을 만들기 위해 강화학습 알고리즘을 많이 사용합니다. 딥마인드DeepMind의 알파고AlphaGo프로그램도 강화 학습의 좋은 예입니다. 2017년 5월 바둑 세계챔피언인 커제선수를 이겨서 신문의 헤드라인을 장식했습니다. 알파고는 수백만 개으이 게임을 분석해서 승리에 대한 전략을 학습했으며 자기 자신과 많은 게임을 했습니다. 알파고가 세계챔피언과 게임할 때는 학습 기능을 끄고 그동한 학습했던 전략을 적용한 것입니다.
1.3.2 배치 학습과 온라인 학습
머신러닝 시스템을 분류하는 데 사용하는 다른 기준은 입력 데이터의 스트림stream으로 부터 점진적으로 학습하 수 있는지 여부입니다.
배치 학습
배치 학습(batch learning)에서는 시스템의 점진적으로 학습할 수 없습니다. 가용한 데이터를 모두 사용해 훈련시켜야 합니다. 일반적으로 이 방식은 시간과 자원을 많이 소모하므로 보통 오프라인에서 수행됩니다. 먼저 시스템을 훈련시키고 그 다음 제품 시스템에 적용하면 더 이상의 학습없이 실행 됩니다. 즉, 학습한 것을 단지 적용만 합니다. 이를 오프라인 학습offline learning이라고 합니다.
배치 학습 시스템이 (새로운 종류의 스팸 같은) 새로운 데이터에 대해 학습하려면(새로운 데이터뿐만 아니라 이전 데이터도 포함한) 전체 데이터를 사용하여 시스템의 새로운 버전을 첨부터 다시 훈련해야 합니다. 그런 다음 이전 시스템을 중지시키고 새시스템으로 교체합니다.
다행이 머신러닝 시스템을 훈련, 평가, 론칭하는 전체 과정이 쉽게 자동화 될 수 있어서 배치 학습 시스템도 변화에 적응할 수 있습니다. 데이터를 업데이트하고 시스템의 새 버전을 필요한 만큼 자주 훈련시키면 됩니다.
이런 방식이 간단하고 잘 작동하지만 전체 데이터셋을 사용해 훈련하는데 몇 시간이 소요될 수 있습니다. 보통 24시간마다 또느 매주 시스템을 훈련시킵니다. 시스템이 빠르게 변하는데이터에 적응해야 한다면(예를 들면 주식가격)더 능동적인 방법이 필요합니다.
또한 전체 데이터셋을 사용해 훈련한다면 많은 컴퓨팅 장원이 필요합니다(CPU, 메모리 공간, 디스크 공간, 디스크IO, 네트워크IO 등). 대량의 데이터를 가지고 있는데 매일 처음부터 새로 훈련시키도록 시스템을 자동화한다면 큰 비용이 발생할 것입니다. 데이터 양이 아주 많으면 배치 학습 알고리즘을 사용하는게 불가능할 수도 있습니다.
마지막으로, 자원이 제한된 시스템(예를 들면 스마트폰 또는 화상 탐사 로버rover)이 스스로 학습해야 할 때 많은 양의 훈련 데이터를 나르고 학습을 위해 매일 몇 시간씩 많은 자원을 사용하면 심각한 문제를 일으킵니다.
이런 경우에는 점진적으로 학습할 수 있는 알고리즘을 사용하는 편이 낫습니다.
온라인 학습
온라인 학습online learning에서는 데이터를 순차적으로 한 개씩 또는 미니배치mini-batch라 부르는 작은 단위로 주입하여 시스템을 훈련시킵니다. 매 학습 단계가 빠르고 비용이 적게 들어 시스템은 데이터가 도착하는 대로 즉시 학습할 수 있습니다.
온라인 학습은 연속적으로 데이터를 받고 빠른 변화에 스스로 적응해야 하는 시스템에 적합합니다. 컴퓨팅 자원이 제한된 경우에도 좋은 선택입니다. 온라인 학습 시스템이 새로운 데이터 샘플을 학습하면 학습이 끝난 데이터는 더 이상 필요하지 않으므로 버리면 됩니다. 이렇게 되면 많은 공간을 절약할 수 있습니다.
컴퓨터 한 대의 메인 메모리에 들어갈 수 없는 아주 큰 데이터셋을 학습하는 시스템에도 온라인 학습 알고리즘을 사용할 수 있습니다.(이를 외부 메모리out-of-core 학습이라고 합니다). 알고리즘이 데이터 일부를 읽어 들이고 훈련 단계를 수행합니다. 전체 데이터가 모두 적용될 때까지 이 과정을 반복합니다.
CAUTION 이 경우 전체 프로세스는 보통 오프라인으로 실행됩니다(즉, 실시간 시스템에서 수행되는 것이 아닙니다). 그래서 온라인 학습 이라 이름이 혼란을 줄 수 있습니다. 점진적 학습incremental learning이라고 생각하세요.
온라인 학습 시스템에서 중요한 파라미터 하나는 변화하는 데이터에 얼마나 빠르게 적응할 것인지 입니다. 이를 학습률learning rate이라고 합니다. 학습률을 높게 하면 시스템이 데이터에 빠르게 적응하지만 예전 데이터를 금방 잊어버릴 것입니다(최근에 나타난 스팸의 종류만 걸러낼 수 있는 스팸 필터를 원할 리는 없습니다). 반대로 학습률이 낮으면 시스템의 관성이 더 커져서 더 느리게 학습됩니다. 하지만 새로운 데이터에 있는 잡음이나 대표성 없는 데이터 포인트에 덜 민감해집니다.
온라인 학습에서 가장 큰 문제점은 시스템에 나쁜 데이터가 주입되었을 때 시스템 성능이 점진적으로 감소한다는 점입니다. 운영 중인 시스템이라면 고객이 눈치챌지 모릅니다. 예를 들어 로봇의 오작동 센서로부터, 혹은 검색 엔진을 속여 검색 결과 상위에 노출시키려는 누군가로부터 나쁜 데이터가 올 수 있습니다. 이런 위험을 줄이려면 시스템을 면밀히 모니터링하고 성능 감소가 감지되면 즉각 학습을 중지시켜야 합니다(가능하면 이전 운영 상태로 되돌립니다). 입력 데이터를 모니터링해서 비정상 데이터를 잡아낼 수도 있습니다(예를 들면 이상치 탐지 알고리즘을 사용해서).
1.3.3 사례 기반 학습과 모델 기반 학습
머신러닝 시스템은 어떻게 일반화되는가에 따라 분류할 수도 있습니다. 대부분의 머신러닝 작업은 예측을 만드는 것입니다. 이 말은 주어진 훈련 데이터로 학습하지만 훈련 데이터에서는 본적 없는 새로운 데이터로 일반화되어야 한다는 뜻입니다. 훈련 데이터에서 놀은 성능을 내를 것이 좋지만 그게 전부는 아닙니다. 진짜 목표는 새로운 샘플에 잘 작동하는 모델입니다.
일반화를 위한 두 가지 접근법은 사례 기반 학습과 모델 기반 학습입니다.
사례 기반 학습
아마도 가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 스팸 필터를 이러한 방식으로 만들면 사용자가 스팸이라고 지정한 메일과 동일한 모든 메일을 스팸으로 분류합니다. 최악의 방법은 아니지만 최선도 아닙니다.
스팸 메일과 동일한 메일을 스팸이라고 지정하는 대신 스팸 메일과 매우 유사한 메일을 구분하도록 스팸 필터를 프로그램할 수 있습니다. 이렇게 하려면 두 메일 사이의 유사도similarity를 측정해야 합니다. 두 메일 사이의 매우 간단한 유사도 측정 방법은 공통으로 포함한 단어의 수를 세는 것입니다. 스팸 메일과 공통으로 가지고 있는 단어가 많으면 스팸으로 분류합니다.
이를 사례 기반 학습instance-based learning 이라고 합니다. 시스템이 사례를 기억함으로써 학습합니다. 그리고 유사도 측정을 사용해 새로운 데이터에 일반화합니다.
모델 기반 학습
샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측에 사용하는 것입니다. 이를 모델 기반 학습model-based learning이라고 합니다.
예를 들어 돈이 사람을 행복하게 만드는지 알아본다고 가정합시다. OECD 웹사이트에서 더 나은 삷의 지표Better Life Index데이터와 IMF 웹사이트에서 1인당 GDP통계를 내려받습니다. 두 데이터 테이블을 합치고 1인당 GDP로 정렬합니다. 일부 국가를 무작위로 골라서 그래프를 그려봅시다.
여기서 어떤 경향을 볼 수 있습니다! 데이터가 흩어져 있지만(즉, 어느 정도 무작위성이 있지만) 삶의 만족도는 국가의 1인당 GDP가 증가할 수록 거의 선형으로 같이 올라갑니다. 그러므로 1인당 GDP의 선형 함수로 삶의 만족도를 모델링해보겠습니다. 이 단계를 모델 선택model selection이라고 합니다. 1인당 GDP라는 특성 하나를 가진 삶의 만족도에 대한 선형 모델linear model입니다.
이 모델은 두 개의 모델 파라미터을 가집니다. 이 모델 파라미터를 조정하여 어떤 선형 함수를 표현하는 모델을 얻을 수 있습니다.
모델을 사용하기 전에 @와 @을 정의해야 합니다. 모델의 최상의 성능을 내도록 하는 값을 어떻게 알 수 있을 까요? 이 질문에 대답하려면 측정 지표를 정해야 합니다. 모델이 얼마나 좋은지 측정하는 효용 함수utility function(또는 적합도 함수fitness function)를 정의하거나 얼마나 나쁜지 측정하는 비용 함수cost function를 정의할 수 있습니다. 선형 희귀에서는 보통 선형 모델의 예측과 훈련 데이터 사이의 거리를 재는 비용 함수를 사용합니다. 이 거리를 최소화하는 것이 목표 입니다.
여기에서 선형 휘귀Linear Regression알고리즘이 등장합니다. 알고리즘에 훈련 데이터를 공급하면 데이터에 가장 잘 맞는 선형 모델의 파라이멑를 찾습니다. 이를 모델을 훈련training시킨다고 말합니다. 이 경우에는 알고리즘의 최적의 파라미터로 @=4.85와 @=4.91*10-5을 찾습니다.
이제 이 모델을 사용해 예측을 할 수 있습니다. 예를 들어 OECD 데이터에 없는 키프로스 Cyprus 사람들이 얼마나 행복한지 알아보려면 이 모델을 사용해 예측할 수 있습니다. 키프로스의 1인당 GDP를 보면 22,587달러이므로 이를 모델에 적용해 4.85 + 22,587*4.91*10-5 = 5.96과 같이 삷의 만족도를 계산합니다.
NOTE 사례 기반의 학습 알고리즘을 사용한다면 먼저 1인당 GDP가 키프로스와 가장 가까운 슬로베니아 Slovenia(20,732달러)를 찾습니다. OECD데이터 있는 슬로베니아의 삶의 만족도가 5.7로 예측합니다. 조금 더 확대해서 그 다음으로 가까운 두 나라를 더 고려하면 삶의 만족도가 5.1과 6.5인 포르투갈과 스페인이 있습니다. 이 세값을 평균하면 모델 기반의 예측과 매우 비슷한 5.77이 됩니다. 이 간단한 알고리즘을 k-최근접 이웃k-Nearest Neighbors 희귀라고 합니다(여기서 k = 3입니다).
이전 코드에서 선형 희귀모델을 k-최근접 이웃 희귀로 바꾸려면 아래 한줄을
model = sklearn.linear_model.LinearRegression() 다음과 같이 바꾸면 됩니다.
model = sklearn.neighbors.KNeighborsRegressor(n)neighbors=3)
모든 게 다 잘되면 모델은 좋은 예측을 내놓을 것입니다. 아니면 더 많은 특성(고용률, 건강, 대기오염 등)을 사용하거나, 좋은 훈련 데이터를 더 많이 모으거나, 더 강력한 모델(예를 들면 다항 휘귀모델)을 선택해야 할지 모릅니다.
지금까지의 작업을 요약해 보겠습니다.
- 데이터를 분석합니다.
- 모델을 선택합니다.
- 훈련 데이터로 모델을 훈련시킵니다(즉, 학습 알고리즘이 비용 함수를 최소화하는 모델 파라미터를 찾습니다).
- 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고(이를 추론inference이라고 합니다). 이 모델이 잘 일반화 되길 기대합니다.
이것이 전형적인 머신러닝 프로젝트의 형태입니다. 2장에서 완전한 프로젝트를 진행하면서 직접 경험해볼 것 입니다.
지금까지 많은 부분을 다뤘습니다. 머신러닝이 무엇인지, 왜 유용한지, 머신러닝 시스템이 가장 일반적인 분류는 무엇인지, 그리고 전형적인 머신러닝 프로젝트의 작업 흐름이 어떤지 배웠습니다. 다음 절에서는 학습 과정에서 발생할 수 있는 문제와 정확한 예측을 방해하는 것들에 대해 알아보겠습니다.
- 사람이 감독 하에 훈련하는 거신지 그렇지 않은 것인지(지도, 비지도, 준지도, 강화 학습)
- 실시간으로 점진적인 학습을 하는지 아닌지(온라인 학습과 배치학습)
- 단순하게 알고 있는 데이터 포인트와 새 데이터 포인트를 비교하는 것인지 아니면 훈련 데이터셋에서 과학자들처럼 패턴을 발견하여 예측 모델을 만드는지(사례 기반 학습과 모델 기반 학습)
이 범주들은 서로 배타적이지 않으며 원하는 대로 연결할 수 있습니다. 예를 들어 최첨단 스팸 필터가 심층 신경망 모델을 사용해 스팸과 스팸이 아닌 페일로부터 실시간으로 학습할 지도 모릅니다. 그렇다면 이 스스템은 온라인이고 모델 기반이며 지도 학습 시스템입니다.
이 범주들을 조금 더 차세히 들여다보겠습니다.
1.3.1 지도 학습과 비지도 학습
머신러닝 시스템을 '학습하는 동안의 감독 형태나 정보량'에 따라 분류할 수 있습니다. 지도 학습, 비지도 학습, 준지도 학습, 강화 학습 등 네 가지 주요 범주가 있습니다.
지도학습
지도 학습supervised learning에는 알고리즘에 주입하는 훈련 데이터에 레이블label이라는 원하는 답이 포함됩니다.
분류classification가 전형적인 지도 학습 작업이며, 스팸 필터가 좋은 예입니다. 스팸 필터는 많은 메일 샘플과 소속 정보(스팸인지 아닌지)로 훈련되어야 하며 어떻게 새 메일을 분류할지 학습해야 합니다.
또 다른 전형적인 작업은 예측 변수predictor variable라 부르는 특성feature(주행거리, 연식, 브랜드 등)을 사용해 중고차 가격 같은 타긱 수치를 예측하는 것입니다. 이런 종류의 작업을 휘귀regression라고 부릅니다. 시스템을 훈련시키려면 예측 변수와 레이블(중고차 가격)이 포함된 중고차 데이터가 많이 필요합니다.
NOTE 머신러닝에서 속성(attribute)은 데이터 타입(예를 들면 주행거리)을 말합니다. 특성은 문맥에 따라 여러 의미를 갖지만 일반적으로 속성과 값이 합쳐진 것을 의미합니다.(예를 들면 주행거리=15,000). 하지만 많은 사람이 속성과 특성을 구분하지 않고 사용합니다.
일부 희귀 알고리즘은 분류에 사용할 수도 있고 또 반대의 경우도 있습니다. 옐르 들어 분류에 널리 쓰이는 로지스틱 희귀는 클래스에 속할 확률을 출력합니다(예를 들면 스팸일 가능성 20%).
다음은 가장 중요한 지도 학습 알고리즘들입니다
- k-최근접 이웃k-Nearest Neighbors
- 선형 희귀(Linear Regression)
- 로지스틱 희귀(Logistic Regression)
- 서포트 벡터 머신(Support Vector Machines SVM)
- 결정트리(Decision Tree)와 랜덤 포레스트(Random Forests)
- 신경망(Neural networks)
비지도 학습
비지도 학습(unsupervised learning)에는 말 그대로 훈련 데이터에 레이블이 없습니다. 시스템이 아무런 도움 없이 학습해야 합니다.
다음은 가장 중요한 비지도 학습 알고리즘 입니다.
- 군집(Clustering)
- k-평균(k-Means)
- 계층 군집 분석(Hierarchical Cluster Analysis. HCA)
- 기댓값 최대화(Expectaion Maximization)
- 시각화(visualization)와 차원 축소(dimensionality reduction)
- 주성분 분석(Principal Component Analysis. PCA)
- 커널(kernel)PCA
- 지역적 선형 임베딩(Locally-Linear Embedding. LLE)
- t-SNE (t-distributed Stochastic Neighbor Embedding)
- 연관 규칙 학습(Association rule learning)
- 어프라이어리(Apriori)
- 이클렛(Eclat)
예를 들어 블로그 방문자에 대한 데이터가 많이 있다고 합시다. 비슷한 방문자들을 그룹으로 묶기 위해 군집 알고리즘을 적용하려 합니다. 하지만 방문자가 어떤 그룹에 속하는지 알고리즘에 알려줄 수 있는 데이터 포이트가 없습니다. 그래서 알고리즘이 스스로 방문자 사이의 연결고리를 찾습니다. 예를 들어 40%의 방문자가 만화책을 좋아하며 저녁때 블로그 글을 읽는 남성이, 20%는 주말에 방문하는 공상 과학을 좋아하는 젋은 사람임을 알게 될지도 모릅니다. 계층 군집(hierachical clustering)알고리즘을 사용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있습니다. 그러면 각 그룹에 맞춰 블로그에 글을 쓰는데 도움이 될 것입니다.
시각화(visualization)알고리즘도 비지도 학습 알고리즘의 좋은 예입니다. 레이블이 없는 대규모의 데이터를 넣으면 도식화가 가능한 2D나 3D 표현을 만들어 줍니다. 이런 알고리즘은 가능한 한 구조를 그대로 유지하려 하므로(예를 들어 입력 공간에서 떨어져 있던 클러스트(cluster)는 시각화된 그래프에서 겹쳐지지 않게 유지됩니다) 데이터가 어떻게 조직되어 있는지 이해할 수 있고 예상하지 못한 패턴을 발견할 수도 있습니다.
비슷한 작업으로는 너무 많은 정보를잃지 않으면서 데이터를 간소화하려는 차원 축소(dimensionlity reduction)가 있습니다. 이렇게 하는 한가지 방법은 상관관계가 있는 여러 특성을 하나로 합치는 것입니다. 예를 들어 차의 주행거리가 연식과 매우 연관되어 있으므로 차원 축소 알고리즘으로 두 특성을 차의 마모 정도를 나타내는 하나의 특성으로 합칠 수 있습니다. 이를 특성 추출(feature extraction)이라고 합니다.
TIP (지도 학습 알고리즘 같은) 머신러닝 알고리즘에 데이터를 주입하기 전에 차원 축소 알고리즘을 사용하여 훈련 데이터의 차원을 줄이는 것이 유용할 때가 많습니다. 살행 속도가 훨씬 빨라지고 디스크와 메모리를 차지하는 공간도 줄고 경우에 따라 성능이 좋아지기도 합니다.
또 하나의 중요한 비지도 학습은 이상치 탐지(anomaly detection)입니다. 예를 들어 부정 거래를 막기 위해 이상한 신용카드 거래를 감지하고, 제조 결함을 잡아내고, 학습 알고리즘에 주입하기전에 데이터셋에서 이상한 값을 자동으로 제거하는 것 등입니다. 시스템은 정상 샘플로 훈련되고, 새로운 샘플이 정상 데이터인지 혹은 이상치인지 판단합니다.
널리 사용되는 또 다른 비지도 학습은 대량의 데이터에서 특성 간의 흥미로운 관계를 찾는 연관 규칙 학습(association rule learning)입니다. 예를 들어 여러분의 슈퍼마켓을 운영한다고 가정합시다. 판매 기록에 연관 규칙을 적용하면 바비규 소스와 감자를 구매한 사람이 스테이크도 구매하는 경향이 있다는 것을 찾을지도 모릅니다.
준지도 학습
어떤 알고리즘은 레이블이 일부만 있는 데이터도 다룰 수 있습니다. 보통은 레이블이 없는 데이터가 많고 레이블이 있는 데이터는 아주 조금입니다. 이를 준지도 학습(semisupervised learning)이라고 합니다.
구글 포토 호스팅 서비스가 좋은 예입니다. 이 서비스에 가족 사진을 모두 올리면 사람 A는 사진1, 5, 11에 있고, 사람 B는 사진 2, 5, 7에 있다고 자동으로 인식합니다. 이는 비지도학습(군집)입니다. 이제 시스템에 필요한 것은 이 사람들이 누구인가 하는 정보입니다. 사람마다 레이블이 하나씩만 주어지면 사진에 있는 모든 사람의 이름을 알 수 있고, 편리하게 사진을 찾을 수 있습니다.
대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있습니다. 예를 들어 심층 신뢰 신경망 deep belief network (DBN)은 여러 겹으로 쌓은 제한된 볼츠만머신 restricted Bolzmann machine(RBM)이라 불리는 비지도 학습에 기초합니다. RBM이 비지도 학습 장식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조정됩니다.
강화 학습
강화 학습(Reinforcement learning)은 매우 다른 종류의 알고리즘입니다. 여기서느 학습하는 시스템을 에이전트라고 부르며 환경environment을 관찰해서 해동action을 실행하고 그 결과로 보상reward(또는 부정적인 보상에 해당하는 벌점 penalty)을 받습니다. 시간이 지나면서 가장 큰 보상을 얻기 위해 정책policy이라고 부르는 최상의 전략을 스스로 학습합니다. 정책은 주어진 상황에서 에이전트가 어떤 해동을 선택 할지 정의합니다.
예를 들어 보행 로봇을 만들기 위해 강화학습 알고리즘을 많이 사용합니다. 딥마인드DeepMind의 알파고AlphaGo프로그램도 강화 학습의 좋은 예입니다. 2017년 5월 바둑 세계챔피언인 커제선수를 이겨서 신문의 헤드라인을 장식했습니다. 알파고는 수백만 개으이 게임을 분석해서 승리에 대한 전략을 학습했으며 자기 자신과 많은 게임을 했습니다. 알파고가 세계챔피언과 게임할 때는 학습 기능을 끄고 그동한 학습했던 전략을 적용한 것입니다.
1.3.2 배치 학습과 온라인 학습
머신러닝 시스템을 분류하는 데 사용하는 다른 기준은 입력 데이터의 스트림stream으로 부터 점진적으로 학습하 수 있는지 여부입니다.
배치 학습
배치 학습(batch learning)에서는 시스템의 점진적으로 학습할 수 없습니다. 가용한 데이터를 모두 사용해 훈련시켜야 합니다. 일반적으로 이 방식은 시간과 자원을 많이 소모하므로 보통 오프라인에서 수행됩니다. 먼저 시스템을 훈련시키고 그 다음 제품 시스템에 적용하면 더 이상의 학습없이 실행 됩니다. 즉, 학습한 것을 단지 적용만 합니다. 이를 오프라인 학습offline learning이라고 합니다.
배치 학습 시스템이 (새로운 종류의 스팸 같은) 새로운 데이터에 대해 학습하려면(새로운 데이터뿐만 아니라 이전 데이터도 포함한) 전체 데이터를 사용하여 시스템의 새로운 버전을 첨부터 다시 훈련해야 합니다. 그런 다음 이전 시스템을 중지시키고 새시스템으로 교체합니다.
다행이 머신러닝 시스템을 훈련, 평가, 론칭하는 전체 과정이 쉽게 자동화 될 수 있어서 배치 학습 시스템도 변화에 적응할 수 있습니다. 데이터를 업데이트하고 시스템의 새 버전을 필요한 만큼 자주 훈련시키면 됩니다.
이런 방식이 간단하고 잘 작동하지만 전체 데이터셋을 사용해 훈련하는데 몇 시간이 소요될 수 있습니다. 보통 24시간마다 또느 매주 시스템을 훈련시킵니다. 시스템이 빠르게 변하는데이터에 적응해야 한다면(예를 들면 주식가격)더 능동적인 방법이 필요합니다.
또한 전체 데이터셋을 사용해 훈련한다면 많은 컴퓨팅 장원이 필요합니다(CPU, 메모리 공간, 디스크 공간, 디스크IO, 네트워크IO 등). 대량의 데이터를 가지고 있는데 매일 처음부터 새로 훈련시키도록 시스템을 자동화한다면 큰 비용이 발생할 것입니다. 데이터 양이 아주 많으면 배치 학습 알고리즘을 사용하는게 불가능할 수도 있습니다.
마지막으로, 자원이 제한된 시스템(예를 들면 스마트폰 또는 화상 탐사 로버rover)이 스스로 학습해야 할 때 많은 양의 훈련 데이터를 나르고 학습을 위해 매일 몇 시간씩 많은 자원을 사용하면 심각한 문제를 일으킵니다.
이런 경우에는 점진적으로 학습할 수 있는 알고리즘을 사용하는 편이 낫습니다.
온라인 학습
온라인 학습online learning에서는 데이터를 순차적으로 한 개씩 또는 미니배치mini-batch라 부르는 작은 단위로 주입하여 시스템을 훈련시킵니다. 매 학습 단계가 빠르고 비용이 적게 들어 시스템은 데이터가 도착하는 대로 즉시 학습할 수 있습니다.
온라인 학습은 연속적으로 데이터를 받고 빠른 변화에 스스로 적응해야 하는 시스템에 적합합니다. 컴퓨팅 자원이 제한된 경우에도 좋은 선택입니다. 온라인 학습 시스템이 새로운 데이터 샘플을 학습하면 학습이 끝난 데이터는 더 이상 필요하지 않으므로 버리면 됩니다. 이렇게 되면 많은 공간을 절약할 수 있습니다.
컴퓨터 한 대의 메인 메모리에 들어갈 수 없는 아주 큰 데이터셋을 학습하는 시스템에도 온라인 학습 알고리즘을 사용할 수 있습니다.(이를 외부 메모리out-of-core 학습이라고 합니다). 알고리즘이 데이터 일부를 읽어 들이고 훈련 단계를 수행합니다. 전체 데이터가 모두 적용될 때까지 이 과정을 반복합니다.
CAUTION 이 경우 전체 프로세스는 보통 오프라인으로 실행됩니다(즉, 실시간 시스템에서 수행되는 것이 아닙니다). 그래서 온라인 학습 이라 이름이 혼란을 줄 수 있습니다. 점진적 학습incremental learning이라고 생각하세요.
온라인 학습 시스템에서 중요한 파라미터 하나는 변화하는 데이터에 얼마나 빠르게 적응할 것인지 입니다. 이를 학습률learning rate이라고 합니다. 학습률을 높게 하면 시스템이 데이터에 빠르게 적응하지만 예전 데이터를 금방 잊어버릴 것입니다(최근에 나타난 스팸의 종류만 걸러낼 수 있는 스팸 필터를 원할 리는 없습니다). 반대로 학습률이 낮으면 시스템의 관성이 더 커져서 더 느리게 학습됩니다. 하지만 새로운 데이터에 있는 잡음이나 대표성 없는 데이터 포인트에 덜 민감해집니다.
온라인 학습에서 가장 큰 문제점은 시스템에 나쁜 데이터가 주입되었을 때 시스템 성능이 점진적으로 감소한다는 점입니다. 운영 중인 시스템이라면 고객이 눈치챌지 모릅니다. 예를 들어 로봇의 오작동 센서로부터, 혹은 검색 엔진을 속여 검색 결과 상위에 노출시키려는 누군가로부터 나쁜 데이터가 올 수 있습니다. 이런 위험을 줄이려면 시스템을 면밀히 모니터링하고 성능 감소가 감지되면 즉각 학습을 중지시켜야 합니다(가능하면 이전 운영 상태로 되돌립니다). 입력 데이터를 모니터링해서 비정상 데이터를 잡아낼 수도 있습니다(예를 들면 이상치 탐지 알고리즘을 사용해서).
1.3.3 사례 기반 학습과 모델 기반 학습
머신러닝 시스템은 어떻게 일반화되는가에 따라 분류할 수도 있습니다. 대부분의 머신러닝 작업은 예측을 만드는 것입니다. 이 말은 주어진 훈련 데이터로 학습하지만 훈련 데이터에서는 본적 없는 새로운 데이터로 일반화되어야 한다는 뜻입니다. 훈련 데이터에서 놀은 성능을 내를 것이 좋지만 그게 전부는 아닙니다. 진짜 목표는 새로운 샘플에 잘 작동하는 모델입니다.
일반화를 위한 두 가지 접근법은 사례 기반 학습과 모델 기반 학습입니다.
사례 기반 학습
아마도 가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 스팸 필터를 이러한 방식으로 만들면 사용자가 스팸이라고 지정한 메일과 동일한 모든 메일을 스팸으로 분류합니다. 최악의 방법은 아니지만 최선도 아닙니다.
스팸 메일과 동일한 메일을 스팸이라고 지정하는 대신 스팸 메일과 매우 유사한 메일을 구분하도록 스팸 필터를 프로그램할 수 있습니다. 이렇게 하려면 두 메일 사이의 유사도similarity를 측정해야 합니다. 두 메일 사이의 매우 간단한 유사도 측정 방법은 공통으로 포함한 단어의 수를 세는 것입니다. 스팸 메일과 공통으로 가지고 있는 단어가 많으면 스팸으로 분류합니다.
이를 사례 기반 학습instance-based learning 이라고 합니다. 시스템이 사례를 기억함으로써 학습합니다. 그리고 유사도 측정을 사용해 새로운 데이터에 일반화합니다.
모델 기반 학습
샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측에 사용하는 것입니다. 이를 모델 기반 학습model-based learning이라고 합니다.
예를 들어 돈이 사람을 행복하게 만드는지 알아본다고 가정합시다. OECD 웹사이트에서 더 나은 삷의 지표Better Life Index데이터와 IMF 웹사이트에서 1인당 GDP통계를 내려받습니다. 두 데이터 테이블을 합치고 1인당 GDP로 정렬합니다. 일부 국가를 무작위로 골라서 그래프를 그려봅시다.
여기서 어떤 경향을 볼 수 있습니다! 데이터가 흩어져 있지만(즉, 어느 정도 무작위성이 있지만) 삶의 만족도는 국가의 1인당 GDP가 증가할 수록 거의 선형으로 같이 올라갑니다. 그러므로 1인당 GDP의 선형 함수로 삶의 만족도를 모델링해보겠습니다. 이 단계를 모델 선택model selection이라고 합니다. 1인당 GDP라는 특성 하나를 가진 삶의 만족도에 대한 선형 모델linear model입니다.
이 모델은 두 개의 모델 파라미터을 가집니다. 이 모델 파라미터를 조정하여 어떤 선형 함수를 표현하는 모델을 얻을 수 있습니다.
모델을 사용하기 전에 @와 @을 정의해야 합니다. 모델의 최상의 성능을 내도록 하는 값을 어떻게 알 수 있을 까요? 이 질문에 대답하려면 측정 지표를 정해야 합니다. 모델이 얼마나 좋은지 측정하는 효용 함수utility function(또는 적합도 함수fitness function)를 정의하거나 얼마나 나쁜지 측정하는 비용 함수cost function를 정의할 수 있습니다. 선형 희귀에서는 보통 선형 모델의 예측과 훈련 데이터 사이의 거리를 재는 비용 함수를 사용합니다. 이 거리를 최소화하는 것이 목표 입니다.
여기에서 선형 휘귀Linear Regression알고리즘이 등장합니다. 알고리즘에 훈련 데이터를 공급하면 데이터에 가장 잘 맞는 선형 모델의 파라이멑를 찾습니다. 이를 모델을 훈련training시킨다고 말합니다. 이 경우에는 알고리즘의 최적의 파라미터로 @=4.85와 @=4.91*10-5을 찾습니다.
이제 이 모델을 사용해 예측을 할 수 있습니다. 예를 들어 OECD 데이터에 없는 키프로스 Cyprus 사람들이 얼마나 행복한지 알아보려면 이 모델을 사용해 예측할 수 있습니다. 키프로스의 1인당 GDP를 보면 22,587달러이므로 이를 모델에 적용해 4.85 + 22,587*4.91*10-5 = 5.96과 같이 삷의 만족도를 계산합니다.
NOTE 사례 기반의 학습 알고리즘을 사용한다면 먼저 1인당 GDP가 키프로스와 가장 가까운 슬로베니아 Slovenia(20,732달러)를 찾습니다. OECD데이터 있는 슬로베니아의 삶의 만족도가 5.7로 예측합니다. 조금 더 확대해서 그 다음으로 가까운 두 나라를 더 고려하면 삶의 만족도가 5.1과 6.5인 포르투갈과 스페인이 있습니다. 이 세값을 평균하면 모델 기반의 예측과 매우 비슷한 5.77이 됩니다. 이 간단한 알고리즘을 k-최근접 이웃k-Nearest Neighbors 희귀라고 합니다(여기서 k = 3입니다).
이전 코드에서 선형 희귀모델을 k-최근접 이웃 희귀로 바꾸려면 아래 한줄을
model = sklearn.linear_model.LinearRegression() 다음과 같이 바꾸면 됩니다.
model = sklearn.neighbors.KNeighborsRegressor(n)neighbors=3)
모든 게 다 잘되면 모델은 좋은 예측을 내놓을 것입니다. 아니면 더 많은 특성(고용률, 건강, 대기오염 등)을 사용하거나, 좋은 훈련 데이터를 더 많이 모으거나, 더 강력한 모델(예를 들면 다항 휘귀모델)을 선택해야 할지 모릅니다.
지금까지의 작업을 요약해 보겠습니다.
- 데이터를 분석합니다.
- 모델을 선택합니다.
- 훈련 데이터로 모델을 훈련시킵니다(즉, 학습 알고리즘이 비용 함수를 최소화하는 모델 파라미터를 찾습니다).
- 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고(이를 추론inference이라고 합니다). 이 모델이 잘 일반화 되길 기대합니다.
이것이 전형적인 머신러닝 프로젝트의 형태입니다. 2장에서 완전한 프로젝트를 진행하면서 직접 경험해볼 것 입니다.
지금까지 많은 부분을 다뤘습니다. 머신러닝이 무엇인지, 왜 유용한지, 머신러닝 시스템이 가장 일반적인 분류는 무엇인지, 그리고 전형적인 머신러닝 프로젝트의 작업 흐름이 어떤지 배웠습니다. 다음 절에서는 학습 과정에서 발생할 수 있는 문제와 정확한 예측을 방해하는 것들에 대해 알아보겠습니다.
피드 구독하기:
글 (Atom)