행위

"핸즈온 머신러닝(2판)(책)"의 두 판 사이의 차이

라이언의 꿀팁백과

 
(사용자 2명의 중간 판 12개는 보이지 않습니다)
147번째 줄: 147번째 줄:




이 방법은 일반적으로 잘 작동함. 하지만 검증 세트가 너무 작으면 모델이 정확하게 평가되지 않음. 최적이 아닌 모델을 잘못 선택할 수 있음. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 이것이 문제가 되는 이유는 최종 모델이 전체 훈련 세트에서 훈련되기 때문에 너무 작은 훈련 세트에서 훈련한 후보 모델을 비교하는 것은 이상적이지 않음. 이는 마치 마라톤에 참여하기 위해 가장 빠른 단거리 주자를 고르는 것과 같음. 이 문제를 해결하는 한 가지 방법은 작은 검증 세트를 여러 개를 사용해 반복적인 교차 검증(cross-validation)을 수행하는 것. 검증 세트마다 나머지 데이터에서 훈련한 모델을 해당 검증 세트에서 평가함. 모든 모델의 평가를 평균하면 훨씬 정확한 성능을 측정할 수 있음. 하지만 단점도 있ㅇ므. 훈련 시간이 검증 세트의 개수에 비례해 늘어남.
이 방법은 일반적으로 잘 작동함. 하지만 검증 세트가 너무 작으면 모델이 정확하게 평가되지 않음. 최적이 아닌 모델을 잘못 선택할 수 있음. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 이것이 문제가 되는 이유는 최종 모델이 전체 훈련 세트에서 훈련되기 때문에 너무 작은 훈련 세트에서 훈련한 후보 모델을 비교하는 것은 이상적이지 않음. 이는 마치 마라톤에 참여하기 위해 가장 빠른 단거리 주자를 고르는 것과 같음. 이 문제를 해결하는 한 가지 방법은 작은 검증 세트를 여러 개를 사용해 반복적인 교차 검증(cross-validation)을 수행하는 것. 검증 세트마다 나머지 데이터에서 훈련한 모델을 해당 검증 세트에서 평가함. 모든 모델의 평가를 평균하면 훨씬 정확한 성능을 측정할 수 있음. 하지만 단점도 있음. 훈련 시간이 검증 세트의 개수에 비례해 늘어남.
====훈련-개발 세트(train-dev set)====
====훈련-개발 세트(train-dev set)====
훈련 사진의 일부를 떼어내어 또 다른 세트를 만드는 것을 (앤드루 웅 Andrew Ng은) 이를 '''훈련-개발 세트(train-dev set)'''라고 부름. 모델을 (훈련-개발 세트가 아니라 훈련 세트에서) 훈련한 다음 훈련-개발 세트에서 평가함.. 모델이 잘 작동하면 훈련 세트에 과대적합된 것이 아님. 이 모델이 검증 세트에서 나쁜 성능을 낸다면 이 문제는 데이터 불일치에서 오는 것. 반대로 모델이 훈련-개발 세트에서 잘 작동하지 않는다면 이는 훈련 세트에 과대적합된 것. 따라서 모델을 규제하거나 더 많은 훈련 데이터를 모으거나 훈련 데이터 정제를 시도해봐야 함.
훈련 사진의 일부를 떼어내어 또 다른 세트를 만드는 것을 (앤드루 웅 Andrew Ng은) 이를 '''훈련-개발 세트(train-dev set)'''라고 부름. 모델을 (훈련-개발 세트가 아니라 훈련 세트에서) 훈련한 다음 훈련-개발 세트에서 평가함.. 모델이 잘 작동하면 훈련 세트에 과대적합된 것이 아님. 이 모델이 검증 세트에서 나쁜 성능을 낸다면 이 문제는 데이터 불일치에서 오는 것. 반대로 모델이 훈련-개발 세트에서 잘 작동하지 않는다면 이는 훈련 세트에 과대적합된 것. 따라서 모델을 규제하거나 더 많은 훈련 데이터를 모으거나 훈련 데이터 정제를 시도해봐야 함.
158번째 줄: 158번째 줄:
* 테스트 세트를 생성하는 일은 이론적으로는 간단함. 무작위로 어떤 샘플을 선택해서 데이터셋의 20% 정도를(또는 데이터셋이 매우 크다면 그보다 적게) 떼어놓으면 됨.
* 테스트 세트를 생성하는 일은 이론적으로는 간단함. 무작위로 어떤 샘플을 선택해서 데이터셋의 20% 정도를(또는 데이터셋이 매우 크다면 그보다 적게) 떼어놓으면 됨.
*책에 있는 test_set_check 함수는 인덱스 값 0부터 20639까지의 값을 crc32 함수로 변환한 후, 단순히  0.2 * 2^32 값보다 작으면 True, 같거나 크면 False를 리턴하는 함수이다. 그런데 이렇게 코드를 작성하면 약 20% 정도의 인덱스 값만 True로 설정이 되는데 왜 그런지 잘 모르겠다. 일단 넘어가자.
*책에 있는 test_set_check 함수는 인덱스 값 0부터 20639까지의 값을 crc32 함수로 변환한 후, 단순히  0.2 * 2^32 값보다 작으면 True, 같거나 크면 False를 리턴하는 함수이다. 그런데 이렇게 코드를 작성하면 약 20% 정도의 인덱스 값만 True로 설정이 되는데 왜 그런지 잘 모르겠다. 일단 넘어가자.
**강사님께 물어봤더니 본인은 실제 사용하지 않을 내용이기 때문에 그냥 보지 않고 넘어갔다고 함.


=== 데이터 이해를 위한 탐색과 시각화 ===
=== 데이터 이해를 위한 탐색과 시각화 ===


