머신러닝 입문서로 불리는 핸즈온 머신러닝을 이해한 대로 정리해보려고 한다.
머신러닝의 공학적인 정의는 아래와 같다
A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.
Tom Mitchell, 1997
훈련 세트(training set) : 시스템이 학습하는 데 사용하는 샘플
훈련 사례(training instance) or 샘플(sample) : 각각의 훈련 데이터
모델(model) : 머신러닝 시스템에서 학습하고 예측을 만드는 부분
정확도(accuracy) : 머신러닝의 공학적인 정의에서 언급한 성능 측정 P
모델 예시 : 신경망(neural network), 랜덤 포레스트(random forest)
기존 솔루션으로 는 많은 수동 조정과 규칙이 필요한 문제에 유용
: 머신러닝 모델이 코드를 간단하게 만들고 전통적인 방법보다 더 잘 수행 가능
: 문제가 어려워지면 더욱 규칙이 길고 복잡해지므로 유지 보수에 용이하지 않음.
전통적인 방식으로는 해결 방법이 없는 복잡한 문제
: 가장 뛰어난 머신러닝 기법으로 해결 방법 찾기 가능
: 음성 인식(speech recognition)이 그 예시다
유동적인 환경
: 머신러닝 시스템은 새로운 데이터로 쉽게 재훈련이 가능해서 최신 상태를 유지하는 것이 가능하다 (기존의 상황이었다면 수동으로 하나하나 고쳐주어야 함!)
복잡한 문제와 대량의 데이터에서 insight 얻기
: 데이터 마이닝(data mining) : 대용량의 데이터를 분석하여 숨겨진 패턴을 발견하는 것, 머신러닝을 잘 활용할 수 있는 분야
: 머신러닝을 통해 예상치 못한 상관관계나 새로운 추세 발견해서 문제 이해 가능
흥미로워 보이는 사례 위주로 정리했다
여러 가지 성과 자료를 바탕으로 회사의 내년도 수익 예측하기
신용카드 부정 거래 탐지
이상치 탐지 (outlier detection) 작업이라고 한다
isolation forest, Gaussian mixture, autoencoder 사용
과거 구매 이력을 기반으로 고객을 나누고 각 집합마다 다른 마케팅 전략 계획하기
지능형 게임 봇 만들기
종류가 많으면 항상 분류하는 기준이 존재한다.
대부분의 머신러닝 알고리즘이 잘 작동하려면 데이터가 많아야 한다!! 아주 간단한 문제라도 수천 개의 데이터가 필요하니, 더 복잡한 분야(이미지나 음성 인식)에서는 더 많은 데이터가 필요하다.
책에서 마이크로소프트 연구자인 Michele Banko와 Eric Brill은 2001년에 발표한 논문을 언급했다.
결론(6.conclusion) 부분을 읽어보면 자연어 분류 작업에서 더 큰 학습데이터를 사용하면 성능이 크게 향상될 수 있음을 보여줄 있다고 언급한다. 따라서 다양한 학습 알고리즘을 비교하는 연구에 집중하기 보다는 더 큰 labeld dataset을 구축하는 데 중점을 두어야 한다고 말하고 있다.
2009년 Peter Norvig 등이 쓴 「The Unreasonbale Effectiveness of Data」논문에서도 비슷한 주장을 언급하고 있다.
일반화가 잘 되려면 훈련 데이터가 일반화하고 싶은 새로운 사례를 대표하는 것이 중요하다. 하지만 이런 훈련 세트를 찾는 것은 어렵다. 결측값이 많은 데이터를 다루어서 그런가 싶었는데, 대표성을 띄는 샘플을 찾기 어려워서 그렇다고 한다.
샘플이 작으면 sampling noise(우연에 의한 대표성 없는 데이터)가, 표본 추출 방법이 잘못되면 아무리 큰 샘플이라도 sampling bias가 일어나서 대표성을 띄지 못할 수 있다고 한다.
정제되어 있지 않은 데이터에서는 특정한 패턴을 찾기 어렵다. (캐글 조금만 해보면 정말 공감할 수밖에 없는 내용일 것 같다. 점수가 안 나와...)
특성 공학(feature engineering) : 훈련에 사용할 좋은 특성을 찾는 것
특성 선택(feature selection)
특성 추출(feature extraction)
데이터 수집
과대적합(overfitting) : 모델이 훈련 데이터에는 너무 잘 맞지만 일반성이 떨어지는 경우,훈련 데이터의 양과 잡음에 비해 모델이 너무 복잡할 때 일어난다!
과대적합 방지
1. 파라미터 수가 적은 모델 택하기
2. 훈련 데이터 더 많이 모으기
3. 훈련 데이터의 잡음 제거(오류 데이터 수정과 이상치 제거)
4. 규제(regularization) : 제약 가하기
ex) 선형모델에서 파라미터 조절(자유도 degree of freedom)
규제의 양은 hyperparameter가 결정함.
*참고로 이 하이퍼파라미터는 모델이 아닌 학습 알고리즘의 파라미터이기에 훈련 전에 상수로 지정되어 남아 있는다고 한다.
과소적합(underfitting) : 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못할 때 일어남.
과소적합 방지
1. 모델 파라미터가 더 많은 강력한 모델 선택
2. 학습 알고리즘에 더 좋은 특성 제공(특성 공학)
3. 모델의 제약 줄이기(ex. 규제 하이퍼파라미터 감소시키기)
모델이 샘플에 얼마나 잘 일반화될지 알려면 실제로 적용해보는 수밖에 없다! 하지만 실제로 적용했다가 만약 모델 성능이 않 좋다면 자칫 욕만 얻어먹을 수 있다! 실제 적용하는 대신 더 나은 방법들도 존재한다.
훈련 세트와 테스트 세트 2개로 나누는 방법이 있다.
일반화 오차(generalization error) = 외부 샘플 오차(out-of-sample error) : 새로운 샘플에 대한 오차 비율
테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값(estimation)을 얻을 수 있다. 이 수치를 통해 한 번도 본 적이 없는 새로운 샘플을 모델이 어떻게 작동할 지 볼 수 있다고 한다.
만약 훈련 오차↓, 일반화 오차 ↑ 상황이라면 과대적합이 일어난 상황으로 볼 수 있다.
모델 평가 - 테스트 세트를 이용하자!
100개의 하이퍼파라미터 값으로 100개의 다른 모델을 훈련시키는 방법이 있다. 일반화 오차가 가장 낮은 모델을 최적의 하이퍼파라미터를 찾았다고 가정해보자. 이 모델이 실제 서비스에 투입되면 어느 정도의 성능을 낼 수 있을까?
일반화 오차를 테스트 세트에서 여러 번 측정했기에,
이미 테스트 세트에 최적화된 모델이 되버린 상태다.
따라서 모델이 새로운 데이터, 즉 실제 서비스에 투입되면 잘 작동하지 않을 수 있다!
어떻게 해결하지?
홀드아웃 검증 holdout validation
훈련 세트의 일부를 떼어내어 여러 후보 모델을 평가하고 가장 좋은 하나를 선택하는 방법
새로운 홀드아웃 세트 : 검증 세트 (validation set)
개발 세트(development set), 데브 세트(dev set) 라고도 함!
검증 세트가 너무 작거나 너무 크면 당연히 문제가 생긴다. 적절한 양을 찾는 것이 가장 중요하다!
검증 세트가 너무 커서 남은 훈련 세트가 전체 훈련 세트보다 작아지면, 너무 작은 훈련 세트에서 훈련한 모델을 비교하는 것은 이상적이지 않다고 한다. 이를 해결하기 위해 작은 검증 세트를 사용해 여러 개를 사용하는 교차 검증( cross-validation)이라는 방법을 사용할 수 있다.
교차 검증으로 쓰이는 두 기법에 대한 내용을 정리한 글이 있으니 참고하면 좋을 것 같다!
다만, 훈련 시간이 검증 세트의 개수에 비례해서 늘어난다는 단점이 존재한다!
데이터를 아무리 많이 얻더라도, 대표성을 띄지 않는다면 무용지물일 수 잇다.
만약에 버섯 사진으로 버섯의 종류를 찾는 모바일 앱을 만든다고 해보자. 웹에서 엄청난 양의 버섯 사진을 구할 수 있으나, 실제로 찍을 사진을 대신하지는 못 한다.
이 경우를 대비하여 대표성을 가진 사진의 반을 검증 세트에, 반을 테스트 세트에 넣었고, 모델 성능을 측정했는데 결과가 실망스러웠다고 생각해보자. 이 경우엔 훈련 세트에 과대적합이 일어난 것인지, 웹 사진과 앱 사진의 데이터가 불일치하기 때문인지 알기 어렵다고 한다.
이를 해결하기 위해 한 가지 방법이 있다. 훈련 사진의 일부를 떼어내 또 다 른 세트, 훈련-개발 세트(train-dev set, 앤드류 응은 이렇게 불렀다고 한다)를 만드는 것이다. 훈련 세트에서 훈련한 후, 훈련-개발 세트에서 잘 작동하는지 평가한다고 한다.
이때 모델 잘 작동 X → 검증 세트에서 평가
모델 성능 X → 데이터 불일치 문제(전처리 필요)
The Lack of A Priori Distinctions Between Learning Algorithms
특정 종류의 모델을 선택할 때 데이터에 대한 암묵적인 가정(assumption)을 하는 것이 이 이론의 주 내용이다. David Wolpert는 데이터에 대해 완벽하게 아무런 가정도 하지 않으면 한 모델을 다른 모델보다 선호할 근거가 없음을 보였다. 이를 no free lunch(NFL) 이론이라고 한다. 경험하기 전에 더 잘 맞을 것이라 확신할 수 없기에 어떤 모델이 최선인지 확실히 알려면 모든 모델을 평가해보는 것뿐이라고 주장한다.
물론 이건 불가능하기에 실전에서는 데이터에 대한 타당한 가정을 하고 적절한 모델 몇 가지만 평가한다.