본문 바로가기
밑바닥 딥러닝/딥러닝 개념

회귀 vs 분류 개념과 알고리즘 종류

by sxlvxrjxms2s2itsmes2s2 2023. 7. 13.

지도 학습의 종류에는 귀(Regression)분류(Classification)가 있다. 이 둘은 비슷한 개념이지만 서로 다른 종류의 출력값을 내놓는 모델을 학습하는 데에 차이가 있다.

 

우리가 사용하는 데이터는 이산적인 값이나 연속적인 값을 갖는 데이터이다.

이산적인 값은 값이 연속적으로 분포하지 않는 데이터이다. (유무 데이터, 상표명, 상품 종류 등)

이 외는 모두 연속적인 값을 갖는다고 한다. (확률 데이터, 나이와 주거지를 바탕으로 소득 예측 등)

 

분류는 미리 정의된 여러 클래스 레이블 중 하나를 예측한다. 입력 값들이 출력 값의 클래스에 얼마나 정확도를 보이는가를 파악하고 가장 정확도가 높은 클래스로 분류한다.

 

회귀는 그래프에 마구잡이로 분포하는 값을 평균제곱오차 등을 이용해 분포하는 값들을 가장 잘 나타내는 중앙 값들을 뽑아 회귀 선을 그린다. 

 

회귀모델은 예측 값으로 연속적인 값을 출력, 분류모델은 예측 값으로 이산적인 값을 출력한다.

 

분류와 회귀모델에 대한 알고리즘을 알아보자

분류 알고리즘

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

yes / no 처럼 두 가지로 나뉘는 이진 분류 문제를 다룬다.

입력 변수와 출력 변수 사이의 로지스틱 함수를 통해 확률을 추정한다.

 

로지스틱 함수: 입력 변수들의 가중치와 편향을 조합해 출력을 0과 1 사이의 값으로 확률 값으로 계산한다.

그 후 임계값을 기준으로 이진 예측을 수행한다.

로지스틱 함수

학습은 주로 최대 가능도 추정(Maximum Likelihood Estimation) 방법을 사용하여 수행된다. 최적의 가중치와 편향을 찾기 위해 로그 우도 함수를 최대화하는 방향으로 모델을 훈련시킨다.

+) 로지스틱 회귀는 이진 분류 문제뿐만 아니라 다중 클래스 분류 문제에도 일반화될 수 있다. 이를 다중 로지스틱 회귀 또는 소프트맥스 회귀라고 한다. 다중 클래스 분류에서는 소프트맥스 함수를 사용해 여러 개의 클래스에 대한 확률을 계산하고 가장 높은 확률을 갖는 클래스를 예측한다.

 

2. 나이브 베이즈 (Naive Bayes)

베이즈 정리를 적용한 조건부 확률 기반의 분류 모델 (무료라는 단어가 들어 있을 때 해당 메일이 스팸일 확률)

딥러닝 같은 대안이 있어서 나이브 베이즈 모델을 쓰고자 하는 상황이 많지는 않지만, 그래도 스팸 메일 필터처럼 자연어 처리가 목적일 때는 여전히 나이브 베이즈 모델이 좋은 선택이 될 수 있다. (딥러닝이 자연어 처리에 더 탁월한 모습을 보여주지만, 딥러닝보다 간단한 방법으로 자연어 처리를 원할 때)

나이브 베이즈의 동작 방식:

  • 데이터의 사전 확률 계산: 주어진 학습 데이터에서 각 클래스의 사전 확률을 계산. 사전 확률은 각 클래스가 발생할 확률로, 해당 클래스에 속한 데이터 포인트의 비율로 추정된다.
  • 조건부 확률 모델링: 입력 변수와 클래스 간의 조건부 확률 분포를 추정. 나이브 베이즈는 입력 변수들이 조건부 독립을 가정하므로, 각 입력 변수의 클래스 조건부 확률을 개별적으로 모델링한다. 베이즈 정리를 사용하여 클래스가 주어졌을 때 입력 변수의 조건부 확률을 계산한다.
  • 예측 클래스 결정: 주어진 입력 변수에 대해 모든 클래스의 조건부 확률을 계산하고, 가장 높은 확률을 가진 클래스를 예측 클래스로 결정. 즉, 입력 변수가 주어졌을 때 각 클래스가 발생할 확률을 계산하고, 가장 높은 확률을 가지는 클래스를 선택한다.

 

