로지스틱 회귀(Logistic Regression), 범주형 데이터 분류

2020. 7. 5. 17:07Machine Learning/회귀 분석

선형 회귀는 범주형 데이터를 대상으로 한 분류 문제에 적합하지 않다.

*범주형 데이터란 'A', 'B', 'C'와 같이 종류를 표시하는 데이터를 말한다.

 

 

Linear Regression

 

 

선형 회귀를 사용하여 2진 분류[ex) 성공 or 실패]를 나타낸 그림이다.

 X축을 노력한 시간, Y축을 합격 확률이라고 한다면, 노력한 시간(X)이 작으면 합격 확률(Y)이 음수가 되는 것을 볼 수 있고, 반대로 노력한 시간(X)이 계속 늘어날수록 합격 확률(Y)도 계속해서, 즉, 무한대로 늘어나는 것을 볼 수 있다. 선형 회귀로 2진 분류 문제를 풀기에는 다소 적절하지 않은 것을 알 수 있다.

 

 


 

로지스틱 회귀에서 쓰이는 함수(시그모이드)

로지스틱 회귀는 인공지능이 2항 분류[ex)합격 or 불합격, 음성 or 양성으로 분류]에 사용한다. 로지스틱 회귀의 역할은 출력층으로 들어온 값을 0과 1 사이의 값으로 나타낸 뒤에 특정한 임계치(보통 0.5)를 정해 그 이상이면 1{ex) 합격}을 출력하고 그 미만이면 0{ex)불합격}을 출력하게 만드는 것이다. 임계치는 프로그래머가 상황에 따라서 알맞게 설정하면 된다.

 

Deep Learning

 

 

 그렇다면 출력층에 들어온 데이터의 값을 어떻게 0과 1 사이의 값으로 나타낼까? 이때 로지스틱 함수가 쓰인다. 로지스틱 함수를 구하기 위해선 우선 odds 해석이라는 것이 필요한데, odds는 실패에 비해 성공할 확률(성공할 확률/실패할 확률)로 구할 수 있다. [p의 odds = p / 1 – p 단, p = 성공할 확률]

 

 예를 들어, 합격할 확률이 4/7이고 불합격할 확률을 3/7라고 하면 합격할 odds는 4/3가 되고, 7번 중에 3번 불합격할 동안에 4번 합격한다고 해석할 수 있다. 이 odds에 log를 취하면 log odds이 된다. 주로 log의 밑은 자연상수 e로 취하는데, 이는 미분할 때 용이하기 때문이라고 한다. ln은 밑이 e인 로그를 뜻하는 기호이다.

 

 우선 log odds을 WX라 가정한다. 들어온 데이터 X에 가중치 W를 곱한 값인데, 이 인공지능이 학습한다 함은 실제 정답과 인공지능이 낸 결과를 비교해 W의 값을 알맞게 조정하는 것이다. 그리고 이전 계층에서 출력층으로 들어오는 데이터의 개수가 여러 개일 경우 오른쪽의 식이 길어지게 된다. 간단하게 보기 위해 출력층에 하나의 데이터인 WX만 들어왔다고 가정한다.

 

 

 

e를 WX 제곱하면 p/p-1가 된다는 의미이므로

 

 

 

위처럼 로그를 없애 나타낼 수 있다.

 

 

 

양변에 역수를 취하면 다음과 같이 나타낼 수 있다.

 

 

 

다시 양변에 역수를 취하면 위의 식이 나오게 된다. 흔히 이 함수를 시그모이드 함수라고 부른다.

 

 

 

식을 변형하여 이렇게도 나타낼 수 있다. 분모가 분자보다 항상이 1이 크므로 e의 WX제곱의 값이 아무리 커져도 p의 그래프는 1에 한없이 가까워지는 형태가 될 것임을 추측해볼 수 있다. 또한, 지수함수의 치역은 0보다 커야 하므로 e의 WX제곱의 값이 아무리 작아져도 0에 한없이 가까워지는 형태가 될 것임도 추측해 볼 수 있다. 즉 이 함수의 점근선은 y = 0, y = 1이 된다.

 

 

 

 

 


 

 

다항 로지스틱 회귀에서 쓰이는 함수(소프트맥스)

