지극히 개인적인 공부 노트/인공지능(AI)

[인공지능] 머신러닝 '지도 학습' 알고리즘 정리

AS J 2021. 4. 30. 18:46

현재 공부를 시작한 단계에 불과하며, 차근차근 공부한 머신러닝 알고리즘의 방식과 특징 등을 정리해나가는 게시글이다.

기술하는 내용은 모두 Python 기반이다.

 

 

< 지도 학습 알고리즘(Supervised learning) >

- 지도 학습 알고리즘은 사용 용도와 목적에 따라 '분류'(샘플을 몇 개의 클래스 중 하나로 분류)와 '회귀'(임의의 어떤 숫자를 예측)로 나뉜다.

- 대부분의 모델에는 훈련 과정에서 찾은 최적의 모델 파라미터(coef_와 intercept_)가 존재한다. 많은 머신러닝 알고리즘의 훈련 과정은 이 최적의 파라미터를 찾는 것이고, 이런 과정을 '모델 기반 학습'이라고 부른다.

- k-최근접 이웃 알고리즘은 모델 파라미터가 따로 존재하지 않고, 단순히 훈련 세트를 저장하는 것이 훈련의 전부이기 때문에 '사례 기반 학습'이라고 부른다.

- 위 파라미터 중 coef_는 머신러닝에서 기울기를 의미하며, 종종 계수(coefficient) 또는 가중치(weight)라고 부른다.

- 머신러닝 모델이 학습할 수 없고, 사람이 직접 지정해야 하는 파라미터를 하이퍼파라미터(hyperparameter)라고 부른다. 대표적으로 릿지와 라쏘의 규제 강도 alpha 파리미터가 있다.

 

1. k-최근접 이웃(k-Nearest Neighbors)

1) 가장 간단한 머신러닝 알고리즘으로써, 특정 규칙을 찾는 것보단 전체 데이터를 메모리에 갖고 있는 기능이 전부인 알고리즘이다.

2) 가장 가까운 n개(n은 클래스에서 매개변수로써 지정 가능)의 데이터를 보고 다수결의 원칙, 평균에 따라 데이터를 예측한다.

from sklearn.neighbors import KNeighborsClassifier	#k-최근접 이웃 '분류' 알고리즘을 구현한 클래스를 임포트
from sklearn.neighbors import KNeighborsRegressor	#k-최근접 이웃 '회귀' 알고리즘을 구현한 클래스를 임포트

함수

kneighbors(): 입력 받은 임의의 샘플 데이터에서 가장 가까운 이웃의 거리(distance), 위치(index)를 반환해주는 함수.

distances, indexes = kn.kneighbors([[25, 150]])	#kn은 임의로 지정한 모델명, 수치도 임의의 예시

매개변수

p: 거리를 재는 방법을 지정하는 매개변수. 1일 경우 맨해튼 거리, 2일 경우 유클리디안 거리를 사용하며, 기본값은 2이다.

n_neighbors: 가장 가까운 이웃(분석, 판단에 사용할 데이터)의 개수를 지정하는 매개변수. 기본값은 5이다.

n_jobs: CPU 코어 수를 지정하는 매개변수. -1일 경우 모든 CPU를 사용하며, k-최근접 이웃 모델의 경우엔 이웃 간의 거리 계산 속도를 높일 수 있음. 하지만, 대부분의 경우 크게 영향이 없기 때문에 지정하지 않는다. 기본값은 1이다.

 

 

2. 선형 회귀(Linear Regression)

1) 널리 사용되는 대표적인 회귀 알고리즘이다.

2) 비교적 간단하고, 성능이 뛰어난 편에 속한다.

3) 속성 변수 coef_와 intercept_를 통해 가중치과 절편을 확인할 수 있다.

4) 이 선형 회귀 알고리즘에 다중 회귀, 릿지, 라쏘 등의 알고리즘이 포함된다.

from sklearn.linear_model import LinearRegression	#선형 회귀 알고리즘을 구현한 클래스를 임포트

 

 

3. 다중 회귀(Multiple Regression)

1) 여러 개의 특성을 사용한 선형 회귀 알고리즘이다.

2) 특성이 많을수록 더 강력한 성능을 발휘하기 때문에 특성 공학 작업을 하기도 한다.