* 훈련 세트가 매우 크면 조작을 간단하고 빠르게 하기 위해 탐색을 위한 세트를 별도로 샘플링할 수도 있음.
* 훈련 세트가 매우 크면 조작을 간단하고 빠르게 하기 위해 탐색을 위한 세트를 별도로 샘플링 할 수도 있음.
*상관관계는 선형적인 상관관계만 측정함. 그래서 비선형적인 관계는 잡을 수 없음.
*특성 사이의 상관관계를 확인하는 다른 방법은 숫자형 특성 사이에 산점도를 그려주는 판다스의 scatter_matrix 함수를 사용하는 것
*대부분의 소프트웨어 프로젝트가 그렇지만 특히 머신러닝 프로젝트는 '''빠른 프로토타이핑'''과 '''반복적인 프로세스'''가 권장됨
 
=== 머신러닝 알고리즘을 위한 데이터 준비 ===
머신러닝 알고리즘을 위해 데이터를 준비해야하는데, 이 작업은 수동으로 하는 것보다는 함수 등을 만들어 자동화 해야 하는데 그 이유는 아래와 같음.
 
* 어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복할 수 있음(예를 들어, 다음 번에 새로운 데이터셋을 사용)
* 향후 프로젝트에 사용할 수 있는 변환 라이브러리를 점진적으로 구축하게 됨
* 실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 변환시키는 데 이 함수를 사용할 수 있음
* 여러 가지 데이터 변환을 쉽게 시도해 볼 수 있고 어떤 조합이 가장 좋은지 확인하는 데 편리
*대부분의 머신러닝 알고리즘은 숫자를 다루므로 텍스트는 숫자로 바꿔야 함
== 정리 3일차 ==
2022년 8월 10일에 정리한 내용
 
=== 머신러닝 알고리즘을 위한 데이터 준비 (cont.) ===
 
*모든 특성의 범위를 같도록 만들어주는 방법으로 '''min-max 스케일링'''과 '''표준화(standardization)'''가 널리 사용됨
** min-max 스케일링은 많은 사람이 '''정규화(normalization)'''라고 부름
**이를 위해 사이킷런에는 MinMaxScaler 변환기와 StandardScaler를 제공함
*min-max 스케일링 : ① 0 ~ 1 범위에 들도록 값을 이동하고 스케일링을 조정 ② 데이터에서 최솟값을 뺀 후 최댓값과 최소값의 차이로 나눔
*표준화 : ① 먼저 평균을 뺌 (그래서 표준화를 하면 항상 평균이 0이 됨) ②  표준편차로 나누어 결과 분포의 분산이 1이 되게 함**min-max 스케일링과 달리 표준화는 범위의 상한과 하한이 없어 어떤 알고리즘에서는 문제가 될 수 있음 (예 : 신경망은 종종 입력값의 범위로 0 ~ 1 사이를 기대함)
**그러나 표준화는 이상치에 영향을 덜 받음
*'''모든 변환기에서 스케일링은 (테스트 세트가 포함된) 전체 데이터가 아니고 훈련 데이터에 대해서만 fit() 메소드를 적용해야 함. 그런 다음 훈련 세트와 테스트 세트(그리고 새로운 데이터)에 대해 transform() 메서드를 사용함'''
*현재 사용 중인 Scikit-learn 버전을 확인하는 코드는 아래와 같다.  <br /><br />
 
<syntaxhighlight lang="python3" line="1">
import sklearn
print(sklearn.__version__)
</syntaxhighlight>
 
*'''앙상블 학습 :''' 여러 다른 모델을 모아서 하나의 모델로 만드는 학습 방법
*과대적합을 해결하는 방법
**모델을 간단히 한다
**제한을 한다 (즉, 규제)
**더 많은 훈련 데이터를 모은다
*랜덤 포레스트를 더 깊이 들어가기 전에, 여러 종류의 머신러닝 알고리즘으로 하이퍼파라미터 조정에 너무 많은 시간을 들이지 않으면서 다양한 모델(다양한 커널의 서포트 백터 머신, 신경망 등)을 시도해봐야 합니다.
 
=== 모델 세부 튜닝 ===
가능성 있는 모델을 추렸다면 이 모델들을 세부 튜닝해야 하는데 아래와 같은 방법을 활용할 수 있음
 
==== 그리드 탐색 ====
 
* 만족할 만한 하이퍼파라미터 조합을 찾을 때까지 수동으로 하이퍼파라미터를 조정
* 사이킷런의 GridSearchCV를 사용하면 간단함
 
==== 랜덤 탐색 ====
 
* 하이퍼파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 게 좋음.
* RandomizedSearchCV는 GridSearchCV와 거의 같은 방식으로 사용하지만 가능한 모든 조합을 시도하는 대신 각 반복하다 하이퍼파라미터에 임의의 수를 대입하여 지정한 횟수만큼 평가함
* 이 방식의 주요 장점은 다음 두 가지 임
** 랜덤 탐색을 1,000회 반복하도록 실행하면 하이퍼파라미터마다 각기 다른 1,000개의 값을 탐색함 (그리드 탐색에서는 하이퍼파라미터마다 몇 개의 값만 탐색)
** 단순히 반복 횟수를 조절하는 것만으로 하이퍼파라미터 탐색에 투입할 컴퓨팅 자원을 제어할 수 있음
 
==== 앙상블 방법 ====
 
* 모델을 세밀하게 튜닝하는 또 다른 방법은 최상의 모델을 연결해보는 것
* 모델의 그룹(또는 앙상블 ensemble)이 최상의 단일 모델보다 더 나은 성능을 발휘할 때가 많음
 
==== 최상의 모델과 오차 분석 ====
 
* 최상의 모델을 분석하여 문제에 대한 통찰력을 얻어서 최적화를 함 (예 : 덜 중요한 특성 제외)
 
==== 론칭, 모니터링, 시스템 유지 보수 ====
 