다항 분류{ex)강아지, 고양이, 호랑이로 분류}를 해야 할 때는 소프트맥스를 사용한다. 소프트맥스의 가장 큰 특징은 출력층이 여러 개의 노드를 갖고 각각의 노드들의 출력 값을 합친 총합이 1이 된다는 것이다. 각 노드들이 출력한 값을 보고 가장 큰 값을 가진 노드를 출력 노드로 정한다. 예를 들어 출력층의 각 노드에서 강아지일 확률 0.2, 고양이일 확률 0.7, 호랑이일 확률 0.1가 출력됐다면 최종적으로 가장 높은 확률을 가진 고양이를 선택한다. 소프트맥스의 함수 식은

 

 

 

 

이렇다. exp(x)는 e의 x제곱을 뜻하는 지수함수이다. exp(ak)는 e의 현재 노드로의 들어온 데이터만큼 제곱한 값을 뜻한다. 분모의 식은 e에 출력층 모든 노드의 각각 들어온 데이터를 제곱한 값의 합을 뜻한다. 모든 노드를 더하면 분자와 분모의 값이 같아져 1이 됨을 생각할 수 있다.

 

 e를 밑으로 하는 지수함수는 지수에 조금만 큰 값이 들어와도 엄청나게 큰 값을 내뱉게 된다. 따라서 컴퓨터는 유한한 데이터 길이를 다루기 때문에 ‘오버플로우’라는 문제가 발생할 수 있다. 이를 해결하기 위해선 식을 개선할 필요가 있다.

 

 

 

 

 먼저 기존 식의 분모 분자에 C라는 임의의 정수를 곱해준다. 그다음 C를 e의 지수로 옮기기 위해 log를 취해준다. 위 그림에서 잘못된 점이 있는데, 두 번째 줄의 식에서 그냥 logC가 아니라 밑이 e인 logC (ln(C))로 나타내야 식이 성립한다. 어쨌든, 그다음 밑이 e인 logC를 C’라는 기호로 치환한다. log함수의 치역은 실수 전 범위이므로 C’에 어떤 값을 넣어도 상관없지만, 일반적으로 노드에 들어온 데이터 중 가장 큰 값을 빼 준다.

 예를 들어, 한 출력 노드에 1005, 1000, 995의 값이 각각 들어왔다고 하면 이에 가장 큰 값인 1005를 빼 줘서 0, -5, -10으로 데이터를 변형한 뒤 계산한다.

 

 


 

 

손실 함수

그렇다면, 로지스틱 회귀의 손실 함수는 어떤 형태일까?

 

 

 

이렇게 생겼다. 처음 식을 보면 선형 회귀의 MSE보다 복잡하게 생겨서 정신이 혼미할 수 있지만 사실 이해하면 그리 복잡한 식이 아니다.

 

 

 

 로지스틱 회귀에서의 실제 값(정답)은 0 또는 1밖에 나올 수 없는데, 실제 값이 0일 경우 왼쪽 식이 사라지고 오른쪽 식만 남아서 1에 예측 값(0과 1 사이)을 뺀 값에 그를 취해주는데 예측 값이 실제 값 0에 가까워지면 상용로그의 진수가 1에 가까워지기 때문에는 손실 함수는 0에 가까워지게 되고, 만약 0에서 멀어지면(1에 가까워지면) 상용로그의 진수가 0에 가까워지기 때문에 음의 무한대로 발산하고 식 앞에 마이너스가 붙었으니 양수가 되어 손실 함수가 양의 무한대로 발산한다.

 

 

 

 

 실제 값이 1인 경우에는 손실 함수에서 오른쪽 식이 사라지고 왼쪽 식만 남게 된다. 실제 값이 0이었을 때와 똑같이 예측 값이 실제 값 1에 가까워질수록 상용로그의 진수는 1에 가까워지기 때문에 손실 함숫값은 0에 가까워진다. 또, 예측 값이 실제 값 1에서 멀어져 0에 가까워질수록 상용로그의 진수도 0에 가까워져 음의 무한대로 발산하는데 식 앞에 마이너스가 붙어 있으니 양수가 되어 양의 무한대로 발산한다.

 

 

 

 

선형 회귀와 마찬가지로 경사 하강법을 이용해서 손실 함수의 최소 지점을 찾을 수 있다. 

'Machine Learning > 회귀 분석' 카테고리의 다른 글

선형회귀  (0) 2020.08.07