회귀 알고리즘

1. 선형 회귀 (Linear Regression)

입력 변수와 출력 변수간의 선형 관계를 모델링

단순 선형 회귀: 단순 선형 회귀에서는 하나의 입력 변수와 하나의 출력 변수 간의 선형 관계를 모델링. 이 때, 입력 변수와 출력 변수 사이의 선형 함수의 파라미터(기울기와 절편)를 추정하는 것이 목표.

다중 선형 회귀: 다중 선형 회귀에서는 둘 이상의 입력 변수와 하나의 출력 변수 간의 선형 관계를 모델링. 각 입력 변수와 출력 변수 사이의 가중치(회귀 계수)를 추정하여 선형 함수를 구성.

선형 회귀의 동작 방식:

  • 모델 파라미터 추정: 주어진 훈련 데이터를 기반으로 선형 회귀 모델의 파라미터를 추정. 파라미터는 입력 변수와 출력 변수 간의 관계를 설명하는 회귀 계수(가중치)와 절편으로 구성된다.
  • 손실 함수 최소화: 선형 회귀에서는 주로 평균 제곱 오차(Mean Squared Error)를 최소화하는 방향으로 파라미터를 조정. 손실 함수는 예측 값과 실제 값 사이의 차이를 측정하며, 이를 최소화하는 방향으로 회귀 계수를 업데이트한다.
  • 예측값 생성: 학습된 회귀 모델을 사용하여 새로운 입력 변수에 대한 출력 변수 값을 예측한다. 선형 함수의 파라미터와 입력 변수를 곱하고 절편을 더하여 예측 값을 계산한다.

 

분류 / 회귀

1. 결정 트리 (Decision Trees)

 root에서부터 적절한 node를 선택하면서 진행하다가 최종 결정을 내리게 되는 model이다.

가지고 있는 데이터의 Feature를 분석해서 Tree를  Build하는 과정이 제일 중요하다.

분류 문제에서는 입력 데이터를 사전 정의된 클래스 또는 범주로 분류하고, 회귀 문제에서는 연속적인 출력 값을 예측한다.

 

결정 트리는 루트 노드(root node), 내부 노드(internal node), 리프 노드(leaf node)로 이루어진 트리 형태의 구조를 가지고 있다. 각 노드는 특정한 특성(feature)을 기준으로 데이터를 분할하며, 리프 노드는 예측 결과를 담고 있다.

 

결정 트리의 동작 방식: 

  • 데이터 분할: 루트 노드에서부터 시작하여 특정한 특성을 기준으로 데이터를 분할. 분할은 해당 특성의 값에 따라 데이터를 서브 그룹으로 나누는 과정이다.
  • 분할 기준 선택: 분할할 때 사용되는 기준은 다양한 지표 중 하나로 선택된다. 주로 사용되는 기준은 지니 불순도(Gini impurity)와 엔트로피(entropy)이다. 이러한 기준은 분할 후 각 서브 그룹의 순도를 최대화하거나 불순도를 최소화하는 방향으로 선택된다.
  • 재귀적 분할: 데이터를 분할한 후에는 각 서브 그룹에 대해 동일한 분할 과정을 재귀적으로 반복. 이렇게 함으로써 결정 트리는 계층적으로 구성된 분류 규칙을 학습하게 된다.
  • 정지 조건: 재귀적 분할은 일정한 깊이나 노드의 샘플 개수, 또는 불순도 등의 정지 조건을 만족할 때까지 진행한다. 이렇게 함으로써 과적합(overfitting)을 방지하고 일반화 성능을 향상시킨다.

 

2. 랜덤포레스트

Decision tree가 여러개 모여 Forest를 이룬 것이다.

Decision tree보다 작은 Tree가 여러개 모이게 되어, 모든 트리의 결과들을 합하여 더 많은 값을 최종결과로 본다.