* 어떤 방식이든 모니터링 시스템을 준비해야 합니다. (운영 중인 모델을 평가하기 위해 평가자를 사용하든 하용하지 않든).
* 또한 모델이 실패했을 때 무엇을 할지 정의하고 어떻게 대비할지 관련 프로세스를 모두 준비해야 합니다.
* 데이터가 계속 변화하면 데이터셋을 업데이트하고 모델을 정기적으로 다시 훈련해야 합니다.
* 전체 과정에서 가능한 한 많은 것을 자동화해야 합니다. 다음은 자동화할 수 있는 일부 작업입니다.
** 정기적으로 새로운 데이터를 수집하고 레이블을 답니다 (예 : 조사원 활용)
** 모델을 훈련하고 하이퍼파라미터를 자동으로 세부 튜닝하는 스크립트를 작성 (작업에 따라 매일 또는 매주 자동으로 이 스크립트를 실행할 수 있음)
** 업데이트된 테스트 세트에서 새로운 모델과 이전 모델을 평가하는 스크립트를 하나 더 작성합니다. 성능이 감소하지 않으면 새로운 모델을 제품에 배포합니다. (성능이 나쁘다면 왜 그런지 조사합니다)
* 또한 모델의 입력 데이터 품질으 평가해야 합니다.
* 마지막으로 만든 모델을 백업(backup)해야 합니다. 새로운 모델이 어떤 이유로 올바르지 않게 작동하는 경우 이전 모델로 빠르게 롤백(rollback)하기 위한 절차와 도구를 준비합니다.
 
==== 요약 ====
머신러닝 프로젝트 대부분의 작업은 아래 단계로 이루어짐
 
# 데이터 준비 단계
# 모니터링 도구 구축
# 사람의 평가 파이프라인 구축
# 주기적인 모델 학습 자동화


[[분류:책]]
[[분류:책]]

2022년 8월 10일 (수) 16:29 기준 최신판


핸즈온 머신러닝(2판)
100%
제목 핸즈온 머신러닝(2판)
저자 오렐리앙 제롱
옮긴이 박해선
출판사 한빛미디어
출판연도 2020
쪽수 952
평점 9/10
ISBN 9791162242964

1 소개[편집 | 원본 편집]

올해 외부연수로 Python 라이브러리를 활용한 인공지능를 들었더니 책을 한 권 줘서 재미있게(?) 보고 있다. 컬러 인쇄가 되어 있어서 눈이 덜 아프다.


20220809-sci-kit-learn.png

2 정리 1일차[편집 | 원본 편집]

2022년 8월 8일에 읽으며 정리한 내용

2.1 필요한 기술[편집 | 원본 편집]

이 책을 읽으려면 아래 기술과 친숙해야 한다.


앞에 있는 파이썬의 과학 라이브러리(3종)를 학습하려면 아래 링크를 참고하자.


파이썬을 잘 모른다면 아래 두 링크에서 학습하면 좋다.


케라스 관련해서는 <케라스 창시자에게 배우는 딥러닝>이라는 책이 번역이 잘 되었다고 한다.

2.2 파이썬 관련 인공지능 프레임워크[편집 | 원본 편집]

  • 사이킷런(Scikit-Learn) https://scikit-learn.org/ - 사용법이 쉽고 많은 머신러닝 알고리즘이 효율적으로 구현되어 있으므로 머신러닝을 처음 배울 때 사용하기 아주 좋음. 2007년 데이빗 쿠르나포(David Cournapeau)가 개발했고 현재 Inria(French Institute for Research in Computer Science and Automation)의 연구팀이 이끌고 있음
  • 텐서플로(TensorFlow) https://www.tensorflow.org/ - 분산 수치 계산을 위한 매우 복잡한 라이브러리. 수백 대의 다중 그래픽 처리 장치(GPU) 서버에 계산을 분산하여 대규모 신경망을 효과적으로 훈련하고 실행시킴. 구글에서 만들었고 구글의 대규모 머신러닝 애플리케이션에서 사용하고 있음. 2015년 11월에 오픈 소스로 공개되었고 2019년 9월 2.0 버전이 릴리스 됨.
  • 케라스(Keras) https://keras.io/ - 고수준 딥러닝 API. 매우 쉽게 신경망을 훈련하고 실행 가능. 케라스는 텐서플로, 시애노(Theano), 마이크로소프트 코그니티브 툴킷(Microsoft Cognitive Toolkit) 위에서 작동. 텐서플로는 자체적인 케라스 API 구현을 tf.keras란 이름으로 포함. tf.keras는 텐서플로의 고급기능을 지원함. (예: 효율적인 데이터 적재 기능 등)

2.3 머신러닝 정의[편집 | 원본 편집]

머신러닝은 데이터에서부터 학습하도록 컴퓨터를 프로그래밍하는 과학(또는 예술)이다. 조금 더 일반적인 정의는 다음과 같다.

  • [머신러닝은] 명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구 분야다. (아서 새뮤얼 Arthur Samuel, 1959)
  • 어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것이다. (톰 미첼 Tom Michell, 1997)

2.4 머신러닝 용도[편집 | 원본 편집]

  • 기존 솔루션으로는 많은 수동 조정과 규칙이 필요한 문제: 하나의 머신러닝 모델이 코드를 간단하게 만들고 전통적인 방법보다 더 잘 수행하도록 할 수 있음
  • 전통적인 방법으로는 해결 방법이 없는 복잡한 문제: 가장 뛰어난 머신러닝 기법으로 해결 방법을 찾을 수 있음
  • 유동적인 환경: 머신러닝 시스템은 새로운 데이터에 적응할 수 있음
  • 복잡한 문제와 대량의 데이터에서 통찰 얻기

2.5 머신러닝 시스템의 종류[편집 | 원본 편집]

