논리 회귀에 대해서

장현웅·2023년 10월 18일
0

🥚 선형 회귀와 논리 회귀


선형 회귀(Linear Regression)는 날씨 데이터(온도, 습도 등)을 사용해서 내일의 날씨를 예측하는 문제, 기업의 제품 기대 매출을 예측하는 문제 또는 공부한 시간을 바탕으로 시험 점수를 예측하는 문제 등의 문제를 푸는데 적합한 방법입니다.

논리 회귀(Logistic Regression)는 '이 문제에 대한 사용자의 입력값이 정답인가요?' 또는 '대학교 시험 전 날 공부한 시간을 가지고 해당 과목의 이수 여부(Pass or fail)를 예측하는 문제'와 같은 분류 문제를 해결하는 데 적합한 선택입니다.

일반적으로 회귀 알고리즘은 연속적인 출력 값을 예측하는 데 사용되지만, 논리 회귀는 이름만 회귀(regression)이고 실제로는 분류(classification) 문제를 다루는 알고리즘으로 주어진 입력값을 기반으로 두 가지 이상의 범주 중 하나로 분류하는데 사용됩니다.

머신 러닝에서, 논리 회귀는 입력값과 범주 사이의 관계를 모델링하는 분류 알고리즘입니다.

🐣 논리 회귀 (Logistic regression)


- 대학교 시험 전 날 공부한 시간을 가지고 해당 과목의 이수 여부(Pass or Fail)를 예측하는 문제

이 문제는 이진 분류 문제입니다. 예측하려는 결과가 "이수" 또는 "미이수" 두 가지 중 하나이기 때문입니다. 여기서 입력값은 [ 공부한 시간 ] 그리고 출력값은 [ 이수 여부 ]가 됩니다.

선형 회귀의 출력 값은 연속적인 실수 값입니다. 이 문제를 선형 회귀로 해결하려고 한다면, [ 이수 여부 ] 예측 값이 음수 또는 양수의 범위에서 나오기 때문에 임계값이 0.5인 경우 이수 또는 미이수를 나누기가 어렵습니다.

이런 이진 분류 문제에는 이진 논리 회귀로 해결하는 것이 적합하며, 이 모델은 확률적인 값(0에서 1 사이)을 출력하여 "공부한 시간"에 따라 "이수 여부"를 잘 분류하고 그 결과를 해석하기에 좋습니다.

[ 선형 회귀 모델을 사용할 경우 결과 그래프]

=> 만약 선형 회귀를 사용하면 결과 그래프가 이렇게 연속적이고 우스꽝스러워집니다. 선형 회귀의 출력이 연속적인 실수 값이기 때문에 이런 그래프가 나오는데 이런 그래프로는 '이수' 또는 '미이수'와 같이 두 가지 이진 클래스를 명확하게 구분하는 이진 분류 문제를 해결하기는 어렵습니다.

이 문제를 해결하기 위해 Logistic function(또는 Sigmoid function)을 사용합니다. 이 함수는 S 모양 곡선을 그리며 출력을 0과 1 사이의 확률 값으로 변환합니다. 그 결과, 이진 분류 문제에 적합한 결과를 얻을 수 있게 됩니다.

[ 논리 회귀 모델을 사용할 경우 결과 그래프 ]

=> Logistic function(또는 Sigmoid function)을 함수로 사용할 경우 입력값(x)으로 어떤 값이든 받을 수가 있지만 출력 결과(y)는 항상 0에서 1사이 값이 됩니다.

- 가설과 손실함수

논리 회귀는 이진 분류 문제를 다루는 모델로, 실질적인 계산은 선형 회귀와 유사하지만 출력에 시그모이드 함수를 적용하여 0에서 1 사이의 값을 얻습니다.

[ 시그모이드 함수 ]

시그모이드 함수(Sigmoid function) : 입력 값을 확률( 0과 1 사이의 값)로 변환하여 이진 분류 문제를 다루는 데 사용