from sklearn.preprocessing import PolynomialFeatures	#특성을 만들거나 전처리하기 위해 제공하는 클래스로, 변환기(transformer)라고 부름. fit('입력 데이터')과 transform('입력 데이터') 함수를 제공함.
from sklearn.preprocessing import StandardScaler	#평균과 표준편차를 구하여, 특성을 표준점수로 바꾸는 변환기 클래스 중 하나

 

 

4. 로지스틱 회귀(Logistic Regression)

1) 이름은 회귀지만, 대표적인 분류 알고리즘 중 하나로 쓰인다. 이유는 선형 회귀처럼 선형 방정식을 사용하지만, 여기서 계산된 값을 그대로 출력하는 것이 아닌, 0~1 사이의 값으로 압축해서 출력하기 때문에 확률을 가지는 분류 모델로 이해할 수 있기 때문이다.

2) 시그모이드 함수를 사용한 이중 분류, 소프트맥수 함수를 사용한 다중 분류가 있다.

from sklearn.linear_model import LogisticRegression	#로지스틱 회귀 알고리즘을 구현한 클래스를 임포트

함수

predict_proba(): 훈련 세트를 입력으로 받으며, 이진 분류의 경우에는 샘플마다 음성, 양성 클래스에 대한 확률을, 다중 분류의 경우에는 샘플마다 모든 클래스에 대한 확률을 반환하는 함수.

decision_function(): 훈련 세트를 입력으로 받으며, 모델이 학습한 선형 방정식의 출력을 확률로 반환하는 함수.


매개변수

solver: 사용할 알고리즘을 선택하는 매개변수. 기본값은 '1bfgs'이며, 확률적 평균 경사 하강법 알고리즘인 'sag', 'sag'의 개선 버전인 'sega'가 있다.

penalty: L2 규제(릿지 방식), L1 규제(라쏘 방식)을 선택하는 매개변수로, 기본값은 L2를 의미하는 'l2'이다.

C: 규제의 강도를 제어하는 매개변수. 기본값은 1.0이며, 값이 작을수록 규제가 강해진다.

 

 

5. 확률적 경사 하강법(Stochastic Gradient Descent)

1) 손실 함수라는 산을 정의하고, 가장 가파른 경사를 따라 조금씩 내려오는 방식의 알고리즘

2) 신경망 모델에서도 다뤄지는 알고리즘이며, 분류와 회귀가 있다.

3) 점점 데이터의 크기가 방대해지고, 계속해서 업데이트, 증가하는 데이터의 경우에 그 데이터를 점진적으로 꾸준히 학습하는 방법이 필요하다. 그리고 이 경우에 유리한 방법이 확률적 경사 하강법이다.

from sklearn.linear_model import SGDClassifier	#확률적 경사 하강 분류 알고리즘을 구현한 클래스를 임포트
from sklearn.linear_model import SGDRegressor	#확률적 경사 하강 회귀 알고리즘을 구현한 클래스를 임포트

매개변수

loss: 확률적 경사 하강법으로 최적화할 손실 함수를 지정하는 매개변수. 기본값은 분류에서는 'hinge'(서포트 벡터 머신을 위한 손실 함수), 회귀에서는 'squared_loss'(제곱 오차)이다. 로지스틱 회귀를 위해서는 'log'로 지정해야 한다.

penalty: 규제의 종류를 지정하는 매개변수. 기본값은 'l2'이다.alpha: 규제 강도를 지정하는 매개변수. 기본값은 0.0001이다.

max_iter: 에포크 횟수를 지정하는 매개변수. 기본값은 1000이다.

tol: 반복을 멈출 조건을 지정하는 매개변수. 기본값은 0.001이다.

n_iter_no_change: 이 매개변수에서 지정한 에포크 동안 손실이 tol만큼 줄어들지 않을 경우 알고리즘을 중단한다. 기본값은 5이다.

 

 

6. 결정 트리(Decision Tree)

1) 신경망 모델을 제외하고 머신러닝에서 가장 뛰어난 성능을 내는 알고리즘

2) 스무고개와 비슷한 원리로, 각 데이터를 질문에 따라 '예/아니오'로 구분해서 데이터를 분류, 분석한다. 이런 부분에서 데이터 분석 이유와 결과를 설명하기 쉽다.

3) 결정 트리가 최적의 질문을 찾기 위한 기준은 '불순도'(지니 불순도와 엔트로피 불순도가 제공됨)이고, 부모 노드와 자식 노드의 불순도 차이를 '정보 이득'이라 한다. 결정 트리 알고리즘은 이런 정보 이득이 최대화되도록 학습한다.