머신러닝 시스템의 종류는 굉장히 많으므로 넓은 범주에서 분류하면 도움이 된다.

  • 사람의 감독하에 훈련하는 것인지 그렇지 않은 것인지 (지도, 비지도, 준지도, 강화 학습)
  • 실시간으로 점진적인 학습을 하는지 아닌지 (온라인 학습과 배치 학습)
  • 단순하게 알고 있는 데이터 포인트와 새 데이터 포인트를 비교하는 것인지 아니면 과학자들이 하는 것처럼 훈련 데이터셋에서 패턴을 발견하여 예측 모델을 만드는지 (사례 기반 학습과 모델 기반 학습)

2.5.1 지도 학습과 비지도 학습[편집 | 원본 편집]

머신러닝 시스템을 '학습하는 동안 감독의 형태나 정보량'에 따라 분류할 수 있으며 아래 네 가지 종류가 있음.

  1. 지도 학습
  2. 비지도 학습
  3. 준지도 학습
  4. 강화 학습
2.5.1.1 지도학습(Supervised Learning)[편집 | 원본 편집]

지도학습에는 알고리즘에 주입하는 훈련 데이터에 레이블(label)이라는 원하는 답을 포함. 분류(classification)가 전형적인 지도 학습이며, 스팸 필터가 좋은 예. 또 다른 전형적인 작업은 예측 변수(predictor variable)라 부르는 특성(feature / 주행거리, 연식, 브랜드 등)을 사용해 중고차 가격 같은 타깃(target) 수치를 예측하는 것이 있음. 이런 종류의 작업을 회귀(regression)라고 부름. 지도학습을 활용하려면 예측 변수와 레이블(중고차 가격이) 포함된 중고차 데이터가 많이 필요함. 다음은 가장 중요한 지도 학습 알고리즘임.

  • k-최근접 이웃(k-nearest neighbors)
  • 선형 회귀(linear regression)
  • 로지스틱 회귀(logistic regression)
  • 서포트 벡터 머신(support vector machine, SVM)
  • 결정 트리(decision tree)와 랜덤 포레스트(random forest)
  • 신경망(neural networks)
2.5.1.2 비지도학습(Unsupervised Learning)[편집 | 원본 편집]

비지도학습에는 말 그대로 훈련 데이터에 레이블이 없음. 시스템은 아무런 도움 없이 학습해야 함. 다음은 가장 중요한 비지도 학습 알고리즘임.

  • 군집(clustering)
    • k-평균(k-means)
    • DBSCAN
    • 계층 군집 분석(hierachical cluster analysis, HCA)
  • 이상치 탐지(outlier detection)와 특이치 탐지(novelty detection)
    • 원-클래스(one-class SVM)
    • 아이솔레이션 포레스트(isolation forest)
  • 시각화(visualization)와 차원 축소(dimensionality reduction)
    • 주성분 분석(principal component analysis, PCA)
    • 커널(kernel) PCA
    • 지역적 선형 임베딩(locally-linear embedding, LLE)
    • t-SNE(t-distributed stochastic embedding)
  • 연관 규칙 학습(association rule learning)
    • 어프라이어리(Apriori)
    • 이클렛(Eclat)


참고로 비지도 학습 알고리즘의 한 가지인 시각화(visualization) 알고리즘은 가능한 한 데이터 구조를 그대로 유지하는 경향이 있어 데이터가 어떻게 조직되어 있는지 이해할 수 있고 예상하지 못한 패턴을 발견할 수도 있어서 유익함

2.5.1.3 준지도 학습(Semisupervised Learning)[편집 | 원본 편집]

일부 데이터에만 레이블이 있는 경우 준지도 학습을 활용할 수 있음. 대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있음. 예를 들어 심층 신경 신뢰망(Deep Belief Network, DBN)은 여러 겹으로 쌓은 제한된 볼츠만 머신(Restricted Boltzmann Machine, RBM)이라 불리는 비지도 학습에 기초함. RBM이 비지도 학습 방식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조종됨.

2.5.1.4 강화 학습(Reinforcement Learning)[편집 | 원본 편집]

강화 학습은 보상을 통해 학습을 하는 머신러닝 알고리즘은 학습하는 시스템인 에이전트(agent)가 환경(environment)을 관찰해서 행동을 실행(action)하고 그 결과로 보상(reward) 또는 벌점(penalty)을 받음. 시간이 지나면서 가장 큰 보상을 얻기 위해 정책(policy)이라고 부르는 최상의 전략을 스스로 학습함. 정책은 주어진 상황에서 에이전트가 어떤 행동을 선택해야 할지 정의함.

2.5.2 배치 학습과 온라인 학습[편집 | 원본 편집]

머신러닝 시스템을 분류하는 데 사용하는 다른 기준은 입력 데이터의 스트림(stream)으로부터 점진적으로 학습할 수 있는지 여부다.

2.5.2.1 배치학습(Batch Learning)[편집 | 원본 편집]

배치 학습에서는 시스템이 점진적으로 학습할 수 없음. 가용한 데이터를 모두 사용해 훈련시켜야 함. 일반적으로 이 방식은 시간과 자원을 많이 소모하므로 보통 오프라인에서 수행함. 먼저 시스템을 훈련시키고 그런 다음 제품 시스템에 적용하면 더 이상의 학습 없이 실행됨. 즉, 학습한 것을 단지 적용만 함. 이를 오프라인 학습(offline learning)이라고 함.


배치 학습 시스템이 (새로운 종류의 스팸 같은) 새로운 데이터에 대해 학습하려면 (새로운 데이터뿐만 아니라 이전 데이터도 포함한) 전체 데이터를 사용하여 시스템의 새로운 버전을 처음부터 다시 훈련해야 함. 그런 다음 이전 시스템을 중지시키고 새 시스템으로 교체함. 보통 24시간마다 또는 매주 시스템을 훈련시킴. 시스템이 빠르게 변하는 데이터에 적용해야 한다면 더 능동적인 방법이 필요함.

2.5.2.2 온라인 학습(Online Learning)[편집 | 원본 편집]