각각의 의사결정 트리(Decision tree)는 독립적으로 학습되며, 예측 결과를 조합해 최종 예측을 수행한다.

 

 랜덤 포레스트의 동작 방식:

  • 의사결정 트리의 구성: 랜덤 포레스트는 여러 개의 의사결정 트리를 구성한다. 각 트리는 데이터의 무작위 부분 집합인 랜덤 샘플(bootstrap sample)과 무작위로 선택된 특성의 부분 집합을 사용하여 독립적으로 학습된다.
  • 부트스트랩 샘플링: 각 의사결정 트리를 학습하기 위해 무작위로 데이터를 선택하는데, 이를 부트스트랩 샘플링(bootstrap sampling)이라고 한다. 부트스트랩 샘플링은 원본 데이터셋에서 중복을 허용하여 샘플을 선택하는 과정으로, 각 트리는 다양한 데이터셋을 이용해 학습할 수 있다.
  • 특성 선택: 의사결정 트리를 학습할 때 모든 특성을 고려하는 것이 아니라, 무작위로 선택된 일부 특성들만 사용한다. 이를 통해 트리들 간의 상관관계를 줄이고 다양한 특성들의 영향력을 고려할 수 있다.
  • 의사결정 트리 학습: 부트스트랩 샘플과 선택된 특성을 사용하여 각 의사결정 트리를 독립적으로 학습. 각 노드에서는 기존의 의사결정 트리와 동일한 방식으로 최적의 분할 기준을 찾아 데이터를 분할한다.
  • 예측 결합: 모든 의사결정 트리가 학습을 완료하면, 새로운 입력 데이터에 대한 예측을 각 트리에 적용한다. 분류 문제의 경우 투표(voting) 또는 평균화(averaging) 방식을 사용하여 다수결로 최종 클래스를 결정하고, 회귀 문제의 경우 각 트리의 예측 값을 평균하여 최종 예측 값을 구한다.

 

3. KNN (k-nearest neighbor)

새로운 데이터 포인트의 카테고리를 결정할 때 K 개의 가장 가까운 포인트를 선점하고 그중 가장 많이 선택된 포인트의 카테고리로 이 새로운 데이터를 분류하는 방법

k-nearest neighbor에서 고려해야 할 사항은 알고리즘의 핵심 부분은 대상 포인트와의 거리에 대한 측정이고 이를 계산하는 방법으로 거리 계산 알고리즘을 사용한다. (예를 들어 실수 데이터의 경우 유클리드 거리 측정 방식을 사용하고, 범주형 혹은 이진 데이터와 같은 유형의 데이터는 해밍 거리 측정 방식을 사용한다.)

 

 KNN의 동작 방식:

  • 데이터 포인트 간의 거리 계산: 주어진 입력 데이터와 모든 훈련 데이터 간의 거리를 계산. 일반적으로 유클리디안 거리(Euclidean distance)가 사용되며, 다른 거리 측정 방법도 선택할 수 있다.
  • 가장 가까운 이웃 선택: 계산된 거리를 기반으로 가장 가까운 K개의 이웃을 선택합니다. K는 사용자가 지정하는 하이퍼파라미터로, 일반적으로 홀수로 선택하여 다수결이나 평균화 방식을 적용할 때 불확실성을 줄인다.
  • 분류: 분류 문제의 경우, K개의 이웃의 클래스를 확인하고 다수결 투표를 통해 새로운 데이터 포인트의 클래스를 결정. 가장 많은 이웃이 속한 클래스로 분류된다.
  • 회귀: 회귀 문제의 경우, K개의 이웃의 출력 값을 평균하여 새로운 데이터 포인트의 예측 값으로 사용. 즉, K개의 이웃의 평균 값을 회귀 예측으로 사용한다.

 

4. SVM(Support Vector Machines)

SVM은 데이터를 고차원 공간으로 매핑한 후, 클래스 간의 가장 큰 margin을 갖는 결정 경계(분류) 또는 최적의 회귀선(회귀)을 찾는다.

 

선형 분리 가능한 경우: SVM은 데이터를 선형으로 완벽하게 분리할 수 있는 결정 경계를 찾는다. 이를 위해 두 클래스 간의 간격(마진)을 최대화하는 초평면(hyperplane)을 찾는다.

선형 분리 불가능한 경우: 데이터가 완벽하게 선형으로 분리되지 않는 경우, SVM은 소프트 마진(Soft Margin) 방법을 사용. 일부 이상치나 오분류된 데이터를 허용하면서도 최대 마진을 찾는 방식.

 