1. 0과 1 사이의 출력 : 어떤 사건이 발생할 확률 값으로 볼 수도 있습니다.
2. S자 형태 곡선 : 어느 임계값 이상이면 하나의 클래스에, 이하이면 다른 클래스에 할당하는 데 사용됩니다.
3. 미분 가능성 : 모델을 훈련시킬 때 경사 하강법과 같은 최적화 알고리즘을 사용하기에 유용합니다. 경사 하강법은 신경망의 가중치를 조정하여 손실 함수를 최소화하는 방향으로 이동하는 최적화 알고리즘입니다. 경사 하강법은 손실 함수의 기울기(경사)를 사용하여 가중치를 조정하는데, 이때 미분 가능한 함수가 필요합니다. 시그모이드 함수는 어떤 입력에 대한 미분값을 계산할 수 있으므로 경사 하강법을 적용하는 데 사용할 수 있습니다.
4. 로지스틱 회귀와 이진 분류 : 주로 로지스틱 회귀와 같은 이진 분류 모델에서 활성 함수로 사용됩니다. 모델의 출력을 이 함수를 통해 확률 값으로 변환한 후, 임계값을 설정하여 클래스를 할당합니다.

x(입력)가 음수 방향으로 갈 수록 y(출력)가 0에 가까워지고,
x(입력)가 양수 방향으로 갈 수록 y(출력)가 1에 가까워진다!
즉, 시그모이드 함수를 통과하면 0 에서 1 사이 값이 나온다!!!

선형 회귀에서의 가설은 H(x) = Wx + b

논리 회귀에서의 가설은 시그모이드 함수에 선형 회귀 식을 넣어주면 됩니다.


간단하게 그래프로 보자면 0에서 1사이의 곡선 형태로 확률을 생각한다면 어떤 사건이 일어날 확률이 0에 수렴하거나 1에 수렴하는 것을 생각해보면 됩니다.

확률이 0이어야 하는 경우:
- 예를 들어, 암 환자가 아닌 경우를 예측할 때, 이 사람은 암 환자가 아니라고 확신해야 합니다.
- 모델은 "암 환자가 아님"을 100% 확신하도록 학습되어야 합니다. 확률은 0%여야 합니다.

확률이 1이어야 하는 경우:
- 예를 들어, 비행기가 날아갈 확률을 예측할 때, 만약 비행기가 날아갈 것이라고 예측했다면, 이 예측은 100% 확신되어야 합니다.
- 모델은 "비행기가 날아감"을 100% 확신하도록 학습되어야 합니다. 확률은 100%여야 합니다.

=> 이것이 완벽한 형태의 가설입니다.

이렇게 가로축을 라벨(클래스)로 표시하고 세로축을 확률로 표시한 그래프를 확률 분포 그래프라고 합니다. 만든 모델이 얼마나 정확한 예측을 하는지를 평가하기 위해서 실제 결과(라벨)과 모델의 예측 간의 차이를 수치화해서 보기 위해 크로스 엔트로피라는 함수를 사용하게 됩니다. 크로스 엔트로피가 낮을수록 모델의 예측이 실제 레이블과 유사하며, 크로스 엔트로피가 높을수록 예측과 실제 레이블 간에 큰 차이가 있습니다. 즉, 크로스 엔트로피가 낮을수록 손실이 적고 어떤 사건이 일어날 가능성이 높아집니다.

이걸 논리 회귀의 손실 함수에 대입해보면, 아래와 같이 보입니다.

현재 학습 중인 입력값의 확률 분포가 파란색 그래프처럼 나왔다고 가정해보면, 크로스 엔트로피 함수는 파란색 그래프를 오차 없는 완벽한 가설을 세우기 위해 빨간색 그래프처럼 만들어주기 위해 노력하는 함수입니다. (선형 회귀에서 정답값을 나타내는 점과 세운 가설로 나타난 직선 거리를 최소화하는 것처럼)

🐤 다항 논리 회귀 (Multinomial logistic regression)


이 모델은 세 개 이상의 클래스를 예측하는 다중 클래스 분류 문제에 적합하며, 여러 개의 논리 회귀 모델을 결합하여 다중 클래스 분류 문제를 해결합니다. 각 클래스에 대해 각각의 논리 회귀 모델이 학습되고, Softmax 함수를 통해 확률을 계산합니다. Softmax 함수는 각 클래스에 대한 확률을 예측하고, 모든 클래스의 확률의 합이 1이 되도록 변환합니다.

- 대학교 시험 전 날 공부한 시간을 가지고 해당 과목의 성적(A, B, C, D, F)을 예측하는 문제