온라인 학습에서는 데이터를 순차적으로 한 개씩 또는 미니배치(mini-batch)라 부르는 작은 묶음 단위로 주입하여 시스템을 훈련시킴. 매 학습 단계가 빠르고 비용이 적게 들어 시스템은 데이터가 도착하는 대로 즉시 학습할 수 있음.


온라인 학습은 연속적으로 데이터를 받고 (예를 들면 주식가격) 빠른 변화에 스스로 적응해야 하는 시스템에 적합함. 컴퓨팅 자원이 제한된 경우에도 좋은 선택임. 온라인 학습 시스템이 새로운 데이터 샘플을 학습하면 학습이 끝난 데이터는 더는 필요하지 않으므로 버리면 됨. (이전 상태로 되돌릴 수 있도록 데이터를 재사용하기 위해 보관할 필요가 없다면) 컴퓨터 한 대의 메인 메모리에 들어갈 수 없는 아주 큰 데이터셋을 학습하는 시스템에도 온라인 학습 알고리즘을 사용할 수 있음 (이를 외부 메모리(out-of-core) 학습이라고 함)


온라인 학습 시스템에서 중요한 파라미터 하나는 변화하는 데이터 얼마나 빠르게 적응할 것인지인데 이를 학습률(learning rate)이라고 함. 온라인 학습에서 가장 큰 문제점은 시스템에 나쁜 데이터가 주입되었을 때 시스템 성능이 점진적으로 감소한다는 점임. 이런 위험을 줄이려면 시스템을 면밀히 모니터링하고 성능 감소가 감지되면 즉각 학습을 중지시켜야 함.

2.5.3 사례 기반 학습과 모델 기반 학습[편집 | 원본 편집]

머신러닝 시스템은 어떻게 일반화(generalize)되는가에 따라 분류할 수도 있음. 일반화를 위한 두 가지 접근법은 사례 기반 학습과 모델 기반 학습임.

2.5.3.1 사례 기반 학습(Instance-Based Learning)[편집 | 원본 편집]

사례 기반 학습은 시스템이 훈련 샘플을 기억함으로써 학습을 하도록 함. 그리고 유사도(similarity) 측정을 사용해 새로운 데이터와 학습한 샘플을 (또는 학습한 샘플 중 일부를) 비교하는 식으로 일반화 함.

2.5.3.2 모델 기반 학습(Model-Based Learning)[편집 | 원본 편집]

샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측(prediction)에 사용하는 것으로 이를 모델 기반 학습이라고 함. 모델 기반 학습의 작업은 아래와 같은 과정으로 진행됨.

  1. 데이터를 분석합니다.
  2. 모델을 선택합니다.
  3. 훈련 데이터로 모델을 훈련시킵니다. (즉, 학습 알고리즘이 비용 함수를 최소화하는 모델 파라미터를 찾습니다)
  4. 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고 (이를 추론(interference)이라고 함), 이 모델이 잘 일반화되길 기대합니다.

2.6 머신러닝의 주요 도전 과제[편집 | 원본 편집]

간단하게 말해 머신러닝은 학습 알고리즘을 선택해서 어떤 데이터에 훈련시키는 것이므로 문제가 될 수 있는 두 가지는 '나쁜 알고리즘'과 '나쁜 데이터'이다. 여기서는 이 두 가지에 대해 알아본다.

2.6.1 충분하지 않은 양의 훈련 데이터[편집 | 원본 편집]

대부분의 머신러닝 알고리즘이 잘 작동하려면 데이터 많아야 함. 아주 간단한 문제에서조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제라면 수백만 개가 필요할지도 모름. (이미 만들어진 모델을 재사용할 수 없다면)


복잡한 문제에서 알고리즘보다 데이터가 더 중요하다는 이 생각은 2009년 피터 노르빅(Peter Norvig) 등이 쓴 <The Unreasonable Effectiveness of Data> 논문 때문에 더 유명해졌음. 하지만 기억할 점은 작거나 중간 규모의 데이터셋이 여전히 매우 흔하고, 훈련 데이터를 추가로 모으는 것이 항상 쉽거나 저렴한 일은 아니므로, 아직은 알고리즘을 무시하지 말아야 함.

2.6.2 대표성 없는 훈련 데이터[편집 | 원본 편집]

일반화가 잘되려면 우리가 일반화하기 원하는 새로운 사례를 훈련 데이터가 잘 대표하는 것이 중요. 이는 사례 기반 학습이나 모델 기반 학습 모두 마찬가지임. 일반화하려는 사례를 대표하는 훈련 세트를 사용하는 것이 매우 중요하지만, 이게 생각보다 어려울 때가 많음. 샘플이 작으면 샘플링 잡음(sampling noise, 우연에 의한 대표성 없는 데이터)이 생기고, 매우 큰 샘플도 표본 추출 방법이 잘못되면 대표성을 띠지 못할 수 있음. 이를 샘플링 편항(sampling bias)이라고 함.

2.6.3 낮은 품질의 데이터[편집 | 원본 편집]

훈련 데이터가 에러, 이상치(outlier), 잡음(예를 들어 성능이 낮은 측정 장치 때문에)으로 가득하다면 머신러닝 시스템이 내재된 패턴으 찾기 어려워 잘 작동하지 않음. 그렇기 때문에 훈련 데이터 정제에 시간을 투자할 만한 가치가 충분. 대부분의 데이터 과학자가 데이터 정제에 많은 시간을 쓰고 있음.

2.6.4 관련 없는 특성[편집 | 원본 편집]

속담에도 있듯이 엉터리가 들어가면 엉터리가 나옴(garbage in, garbage out). 성공적인 머신러닝 프로젝트의 핵심 요소는 훈련에 사용할 좋은 특성들을 찾는 것. 이 과정을 특성 공학(feature engineering)이라 하며 다음과 같은 작업임

  • 특성 선택(feature selection) : 가지고 있는 특성 중에서 훈련에 가장 유용한 특성을 선택함
  • 특성 추출(feature extraction) : 특성을 결합하여 더 유용한 특성을 만듦. 앞서 본 것처럼 차원 축소 알고리즘이 도움이 될 수 있음.

