"머신러닝은 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야입니다."
출처: 혼자 공부하는 머신러닝+딥러닝
-> 여태까지 머신러닝에 관한 여러 정의와 표현들을 봤지만 이거 만큼 마음에 와닿았던 건 없었다ㅎㅎ
머신러닝은 크게 3가지의 넓은 범주에서 분류할 수 있다.
supervised learning
: 훈련 데이터에 label이라는 답이 포함됨
지도 학습 작업에는 데이터와 class로 훈련하여 새로운 데이터에 대해 분류 작업을 수행하는 classification, feature를 사용해 target 수치를 예측하는 regression이 있다.
*target과 label은 동의어로 취급되지만 target은 회귀에서, label은 분류에서 많이 사용된다. 또한 feature는 predictor나 attribute라고도 부른다.
unsupervised learning
: 훈련 데이터에 label이 없음. 시스템이 아무런 도움 없이 학습해야 함
비슷한 데이터들을 그룹으로 묶기 위해 clustering 알고리즘을 사용한다. 이때 그룹으로 묶는 것에 관한 규칙이 없으므로 알고리즘은 스스로 기준을 찾아내야 한다. 더 나아가 hierarchical clustering 알고리즘을 이용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있다.
visualization 알고리즘은 대규모의 고차원 데이터를 넣으면 도식화가 가능한 2D나 3D 표현을 만들어주는데, 이를 통해 데이터가 어떻게 조직되어 있는지 확인하고 새로운 패턴을 발견할 수 있다. 이와 비슷하게 너무 많은 정보를 잃지 않으면서 데이터를 간소화하는 dimensionality reduction이 있다. 이 중 한 가지로는 상관관계가 있는 여러 특성을 하나로 합치는 것이며, feature extraction이라고 한다.
*dimensionality reduction에는 PCA나 t-SNE와 같은 것들이 있다.
-> t-SNE 참고: https://towardsdatascience.com/t-sne-clearly-explained-d84c537f53a
outlier detection은 학습 알고리즘에 주입하기 전 데이터셋에서 이상한 값을 자동으로 제거하는 것이다. 비슷한 작업은 novelty detection(특이치 탐지)는 훈련 세트에 있는 모든 샘플과 다른 새로운 샘플을 탐지하는 것이 목적이다.
association rule learning은 대량의 데이터에서 특성 간에 연관 관계를 찾는 것이다.
semi-supervised learning
: 데이터에 label이 일부만 있는 것
보통 unsupervised learning과 supervised learning의 combination으로 해결된다. 예를 들어 clustering으로 비슷한 샘플들을 그룹으로 모은 후 레이블이 없는 모든 샘플에 해당 그룹의 label을 할당한 뒤, supervised learning 알고리즘을 사용할 수 있다.
self-supervised learning
: label이 전혀 없는 데이터셋에 label을 부여하는 것
예를 들어 레이블이 없는 이미지로 구성된 데이터셋이 있다면 각 이미지 일부분을 랜덤하게 masking하고 모델이 원본 이미지를 복원하도록 훈련할 수 있다. 이때 masking된 이미지가 훈련 데이터, 원본 이미지가 label로 사용된다. 훈련이 잘 되면 이미지 복원이 제대로 이루어질 수 있다는 것으로 이미지 분류 또한 잘 이루어질 수 있게 된다. 그러므로 복원 대신 fine tuning(미세 조정)을 통해 예측 작업을 수행할 수 있도록 만들 수 있다.
reinforcement learning
: agent가 environment를 관찰해서 action을 하고 그 결과로 reward나 penalty를 받으며, 시간이 지남에 따라 가장 큰 reward를 얻기 위해(= penalty를 적게 받기 위해) 최상의 전략인 policy를 스스로 학습하는 것