이 문제를 논리 회귀로 풀려면, 아래와 같이 클래스를 5개의 클래스로 나눕니다. 이 방법을 다중 논리 회귀(Multinomial logistic regression)라고 부릅니다.

  • 원-핫 인코딩(One-hot encoding)
    다항 분류 (Multi-label classification) 문제를 풀 때 출력값의 형태를 가장 예쁘게(컴퓨터 친화적으로) 표현할 수 있는 방법입니다.

    • 원-핫 인코딩을 만드는 방법
    1. 클래스(라벨)의 개수만큼 배열을 0으로 채운다.
    2. 각 클래스의 인덱스 위치를 정한다.
    3. 각 클래스에 해당하는 인덱스에 1을 넣는다.

- Softmax 함수와 손실함수

단항 논리 회귀(Binary Logistic Regression)의 경우 목표 변수는 두 가지 클래스(예: 0 또는 1, "양성" 또는 "음성") 중 하나로 분류됩니다. 그래서 시그모이드 함수를 사용하여 출력을 0과 1 사이의 확률로 나타냈습니다.

다항 논리 회귀 (Multinomial Logistic Regression)의 경우 목표 변수가 두 개 이상의 클래스(예: 3개 이상) 중 하나로 분류되기 때문에 시그모이드 함수만으로는 3개 이상의 다중 클래스를 직접 다룰 수 없어서 주로 Softmax 함수를 사용하여 출력을 여러 클래스에 대한 확률 분포로 변환합니다

Softmax는 함수는 다중 클래스 분류 문제에서 각 클래스에 속할 확률을 계산하는 데 사용됩니다. 학습 중인 모델의 결과값을 각 클래스에 대한 확률 값으로 변환합니다. 이때, 모든 클래스에 대한 확률들의 합은 1이 됩니다.

  • y는 클래스 i에 대한 출력값(결과값)입니다.
  • j는 클래스의 총 수 입니다.
  • 소프트맥스 함수는 각 클래스에 대한 확률을 반환하며, 이러한 확률 값은 모델의 출력을 해석하기 위해 사용됩니다.

다항 논리 회귀에서 Softmax 함수를 통과한 결과 값의 확률 분포 그래프는 상상이 잘 되지 않아서 그려보지 못했습니다.

다만, 단항 논리 회귀에서와 마찬가지로 가로축은 클래스(라벨)이 되고 세로축은 확률이 됩니다.

확률 분포의 차이를 계산할 때는 categorical_crossentropy 손실 함수를 사용합니다.

이진 논리 회귀와 마찬가지로 데이터셋의 정답 라벨과 예측한 라벨의 확률 분포 그래프를 구해서 categorical_crossentropy로 두 확률 분포의 차이를 구한 다음 그 차이를 최소화하는 방향으로 학습시킵니다.

🐥 다양한 머신러닝 모델


- Support vector machine (SVM)

SVM은 구분하는 분류 문제를 해결하는 데 사용되는 머신 러닝 알고리즘 중 하나입니다. 주어진 데이터를 두 개 이상의 클래스로 나누는 최적의 결정 경계를 찾는 것이 목표입니다.

  • 결정 경계 (Decision Boundary)
    SVM 모델이 데이터를 클래스로 분류하는 경계를 나타냅니다. 이 경계는 데이터 공간을 두 부분(클래스)으로 나누는 초평면(2D에서는 선, 3D에서는 평면)입니다. SVM은 결정 경계를 찾는 데 주력하며, 이 결정 경계는 데이터를 두 개 이상의 클래스로 나누는 역할을 합니다.

  • 마진 (Margin)
    마진은 결정 경계와 이 경계로부터 가장 가까운 데이터 포인트(서포트 벡터) 간의 거리를 나타냅니다. SVM은 마진을 최대화하려는 목표를 가지고 있으며, 큰 마진을 가진 결정 경계를 찾아 데이터를 잘 분류하고 일반화할 수 있는 모델을 생성합니다.

  • 서포트 벡터 (Support Vectors)
    Support Vectors는 결정 경계에서 가장 가까이 있는 데이터 포인트를 의미합니다.
    이러한 서포트 벡터들은 결정 경계를 결정하는 데 중요한 역할을 합니다.

  • 예외 상황과 특성 추가
    때로는 데이터가 간단한 결정 경계로 분류되지 못할 때가 있습니다. 이때는 특성의 개수를 늘리거나 더 복잡한 모델을 사용하여 문제를 해결할 수 있습니다.

  • 강아지와 고양이를 구분하는 문제