2.6.5 훈련 데이터 과대적합[편집 | 원본 편집]

해외여행 중 택시운전사가 내 물건을 훔쳤다고 가정합시다. 아마도 그 나라의 모든 택시운전사를 도둑이라고 생각할 수도 있습니다. 사람은 종종 과도하게 일반화를 하지만 주의하지 않으면 기계도 똑같은 함정에 빠질 수 있음. 머신러닝에서는 이를 과대적합(overfitting)이라고 함. 이는 모델이 훈련 데이터에 너무 잘 맞지만 일반성이 떨어진다는 뜻이다.

과대적합(overfitting)은 훈련 데이터에 있는 잡음의 양에 비해 모델이 너무 복잡할 때 일어남. 해결 방법은 다음과 같음.

  • 파라미터 수가 적은 모델을 선택하거나(예를 들면 고차원 다항 모델보다 선형 모델), 훈련 데이터에 있는 특성 수를 줄이거나, 모델에 제약을 가하여 단순화 시킴
  • 훈련 데이터를 더 많이 모음
  • 훈련 데이터의 잡음을 줄임 (예를 들어 오류 데이터 수정과 이상치 제거)

모델을 단순하게 하고 과대적합의 위험을 감소시키기 위해 모델에 제약을 가하는 것을 규제(regularization)라고 함. 학습하는 동안 적용할 규제의 양은 하이퍼파라미터(hyperparameter)가 결정함. 하이퍼파라미터는 (모델이 아니라) 학습 알고리즘의 파라미터여서 학습 알고리즘으로부터 영향을 받지 않으며, 훈련 전에 미리 지정되고, 훈련하는 동안에는 상수로 남아있음. 규제 하이퍼파라미터를 매우 큰 값으로 지정하면 (기울기가 0에 가까운) 거의 평편한 모델을 얻게 됨. 그러면 학습 알고리즘이 훈련 데이터에 과대적합될 가능성은 거의 없겠지만 좋은 모델을 찾지 못함. 머신러닝 시스템을 구축할 때 하이퍼파라미터 튜닝은 매우 중요한 과정임.

2.6.6 훈련 데이터 과소적합[편집 | 원본 편집]

과소적합(underfitting)은 과대적합의 반대. 이는 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못할 때 일어남. 이 문제를 해결하는 주요 기법은 다음과 같음.

  • 모델 파라미터가 더 많은 강력한 모델을 선택합니다.
  • 학습 알고리즘에 더 좋은 특성을 제공합니다. (특성 공학)
  • 모델의 제약을 줄입니다 (예를 들면 규제 하이퍼파라미터를 감소시킵니다).

2.7 요약[편집 | 원본 편집]

  • 머신러닝은 명시적인 규칙을 코딩하지 않고 기계가 데이터로부터 학습하여 어떤 작업을 더 잘하도록 만드는 것
  • 여러 종류의 머신러닝 시스템이 있음. 지도 학습과 비지도 학습, 배치 학습과 온라인 학습, 사례 기반 학습과 모델 기반 학습 등이 있음.
  • 머신러닝 프로젝트에서는 훈련 세트의 데이터를 모아 학습 알고리즘에 주입함. 학습 알고리즘이 모델 기반이면 훈련 세트에 모델을 맞추기 위해 모델 파라미터를 조정하고 (즉, 훈련 세트에서 좋은 예측을 만들기 위해), 새로운 데이터에서도 좋은 예측을 만들 거라 기대함. 알고리즘이 사례 기반이면 샘플을 기억하는 것이 학습이고 유사도 측정을 사용하여 학습한 샘플과 새로운 샘플을 비교하는 식으로 새로운 샘플을 일반화 함.
  • 훈련 세트가 너무 적거나, 대표성이 없는 데이터이거나, 잡음이 많고 관련 없는 특성으로 오염되어 있다면 시스템이 잘 작동하지 않을 수 있음.

2.8 테스트와 검증[편집 | 원본 편집]

모델이 새로운 샘플에 얼마나 잘 일반화할지 아는 유일한 방법은 새로운 샘플에 실제로 적용해 보는 것. 하지만 실제 서비스에 적용하면 문제가 많을 수 있으므로 훈련 데이터를 훈련 세트테스트 세트 두 개로 나누는 것이 더 현실적임. 이름에서도 알 수 있듯이 훈련 세트를 사용해 모델을 훈련하고 테스트 세트를 사용해 모델을 테스트함. 새로운 샘플에 대한 오류 비율을 일반화 오차(generalization error 또는 외부 샘플 오차(out-of-sample error))라고 하며, 테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값(estimation)을 얻습니다. 이 값은 이전에 본 적이 없는 새로운 샘플에 모델이 얼마나 잘 작동할지 알려줍니다. 훈련 오차가 낮지만(즉, 훈련 세트에서 모델의 오차가 적음) 일반화 오차가 높다면 이는 모델이 훈련 데이터에 과대적합되었다는 뜻입니다. (TIP : 보통 데이터의 80%를 훈련에 사용하고 20%는 테스트용으로 떼어놓습니다. 하지만 이는 데이터셋 크기에 따라 다릅니다. 만약 샘플이 천만 개 있다면 1%를 떼어놓으면 테스트 세트에 샘플이 100,000개 있다는 의미입니다. 아마도 일반화 오차를 추정하는데 충분한 크기일 것입니다.)

2.8.1 홀드아웃 검증(holdout validation)[편집 | 원본 편집]