출처: https://aws.amazon.com/what-is/reinforcement-learning/
batch learning
-> *offline learning
새로운 데이터가 발생하면 모델의 성능은 감소하게 된다. 그렇기 때문에 새로운 데이터를 포함해서 학습을 새로 해줘야 하는데, batch learning은 기존 데이터와 새 데이터를 포함하여 처음부터 다시 훈련해야 한다. 이는 컴퓨팅 자원과 시간 소모가 심하다는 문제점이 있다.
online learning
-> *incremental learning
일반화가 어떻게 되느냐?!
instance-based learning
: 시스템이 훈련 샘플을 기억함으로써 학습하고, similarity를 측정하여 새로운 데이터와 학습한 샘플을 비교하는 식으로 일반화함
예를 들어 새 이미지 샘플 주변에 고양이 label 2개, 강아지 label 1개가 있다면 그 샘플은 고양이로 분류될 것임
model-based learning
: model selection을 한 뒤 model parameter를 조정하는 과정, 즉 training 단계를 통해 최적의 파라미터를 찾아서 prediction을 하는 것
-> 머신러닝 프로젝트의 전형적인 형태!
ML의 주 과제는 적절한 모델을 선택하고, 여기에 데이터를 넣어 학습하는 것이므로 만약 원하는 결과가 나오지 않았다면 그건 "bad algorithm"과 "bad data" 때문일 것이다. 구체적으로 살펴보자.
대부분의 알고리즘이 잘 작동하려면 충분한 양의 데이터가 필요하다.
sampling bias의 유명한 예시가 가장 이해하기 쉽다. 1936년에 미국 대통령 선거 전에 Landon과 Roosevelt 중 누구를 뽑을 거냐는 여론 조사에서는 Landon이 57%로 높았지만 실제 선거 결과 Roosevelt가 62%로 더 높았다는 것이다. 이 둘 사이에 왜 이런 차이가 나왔냐 하면 바로 여론 조사가 전화번호부, 잡지 구독자, 클럽 멤버십 리스트와 같이 Landon이 속한 Republican을 뽑을 가능성이 높은 부유한 사람들을 대상으로 하였고(의도치 않았지만), 여론 조사 연락이 간 사람들 중 단 25%만이 응답을 했기 때문이다. 이는 유권자 전체가 아닌 일부를 대상으로 시행되었기 때문에 샘플링 편향이 발생하여 실제 결과와는 달랐던 것이다.
따라서 데이터를 가져올 때는 bias가 발생하지 않았는지, 내가 일반화하고자 하는 케이스들을 대표하는지 확인해보아야 한다.
데이터에 error, outlier, noise(측정 장비 결함으로 인한)가 있다면 처리를 해줘야 한다.
훈련 데이터에 관련 없는 특성이 적고 관련 있는 특성이 충분해야 시스템이 학습을 성공적으로 할 수 있다.
-> *feature engineering
: 훈련 데이터에 과하게 적합한 것
해결 방법으로는 regulation이 있다. 다음 블로그는 그 중 일부를 다루고 있다. -> regulation
훈련 데이터에서 underfitting할 때 우선 과제는 훈련 데이터에 적합하게끔 모델을 만드는 것이다. 모델을 더 복잡하게 만들기, 학습 알고리즘에 더 나은 feature 이용하기(feature engineering), 하이퍼파라미터를 조절하여 모델에 가해진 constraint 줄이기 등으로 해결할 수 있다.
좋은 모델이란 데이터에 대해 generalization이 잘 되는 것이다. 그러므로 우리는 주어진 데이터를 training set과 test set으로 나누어 학습과 테스트를 각각 진행한다. 테스트 세트로 모델을 평가하면 새로운 샘플에 대한 오차 비율을 의미하는 generalization error 또는 out-of-sample error을 얻게 되는데 이를 통해 일반화 성능을 확인할 수 있다. 만약 훈련 세트에 대한 오류가 작은데 일반화 오류가 크다면 이건 overfitting인 상황을 의미한다.
그런데 테스트 세트라도 이에 대해 여러 번 테스트하여 모델을 수정하면, 결국 테스트 세트에 과적합된 모델이 만들어질 위험이 있다. 그래서 등장하는 해결 방법이 바로 holdout validation이다. 이는 훈련 세트의 일부를 떼어내어 validation set으로 만든 뒤, test set을 이용하여 모델을 평가하기 전에, 모델을 검증해보는 것이다. 이걸 여러 번 반복하는 걸 cross validation이라고 하는데 이에 대해서는 cross validation을 참고하자.
예를 들어 꽃 사진으로부터 꽃 이름을 자동으로 찾아주는 앱을 만든다고 하자. 이때 모델을 학습하는 자료로 웹에서 많은 자료들을 가져올 수 있지만, 이는 실제로 찍은 사진을 완전히 대체하지는 못할 것이다. 그렇기 때문에 웹에서 다운로드한 사진으로 학습을 하고 실제 사진으로 모델의 성능을 측정하면 결과가 매우 안 좋을 것이다.
이를 해결하기 위해 훈련 세트 일부를 떼어내 train-dev set이라고 하고, 훈련 세트에서 학습하고 train-dev set으로 검증해보자. 만약 train-dev set에 대해 잘 작동하지 않으면 훈련 세트에 overfitting한 것이고, 잘 작동한다면 검증 세트에서 평가하면 된다. 만약 검증 세트에 대해서 성능이 나쁘다면 data mismatch 문제이므로 웹 이미지를 앱에서 찍은 이미지처럼 보이도록 전처리를 해야 한다.
출처: Hands-On Machine Learning by Aurelien Geron