각각의 강아지와 고양이의 특성에 따라 그래프에 표시해놓고, 강아지와 고양이를 나누는 모델을 만들기 위해서 한 개의 직선을 그었습니다. 이 선이 고양이와 강아지를 잘 구분시키기 위해서는 각 고양이와 강아지 간의 거리가 최대인 직선을 그려야합니다.

이 때, 강아지와 고양이 클래스를 나누는 이 선이 데이터를 분리하는 경계인 결정 경계입니다.

고양이와 강아지를 잘 구분시키기 위해서 각 고양이와 강아지 간의 거리가 최대인 직선을 그리는 이유는 서포트 벡터 간의 거리(마진)를 최대화하려는 것이 SVM의 핵심 아이디어 중 하나이기 때문입니다.

그러다가 예외 상황 발생하는 경우가 있습니다. 만약 충성심이 강한 개냥이가 등장한다면? 일반적인 데이터 패턴에서 벗어나기 때문에 그래프의 축인 Feature(특성)의 개수를 늘려서 학습시키는 것이 일반적입니다. 현재는 "귀의 길이", "충성심" 의 2개의 특성만 있지만, "목소리의 굵기"라는 특성을 추가시켜 3차원 그래프를 그려 구분할 수도 있습니다.

=> 이것이 바로 분류 문제의 기초 개념이고 딥러닝을 더 낮은 차원에서 이해할 수 있는 방법입니다.

기타 머신러닝 모델들

  • k-Nearest neighbors (KNN)
    KNN은 비슷한 특성을 가진 개체끼리 군집화하는 알고리즘입니다. 예를 들어 하얀 고양이가 새로 나타났을 때 일정 거리안에 다른 개체들의 개수(k)를 보고 자신의 위치를 결정하게 합니다.

  • Decision tree (의사결정나무)
    우리가 자주하는 스무고개와 같은 방식으로 예, 아니오를 반복하며 추론하는 방식의 알고리즘입니다. 보통 간단한 문제를 풀 때 사용합니다.

  • Random forest
    의사결정나무를 여러개 합친 모델입니다. Decision Tree는 혼자서 스무고개 게임을 하는 것과 같고, Random Forest는 여럿이 모여서 함께 스무고개 게임을 플레이하여 더 정확하고 강력한 결정을 내린다고 볼 수 있습니다.

🐓 머신러닝에서의 전처리

머신 러닝에서의 데이터 전처리는 마치 요리를 하기 전에 재료를 손질하는 것과 비슷합니다. 필요없는 데이터를 지우고 필요한 데이터만을 취하는 것, null 값이 있는 행을 삭제하는 것, 정규화(Normalization), 표준화(Standardization) 등의 많은 작업들을 포함하고 있습니다. 또한 머신러닝 실무에서도 전처리가 80%를 차지한다는 말이 있을 만큼 중요한 작업으로 전처리 노가다에서 항상 시간이 오래 걸리고 실수도 많습니다.

- 부동산 데이터 분석

  • 집의 넓이 (단위: 평)
  • 준공 연도 (단위: 년)
  • 층 수 (단위: 층)
  • 가장 가까운 지하철 역과의 거리 (단위: km)

여기서 문제는 각각의 특성들이 단위도 다르고 값의 범위도 차이가 클 수가 있다는 점입니다. 일단 단위가 다르면 직접적으로 비교가 불가능하죠. 또한 단위가 같더라도 값의 범위가 다르다면 그것 또한 문제가 됩니다.

A의 집은 30평이고, B의 집은 지하철과의 거리가 3km이니까 A의 집이 더 비싸다. (x)

A는 수학 시험에서 100점 만점에 50점을 받았다. B는 수학 시험에서 500점 만점에 50점을 받았다.
A, B 모두 50점을 받았으므로 실력이 비슷하다. (x)

=> 이런 문제들을 해결하기 위해 우리는 정규화 또는 표준화를 사용합니다. 어떤 방식이 더 좋은지는 데이터셋에 따라 다르기 때문에, 다른 방법의 전처리와 학습을 반복하면서 노가다를 하는 것이 현명한 방법입니다.

- 정규화 (Normalization)

정규화는 데이터를 0과 1사이의 범위를 가지도록 만듭니다. 이것은 마치 모든 재료의 비율을 조절하여 요리를 더 맛있게 만드는 것과 비슷합니다.