홀드아웃 검증(holdout validation)은 훈련 세트의 일부를 떼어내어 여러 후보 모델을 평가하고 가장 좋은 하나를 선택함. 이 새로운 홀드 아웃 세트를 검증 세트(validation set)라고 함. (이따금 개발 세트(development set) 또는 데브 세트(dev set)라고도 함) 구체적으로 말하면 줄어든 훈련 세트(쯕, 전체 훈련 세트에서 검증 세트를 뺀 데이터)에서 다양한 하이퍼파라미터 값을 가진 여러 모델을 훈련함. 그다음 검증 세트에서 가장 높은 성능을 내는 모델을 선택함. 홀드아웃 검증 과정이 끝나면 이 최선의 모델을 (검증 세트를 포함한) 전체 훈련 세트에서 다시 훈련하여 최종 모델을 만듦. 마지막으로 최종 모델을 테스트 세트에서 평가하여 일반화 오차를 추정함.


이 방법은 일반적으로 잘 작동함. 하지만 검증 세트가 너무 작으면 모델이 정확하게 평가되지 않음. 최적이 아닌 모델을 잘못 선택할 수 있음. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아짐. 이것이 문제가 되는 이유는 최종 모델이 전체 훈련 세트에서 훈련되기 때문에 너무 작은 훈련 세트에서 훈련한 후보 모델을 비교하는 것은 이상적이지 않음. 이는 마치 마라톤에 참여하기 위해 가장 빠른 단거리 주자를 고르는 것과 같음. 이 문제를 해결하는 한 가지 방법은 작은 검증 세트를 여러 개를 사용해 반복적인 교차 검증(cross-validation)을 수행하는 것. 검증 세트마다 나머지 데이터에서 훈련한 모델을 해당 검증 세트에서 평가함. 모든 모델의 평가를 평균하면 훨씬 정확한 성능을 측정할 수 있음. 하지만 단점도 있음. 훈련 시간이 검증 세트의 개수에 비례해 늘어남.

2.8.2 훈련-개발 세트(train-dev set)[편집 | 원본 편집]

훈련 사진의 일부를 떼어내어 또 다른 세트를 만드는 것을 (앤드루 웅 Andrew Ng은) 이를 훈련-개발 세트(train-dev set)라고 부름. 모델을 (훈련-개발 세트가 아니라 훈련 세트에서) 훈련한 다음 훈련-개발 세트에서 평가함.. 모델이 잘 작동하면 훈련 세트에 과대적합된 것이 아님. 이 모델이 검증 세트에서 나쁜 성능을 낸다면 이 문제는 데이터 불일치에서 오는 것. 반대로 모델이 훈련-개발 세트에서 잘 작동하지 않는다면 이는 훈련 세트에 과대적합된 것. 따라서 모델을 규제하거나 더 많은 훈련 데이터를 모으거나 훈련 데이터 정제를 시도해봐야 함.

3 정리 2일차[편집 | 원본 편집]

2022년 8월 9일에 정리한 내용

3.1 테스트 세트 만들기[편집 | 원본 편집]

  • 데이터를 더 깊게 들여다보기 전에 반드시 테스트 세트를 따로 떼어놓아야 함. 그리고 테스트 세트는 절대 들여다보면 안 됨.이는 테스트 세트에 적합한 알고리즘을 선택하는 오류를 피하기 위함이며 이를 데이터 스누핑 편향이라고 함.
  • 테스트 세트를 생성하는 일은 이론적으로는 간단함. 무작위로 어떤 샘플을 선택해서 데이터셋의 20% 정도를(또는 데이터셋이 매우 크다면 그보다 적게) 떼어놓으면 됨.
  • 책에 있는 test_set_check 함수는 인덱스 값 0부터 20639까지의 값을 crc32 함수로 변환한 후, 단순히 0.2 * 2^32 값보다 작으면 True, 같거나 크면 False를 리턴하는 함수이다. 그런데 이렇게 코드를 작성하면 약 20% 정도의 인덱스 값만 True로 설정이 되는데 왜 그런지 잘 모르겠다. 일단 넘어가자.
    • 강사님께 물어봤더니 본인은 실제 사용하지 않을 내용이기 때문에 그냥 보지 않고 넘어갔다고 함.

3.2 데이터 이해를 위한 탐색과 시각화[편집 | 원본 편집]

  • 훈련 세트가 매우 크면 조작을 간단하고 빠르게 하기 위해 탐색을 위한 세트를 별도로 샘플링 할 수도 있음.
  • 상관관계는 선형적인 상관관계만 측정함. 그래서 비선형적인 관계는 잡을 수 없음.
  • 특성 사이의 상관관계를 확인하는 다른 방법은 숫자형 특성 사이에 산점도를 그려주는 판다스의 scatter_matrix 함수를 사용하는 것
  • 대부분의 소프트웨어 프로젝트가 그렇지만 특히 머신러닝 프로젝트는 빠른 프로토타이핑반복적인 프로세스가 권장됨

3.3 머신러닝 알고리즘을 위한 데이터 준비[편집 | 원본 편집]

머신러닝 알고리즘을 위해 데이터를 준비해야하는데, 이 작업은 수동으로 하는 것보다는 함수 등을 만들어 자동화 해야 하는데 그 이유는 아래와 같음.

  • 어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복할 수 있음(예를 들어, 다음 번에 새로운 데이터셋을 사용)
  • 향후 프로젝트에 사용할 수 있는 변환 라이브러리를 점진적으로 구축하게 됨
  • 실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 변환시키는 데 이 함수를 사용할 수 있음
  • 여러 가지 데이터 변환을 쉽게 시도해 볼 수 있고 어떤 조합이 가장 좋은지 확인하는 데 편리
  • 대부분의 머신러닝 알고리즘은 숫자를 다루므로 텍스트는 숫자로 바꿔야 함

4 정리 3일차[편집 | 원본 편집]

2022년 8월 10일에 정리한 내용