SVM의 동작 방식:

  • 데이터를 고차원 공간으로 매핑: SVM은 데이터를 고차원 공간으로 매핑하는 함수를 사용하여 데이터를 변환. 이를 통해 원래의 특성 공간에서는 선형 분리할 수 없는 데이터를 고차원 공간에서는 선형 분리할 수 있는 경우가 발생할 수 있다. 이러한 함수를 커널(kernel)이라고 부르며, 주로 사용되는 커널 함수에는 선형, 다항식, 가우시안(RBF), 시그모이드 등이 있다.
  • 최대 마진 결정 경계 찾기: SVM은 데이터를 고차원 공간으로 매핑한 후, 클래스 간의 가장 큰 마진을 갖는 결정 경계를 찾는다. 이 결정 경계는 클래스 간의 경계에 가장 가까운 데이터 포인트인 서포트 벡터(support vector)에 의해 정의된다.
  • 손실 함수 최소화: SVM은 손실 함수를 최소화하는 방향으로 결정 경계를 학습. 손실 함수에는 분류 문제의 경우 힌지 손실(hinge loss) 함수가, 회귀 문제의 경우 평균 제곱 오차(Mean Squared Error) 함수가 사용다.

 

5. 그래디언트 부스팅

그래디언트 부스팅은 앙상블 학습의 일종이다. 여러 개의 약한 예측 모델을 결합해 강력한 예측 모델을 만든다. 그래디언트 부스팅은 오차의 그래디언트(경사)를 이용하여 예측 모델을 순차적으로 개선해나간다.

 

그래디언트 부스팅의 동작 방식:

  • 초기 모델 학습: 첫 번째 예측 모델(일반적으로는 결정 트리)을 학습. 이 모델은 초기 예측 값을 제공하고, 이후 예측 오차를 보정해 나갈 예정이다.
  • 예측 오차 계산: 초기 모델을 통해 예측한 결과와 실제 타깃 값 간의 오차를 계산. 이 예측 오차를 보정하기 위해 새로운 예측 모델을 학습할 것이다.
  • 그래디언트 계산: 예측 오차에 대한 그래디언트(경사)를 계산. 그래디언트는 예측 오차에 대한 미분 값으로, 오차를 어떤 방향으로 보정해야 하는지 알려준다.
  • 새로운 모델 학습: 이전 모델의 예측 오차에 대한 그래디언트를 기반으로 새로운 예측 모델을 학습. 이 모델은 예측 오차를 보정하는 역할을 수행하며, 이전 모델의 예측 결과와 실제 타깃 값 간의 오차를 줄이기 위해 학습된다.
  • 예측값 업데이트: 새로운 모델을 추가한 후, 이전 모델들의 예측 결과에 새로운 모델의 예측 결과를 더하여 예측값을 업데이트. 이렇게 함으로써 예측 오차를 보정하고 예측 성능을 개선한다.
  • 반복: 2단계부터 5단계까지의 과정을 반복하여 모델을 추가하고 예측 오차를 보정해 나간다. 이 과정은 미리 정의한 반복 횟수나 예측 오차의 감소가 미미할 때까지 계속한다.

그래디언트 부스팅에 종류에는 XG부스트, 라이트GBM(LightGBM), 캣부스트(CatBoost) 등이 있다. 그중 XGBoost(Extra Gradient Boost)가 가장 먼저 개발되기도 했고, 가장 널리 활용되고 있다

 

6. XG부스트

그래디언트 부스팅(Gradient Boosting) 알고리즘의 확장된 형태

XG부스트는 Regularization을 식에 추가해 과적합되지 않도록 심플하게 만들어준다.

예시 그래프

XG부스트의 동작 방식:

  • XGBoost는 트리 모델을 순차적으로 학습시키는 과정을 거친다. 초기에는 단순한 결정 트리 모델을 사용하고, 이후 반복적으로 새로운 트리를 추가하여 예측 오차를 보정한다.
  • 손실 함수 최적화: XGBoost는 손실 함수를 최적화하여 트리를 학습시킨다. 일반적으로는 평균 제곱 오차(Mean Squared Error)를 사용하지만, 다른 손실 함수도 선택할 수 있다. 손실 함수의 그래디언트(경사)를 기반으로 트리의 가중치를 조정하고, 예측값을 업데이트한다.
  • 정규화와 복잡성 제어: XGBoost는 트리의 복잡성을 제어하고, 과적합을 방지하기 위해 정규화(regularization) 기법을 사용. 이를 위해 트리의 깊이, 리프 노드 개수, 가지치기 등의 파라미터를 조정할 수 있다.
  • 조기 종료: XGBoost는 조기 종료(early stopping) 메커니즘을 제공하여 과적합을 방지하고 효율적인 학습을 도모한다. 학습을 반복하는 동안 검증 데이터셋의 손실이 더 이상 개선되지 않을 때 학습을 조기 종료시킨다.

 