예를 들어, 스파게티와 토마토 소스로 요리를 만든다고 해봅시다. 스파게티를 토마토 소스와 함께 조리할 때, 각 재료의 비율이 중요합니다. 만약 스파게티에 토마토 소스를 과도하게 사용하면 너무 많은 소스로 스파게티가 물들어서 맛이 향상되지 않을 것입니다. 반대로 너무 적게 사용하면 스파게티가 매우 건조하고 덜 맛있을 것입니다.

요리를 더 맛있게 만들려면 스파게티와 토마토 소스의 비율을 조절해야합니다. 이것은 데이터 정규화와 비슷합니다. 스파게티와 소스를 조합할 때, 모든 재료의 비율을 조정하여 요리를 맛있게 만들 수 있습니다. 이것이 정규화의 목표입니다.

데이터 정규화는 모든 데이터의 범위를 조절하여 머신 러닝 모델이 각 특성(재료)의 중요성을 올바르게 파악하고, 데이터를 더 잘 처리할 수 있도록 합니다. 마찬가지로 요리에서도 재료의 비율을 조절하여 요리를 더 맛있게 만들 수 있습니다.

이번에는 여러 요리의 칼로리를 비교해봅시다. 요리마다 칼로리가 다르기 때문에 직접 비교하기는 어렵울 겁니다. 이때 정규화를 사용하여 모든 요리의 칼로리를 일정한 범위로 맞춥니다.

  1. 여러 요리의 칼로리 정보를 모읍니다.
  2. 잘못 입력된 칼로리 정보가 있다면 이를 수정합니다.
  3. 모든 요리의 칼로리 범위를 0과 1 사이로 조정합니다. 예를 들어, 0에서 1000 칼로리 범위를 0과 1 사이로 스케일링합니다.
  4. 모든 요리의 칼로리 값을 0과 1 사이로 조정합니다. 예를 들어, 300 칼로리의 요리는 0.3로 표현됩니다.

=> 정규화를 통해 모든 요리의 칼로리를 동일한 스케일로 조정했기 때문에 이제 간편하게 요리의 칼로리를 비교할 수 있습니다. 이것이 머신 러닝에서의 정규화의 목적입니다.

- 표준화 (Standardization)

표준화는 데이터를 평균이 0이고 표준 편차가 1인 표준 정규 분포로 변환하는 데이터 전처리 과정입니다. 이것은 데이터의 단위와 범위를 표준화하여 다양한 특성을 비교하기 쉽게 만듭니다.

예를 들어, 토마토 소스로 만든 여러 요리들이 있다고 해봅시다. 각 요리의 소스 양과 질은 서로 다를 수 있습니다. 어떤 요리는 소스를 많이 사용하고, 어떤 요리는 소스를 적게 사용할 수 있습니다. 이때, 요리의 소스를 표준화하면 모든 요리의 소스 양을 동일한 척도로 맞춰서 쉽게 비교할 수 있습니다.

  1. 여러 요리의 소스 양을 모읍니다. 각 요리는 서로 다른 소스 양을 가질 수 있습니다.
  2. 데이터 정제 : 이상치나 오류가 있는 경우 이를 수정하거나 제거합니다. 예를 들어, 소스 양이 음수일 수 없습니다.
  3. 모든 요리의 소스 양을 평균이 0이고 표준 편차가 1인 표준 정규 분포로 변환합니다. 그러면 데이터가 예쁘게 정규화(Normalized)됩니다. 이것은 모든 요리의 소스 양을 서로 비교하기 쉽게 만듭니다. 예를 들어, 100ml의 소스는 0으로 표준화되고, 200ml의 소스는 1로 표준화됩니다.

- 정규화의 표준화의 차이

정규화는 데이터를 고정된 범위 내로 매핑하여 데이터 간의 상대적 크기 비교를 수행하는 데 유용합니다. 특히 신경망과 같은 모델에서 데이터를 스케일 조절하여 학습 속도를 개선하는 데 사용됩니다.

반면에 표준화는 데이터를 평균 0과 표준 편차 1로 변환하여 데이터의 분포를 표준 정규 분포에 가깝게 만듭니다. 이것은 이상치가 있는 경우나 모델이 정규 분포를 가정하는 경우 유용합니다.


🥚🐣🐤🐥🐓🐔

1개의 댓글

comment-user-thumbnail
2023년 10월 19일

각각 어떤 상황에서 사용되는지 예를 들어서 이해가 잘되네요! 전처리 과정이 중요한데 정규화와 표준화의 차이를 잘 정리해주셨군요👍

답글 달기