4.1 머신러닝 알고리즘을 위한 데이터 준비 (cont.)[편집 | 원본 편집]

  • 모든 특성의 범위를 같도록 만들어주는 방법으로 min-max 스케일링표준화(standardization)가 널리 사용됨
    • min-max 스케일링은 많은 사람이 정규화(normalization)라고 부름
    • 이를 위해 사이킷런에는 MinMaxScaler 변환기와 StandardScaler를 제공함
  • min-max 스케일링 : ① 0 ~ 1 범위에 들도록 값을 이동하고 스케일링을 조정 ② 데이터에서 최솟값을 뺀 후 최댓값과 최소값의 차이로 나눔
  • 표준화 : ① 먼저 평균을 뺌 (그래서 표준화를 하면 항상 평균이 0이 됨) ② 표준편차로 나누어 결과 분포의 분산이 1이 되게 함**min-max 스케일링과 달리 표준화는 범위의 상한과 하한이 없어 어떤 알고리즘에서는 문제가 될 수 있음 (예 : 신경망은 종종 입력값의 범위로 0 ~ 1 사이를 기대함)
    • 그러나 표준화는 이상치에 영향을 덜 받음
  • 모든 변환기에서 스케일링은 (테스트 세트가 포함된) 전체 데이터가 아니고 훈련 데이터에 대해서만 fit() 메소드를 적용해야 함. 그런 다음 훈련 세트와 테스트 세트(그리고 새로운 데이터)에 대해 transform() 메서드를 사용함
  • 현재 사용 중인 Scikit-learn 버전을 확인하는 코드는 아래와 같다.

import sklearn
print(sklearn.__version__)
  • 앙상블 학습 : 여러 다른 모델을 모아서 하나의 모델로 만드는 학습 방법
  • 과대적합을 해결하는 방법
    • 모델을 간단히 한다
    • 제한을 한다 (즉, 규제)
    • 더 많은 훈련 데이터를 모은다
  • 랜덤 포레스트를 더 깊이 들어가기 전에, 여러 종류의 머신러닝 알고리즘으로 하이퍼파라미터 조정에 너무 많은 시간을 들이지 않으면서 다양한 모델(다양한 커널의 서포트 백터 머신, 신경망 등)을 시도해봐야 합니다.

4.2 모델 세부 튜닝[편집 | 원본 편집]

가능성 있는 모델을 추렸다면 이 모델들을 세부 튜닝해야 하는데 아래와 같은 방법을 활용할 수 있음

4.2.1 그리드 탐색[편집 | 원본 편집]

  • 만족할 만한 하이퍼파라미터 조합을 찾을 때까지 수동으로 하이퍼파라미터를 조정
  • 사이킷런의 GridSearchCV를 사용하면 간단함

4.2.2 랜덤 탐색[편집 | 원본 편집]

  • 하이퍼파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 게 좋음.
  • RandomizedSearchCV는 GridSearchCV와 거의 같은 방식으로 사용하지만 가능한 모든 조합을 시도하는 대신 각 반복하다 하이퍼파라미터에 임의의 수를 대입하여 지정한 횟수만큼 평가함
  • 이 방식의 주요 장점은 다음 두 가지 임
    • 랜덤 탐색을 1,000회 반복하도록 실행하면 하이퍼파라미터마다 각기 다른 1,000개의 값을 탐색함 (그리드 탐색에서는 하이퍼파라미터마다 몇 개의 값만 탐색)
    • 단순히 반복 횟수를 조절하는 것만으로 하이퍼파라미터 탐색에 투입할 컴퓨팅 자원을 제어할 수 있음

4.2.3 앙상블 방법[편집 | 원본 편집]

  • 모델을 세밀하게 튜닝하는 또 다른 방법은 최상의 모델을 연결해보는 것
  • 모델의 그룹(또는 앙상블 ensemble)이 최상의 단일 모델보다 더 나은 성능을 발휘할 때가 많음

4.2.4 최상의 모델과 오차 분석[편집 | 원본 편집]

  • 최상의 모델을 분석하여 문제에 대한 통찰력을 얻어서 최적화를 함 (예 : 덜 중요한 특성 제외)

4.2.5 론칭, 모니터링, 시스템 유지 보수[편집 | 원본 편집]

  • 어떤 방식이든 모니터링 시스템을 준비해야 합니다. (운영 중인 모델을 평가하기 위해 평가자를 사용하든 하용하지 않든).
  • 또한 모델이 실패했을 때 무엇을 할지 정의하고 어떻게 대비할지 관련 프로세스를 모두 준비해야 합니다.
  • 데이터가 계속 변화하면 데이터셋을 업데이트하고 모델을 정기적으로 다시 훈련해야 합니다.
  • 전체 과정에서 가능한 한 많은 것을 자동화해야 합니다. 다음은 자동화할 수 있는 일부 작업입니다.
    • 정기적으로 새로운 데이터를 수집하고 레이블을 답니다 (예 : 조사원 활용)
    • 모델을 훈련하고 하이퍼파라미터를 자동으로 세부 튜닝하는 스크립트를 작성 (작업에 따라 매일 또는 매주 자동으로 이 스크립트를 실행할 수 있음)
    • 업데이트된 테스트 세트에서 새로운 모델과 이전 모델을 평가하는 스크립트를 하나 더 작성합니다. 성능이 감소하지 않으면 새로운 모델을 제품에 배포합니다. (성능이 나쁘다면 왜 그런지 조사합니다)
  • 또한 모델의 입력 데이터 품질으 평가해야 합니다.
  • 마지막으로 만든 모델을 백업(backup)해야 합니다. 새로운 모델이 어떤 이유로 올바르지 않게 작동하는 경우 이전 모델로 빠르게 롤백(rollback)하기 위한 절차와 도구를 준비합니다.

4.2.6 요약[편집 | 원본 편집]

머신러닝 프로젝트 대부분의 작업은 아래 단계로 이루어짐

  1. 데이터 준비 단계
  2. 모니터링 도구 구축
  3. 사람의 평가 파이프라인 구축
  4. 주기적인 모델 학습 자동화