7. 라이트GBM

XG부스트와 다르게 트리의 뿌리를 조금 더 깊게 내릴 수 있다.

XGboost는 뿌리를 level 단위로 학습을 해나가지만 KightGBM은 뿌리를 leaf단위로 학습해 나가기 때문에 뿌리가 더 깊이 내려간다.

 

라이트 GBM 동작 방식:

  • 경사 기반 학습: 라이트GBM은 경사 기반 학습(Gradient-based Learning)을 사용하여 트리의 분할을 수행한다. 경사 기반 학습은 손실 함수의 그래디언트(경사)를 기반으로 트리를 구성하고, 예측 오차를 줄이는 방향으로 모델을 업데이트한다.
  • 최적 분할 선택: 라이트GBM은 효율적인 트리 분할을 위해 최적 분할을 선택하는 기법을 채택한다. 특징 중요도와 그래디언트 정보를 사용하여 분할 후의 손실 함수 감소량을 계산하고, 가장 큰 감소량을 가진 분할을 선택한다.
  • 특성 병렬 학습: 라이트GBM은 데이터의 특성 병렬 학습을 지원합니다. 특성 단위로 병렬 처리를 수행하여 학습 시간을 단축시킨다.
  • 조기 종료: 라이트GBM은 조기 중단 메커니즘을 제공하여 과적합을 방지하고 효율적인 학습을 도모한다. 학습을 반복하는 동안 검증 데이터셋의 손실이 개선되지 않을 때 학습을 조기 종료시킨다.

 

분류 모델을 회귀 모델로 변환해보자

 

분류에서 회귀로 코드를 변환하는 경우 주요한 변환 사항

  1. 손실 함수 변경: 분류 문제에서는 일반적으로 크로스 엔트로피(Cross-Entropy) 손실 함수를 사용하지만, 회귀 문제에서는 평균 제곱 오차(Mean Squared Error)나 평균 절대 오차(Mean Absolute Error)와 같은 회귀용 손실 함수를 사용해야 한다. 따라서 코드에서 손실 함수를 변경해야 한다.
  2. 출력 뉴런 수 변경: 분류 문제에서는 출력 뉴런의 수가 클래스의 개수에 해당하지만, 회귀 문제에서는 예측하려는 연속적인 값을 출력해야 하므로 출력 뉴런의 수를 1로 변경해야 한다.
  3. 활성화 함수 변경: 분류 문제에서는 출력 뉴런에 소프트맥스(Softmax) 활성화 함수를 사용하여 클래스별 확률을 얻지만, 회귀 문제에서는 활성화 함수를 사용하지 않거나 선형 활성화 함수를 사용해야 한다. 선형 활성화 함수는 출력 값을 직접 나타내는데 도움이 된다.
  4. 데이터 전처리 변경: 분류 문제에서는 주로 레이블을 원-핫 인코딩하여 처리하지만, 회귀 문제에서는 레이블을 그대로 사용하거나 필요에 따라 스케일링 등의 전처리를 수행해야 한다.

    이러한 변경 사항을 고려하여 코드를 수정하면 분류에서 회귀로의 변환이 이루어진다. 주의해야 할 점은 데이터의 특성에 따라 적합한 손실 함수와 활성화 함수를 선택하는 것이고 또한, 데이터의 스케일이나 전처리 방법도 회귀 문제에 맞게 조정해야 한다.

EX)

분류 : 손실함수 크로스 엔트로피, 출력뉴런 여러가지, 활성화함수 softmax
회귀 : 손실함수 mse, 출력 뉴런 1로, 활성화함수 선형으로

 

 

'밑바닥 딥러닝 > 딥러닝 개념' 카테고리의 다른 글

CNN(Convolutional neural network)_개념  (0) 2023.06.30