4) '특성 중요도'란 결정 트리에 사용된 특성이 불순도를 감소하는데 기여한 정도를 나타내는 값이다. 이를 계산해서 나타낼 수 있다는 점이 결정 트리의 큰 장점 중 하나이다. 특성 중요도는 feature_importances_ 속성에 저장된다.

from sklearn.tree import DecisionTreeClassifier	#결정 트리 알고리즘을 구현한 클래스를 임포트

매개변수

criterion: 불순도를 지정하는 매개변수. 'gini'와 'entropy'가 있다.

splitter: 노드를 분할하는 전략을 선택하는 매개변수. 기본값은 'best'로 정보 이득이 최대가 되도록 분할하고, 'random'이면 임의로 분할한다.

max_depth: 트리가 성장할 최대 깊이를 지정하는 매개변수. None일 경우 리프 노트가 순수하거나, min_samples_split보다 샘플 개수가 적을 때까지 성장한다.

min_samples_split: 노드를 나누기 위한 최소 샘플 개수를 지정하는 매개변수. 기본값은 2이다.

max_features: 최적의 분할을 위해 탐색할 특성의 개수를 지정하는 매개변수. 기본값은 None으로 모든 특성을 사용한다.

 

 

< 참고 >

1. '데이터 전처리'는 머신러닝 모델에서 데이터 주입 전 가공하는 단계를 뜻한다. 이 과정 속엔 스케일 조정도 있는데, 스케일 조정 방식( ex) 표준점수)으로 각 훈련 데이터의 스케일을 맞추어야 오류를 줄일 수 있다.

2. 과대적합 & 과소적합

1) 과대적합: 훈련 세트에 대한 점수(score, 결정계수)는 굉장히 좋지만, 테스트 세트의 점수가 굉장히 나쁘게 나왔을 때, 모델이 훈련 세트에 과대적합되었다고 말한다. 즉, 훈련 세트에만 잘 맞추어진 모델이고, 테스트 세트와 추후 실전에 투입했을 때 잘 동작하지 않을 것으로 예상되는 모델이다. 이 경우, 모델을 조금 더 단순하게 만들거나, 부분이 아닌 더 넓은 범위에서 거시적으로 볼 수 있도록 설장하는 방법이 있다.

2) 과소적합: 과대적합과 반대로 훈련 세트보다 테스트 세트의 점수가 높거나, 둘의 점수 모두 현저히 낮게 나오는 경우이다. 이런 경우는 모델이 너무 단순하거나 적절히 훈련되지 않았을 때, 세트의 크기가 매우 작을 때 발생한다. 이 경우, 모델을 조금 더 복잡하게 만들거나, 데이터에 민감하게 설정하여 훈련해보는 방법이 있다.

3. 특성 공학 & 규제

1) 특성 공학(feature engineering): 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업

2) 규제: 머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것. 선형 회귀 모델에 규제를 추가한 모델을 '릿지'(ridge)와 '라쏘'(lasso)라고 부른다. 릿지는 계수를 제곱한 값을 기준으로, 라쏘는 계수의 절댓값을 기준으로 규제를 적용한다. 두 알고리즘 모두 계수의 크기를 줄이지만, 라쏘는 아예 0으로 만들 수도 있기 때문에 일반적으로 릿지를 조금 더 선호한다. 규제는 alpha라는 매개변수로 규제의 강도를 조절할 수 있다.

4. 교차 검증: 기존의 훈련 세트와 테스트 세트에서 추가로 다시 훈련 세트를 서브 훈련 세트와 검증 세트로 나누는 것이다.

ex) 기존 데이터(1)를 훈련 세트(0.8)와 테스트 세트(0.2)로 나눔.(8대 2 비율) 이후 다시 0.8인 훈련 세트를 8대 2로 나누어서 총 서브 훈련 세트(0.64), 검증 세트(0.16), 테스트 세트(0.2)와 같이 나누는 것.

이런 과정은 데이터가 많은 경우에 유리하고, 마지막 테스트 이전에 보다 더 좋은 모델을 시뮬레이션 해보고 선택하기 위한 과정이다.

5. 하이퍼파라미터 튜닝: 사람의 개입 없이 이 튜닝을 자동으로 수행하는 기술을 'AutoML'이라고 부른다. 사이킷런의 그리드서치(GridSearchCV) 클래스를 통해 교차 검증과 하이퍼파라미터 탐색을 한 번에 수행할 수 있다.