이번주 배울 것
- 논리 회귀
- 전처리
논리 회귀 (Logistic regression)
머신러닝에서, 입력값과 범주 사이의 관계를 구하는 것
선형 회귀로 풀기 힘든 문제의 등장
- ex) 시험 전 날 공부한 시간을 가지고 해당 과목의 이수 여부(Pass or fail)를 예측
이 문제에서 입력값은 [공부한 시간] 그리고 출력값은 [이수 여부]가 됩니다. 우리는 이수 여부를 0, 1 이라는 이진 클래스(Binary class)로 나눌 수 있습니다. 0이면 미이수(Fail), 1이면 이수(Pass) 이런 식으로요. 이런 경우를 이진 논리 회귀(Binary logistic regression)로 해결할 수 있습니다.
만약 선형 회귀를 사용하면 이렇게 우스꽝스러운 그래프로 나타나게 됩니다.
따라서 우리에게는 다른 방법이 필요했는데 바로 Logistic function(=Sigmoid function)을 사용하면 아래와 같이 만들 수 있습니다.
과목을 이수할 확률을 0(미이수)과 1(이수)사이의 숫자로 나타낼 수 있게 되어 마음이 더 편해졌습니다. 로지스틱 함수는 입력값(x)으로 어떤 값이든 받을 수가 있지만 출력 결과(y)는 항상 0에서 1사이 값이 됩니다.
실제 많은 자연, 사회현상에서는 특정 변수에 대한 확률값이 선형이 아닌 S 커브 형태를 따르는 경우가 많다고 합니다.
이러한 S-커브를 함수로 표현해낸 것이 바로 로지스틱 함수(Logistic function)입니다.
딥러닝에서는 시그모이드 함수(Sigmoid function)라고 불립니다.
*** 시그모이드 함수(Sigmoid function)
가설과 손실함수
논리 회귀는 이렇게 생각하면 쉽습니다. 실질적인 계산은 선형 회귀와 똑같지만, 출력에 시그모이드 함수를 붙여 0에서 1사이의 값을 가지도록 합니다. 시그모이드 함수는 아래와 같이 생겼어요.
시그모이드 함수
x(입력)가 음수 방향으로 갈 수록 y(출력)가 0에 가까워지고,
x(입력)가 양수 방향으로 갈 수록 y(출력)가 1에 가까워진다!
즉, 시그모이드 함수를 통과하면 0 에서 1 사이 값이 나온다!!!
선형 회귀에서 가설은 H(x) = Wx + b 였죠? 논리 회귀에서는 시그모이드 함수에 선형 회귀 식을 넣어주면 됩니다.
논리 회귀에서 손실 함수는 아래와 같은 어려운 수식이 됩니다만, 수식보다는 개념을 이해하도록 합시다..!
손실 함수가 어떻게 될지 그래프를 보며 머릿 속으로 상상해보죠.
정답 라벨 y가 0 이어야 하는 경우를 먼저 살펴봅시다. 예측한 라벨이 0일 경우 확률이 1(=100%)이 되도록 해야하고, 예측한 라벨이 1일 경우 확률이 0(=0%)이 되도록 만들어야 합니다.
반대로 정답 라벨 y가 1일 경우에는, 예측한 라벨 1일 때 확률이 1(=100%)이 되도록 만들어야 할 겁니다.
위의 그래프를 더욱 실제적으로 그려보면 아래의 그래프가 됩니다.
이렇게 가로축을 라벨(클래스)로 표시하고 세로축을 확률로 표시한 그래프를 확률 분포 그래프라고 합니다. 확률 분포 그래프의 차이를 비교할 때는 Crossentropy 라는 함수를 사용하게 되는데요.
간단하게 그래프로 개념을 이해하면, 임의의 입력값에 대해 우리가 원하는 확률 분포 그래프를 만들도록 학습시키는 손실 함수입니다.
정답이 0인 경우만 살펴보면, 우리가 현재 학습 중인 입력값의 확률 분포가 파란색 그래프처럼 나왔다고 가정합시다. crossentropy는 파란색 그래프를 빨간색 그래프처럼 만들어주기 위해 노력하는 함수입니다. 우리가 선형 회귀를 했을때 정답값을 나타내는 점과 우리가 세운 가설 직선의 거리를 최소화하려고 했던 거리 함수처럼요!
이렇게 수식보다는 그래프를 활용하여 개념적으로 이해하면 훨씬 쉽답니다.
Keras에서 이진 논리 회귀의 경우 binary_crossentropy 손실 함수를 사용
다항 논리 회귀 (Multinomial logistic regression)
다항 논리 회귀와 One-hot encoding
- ex) 시험 전 날 공부한 시간을 가지고 해당 과목의 성적(A, B, C, D, F)을 예측
위의 문제를 논리 회귀로 풀려면, 아래와 같이 클래스를 5개의 클래스로 나눕니다. 이 방법을 다중 논리 회귀 (Multinomial logistic regression)이라고 부릅니다.
원핫 인코딩은 다항 분류 (Multi-label classification) 문제를 풀 때 출력값의 형태를 가장 예쁘게 표현할 수 있는 방법입니다. 다항 논리 회귀도 다항 분류에 속하기 때문에 원핫 인코딩 방법을 사용합니다. 여러개의 항을 0과 1로만 아름답게 표현할 수 있지요. 일단 어떻게 생겼는지 볼까요?
*** 원핫 인코딩을 만드는 방법
- 클래스(라벨)의 개수만큼 배열을 0으로 채운다.
- 각 클래스의 인덱스 위치를 정한다.
- 각 클래스에 해당하는 인덱스에 1을 넣는다.
Softmax 함수와 손실함수
Softmax는 선형 모델에서 나온 결과(Logit)를 모두가 더하면 1이 되도록 만들어주는 함수입니다. 다 더하면 1이 되도록 만드는 이유는 예측의 결과를 확률(=Confidence)로 표현하기 위함인데요. 우리가 One-hot encoding을 할때에도 라벨의 값을 전부 더하면 1(100%)이 되기 때문입니다.
다항 논리 회귀에서 Softmax 함수를 통과한 결과 값의 확률 분포 그래프를 그려서 아래 그래프의 모양이라고 가정합시다. 단항 논리 회귀에서와 마찬가지로 가로축은 클래스(라벨)이 되고 세로축은 확률이 됩니다.
마찬가지로 확률 분포의 차이를 계산할 때는 Crossentropy 함수를 씁니다. 항이 여러개가 되었을 뿐 차이는 이진 논리 회귀와 차이는 없습니다. 우리는 데이터셋의 정답 라벨과 우리가 예측한 라벨의 확률 분포 그래프를 구해서 Crossentropy로 두 확률 분포의 차이를 구한 다음 그 차이를 최소화하는 방향으로 학습을 시킬겁니다!
Keras에서 다항 논리 회귀의 경우 categorical_crossentropy 손실 함수를 사용
다양한 머신러닝 모델
Support vector machine (SVM)
우리가 강아지와 고양이를 구분하는 문제를 푼다고 가정해봅시다. 구분하는 문제를 푸는 것은 분류 문제(Classification problem)이고 분류 문제를 푸는 모델을 분류기(Classifier)라고 부릅니다. 강아지와 고양이를 분류하기 위해 우리는 아래와 같은 예를 들겠습니다.
각각의 강아지와 고양이의 특성에 따라 그래프에 표시해 보았어요. 우리는 강아지와 고양이를 나누는 모델을 만들기 위해 한 개의 직선을 그어 볼 겁니다.
선을 그리긴했는데 어떻게 그려야 잘 구분할 수 있을까요? 그래서 우리는 이 선과 고양이, 강아지 간의 거리를 계산하기로 합니다. 그리고 가장 각 고양이, 강아지 간의 거리가 최대가 되는 직선을 그리면 구분이 잘되겠다!라고 생각했죠.
각 그래프의 축을 Feature(특징)라고 부르고 각 고양이, 강아지와 우리가 그린 빨간 벡터를 Support vector라고 부릅니다. 그리고 그 벡터의 거리를 Margin이라고 부르죠. 우리는 Margin이 넓어지도록 이 모델을 학습시켜 훌륭한 Support vector machine을 만들 수 있습니다.
예외 상황 발생!
만약 충성심이 강한 개냥이가 등장한다면 어떻게 할까요?
그럴 경우에는 Feature(특성)의 개수를 늘려서 학습시키는 것이 일반적입니다.
현재는 "귀의 길이", "충성심" 의 2개의 특성만 있지만,
"목소리의 굵기"라는 특성을 추가시켜 3차원 그래프를 그려 구분할 수 있겠죠!
이것이 바로 분류 문제의 기초 개념이고 딥러닝을 더 낮은 차원에서 이해할 수 있는 방법입니다.
기타 머신러닝 모델 간단 소개
k-Nearest neighbors (KNN)
KNN은 비슷한 특성을 가진 개체끼리 군집화하는 알고리즘입니다. 예를 들어 하얀 고양이가 새로 나타났을 때 일정 거리안에 다른 개체들의 개수(k)를 보고 자신의 위치를 결정하게하는 알고리즘이죠!
Decision tree (의사결정나무)
우리가 자주하는 스무고개와 같은 방식으로 예, 아니오를 반복하며 추론하는 방식입니다. 생각보다 성능이 좋아 간단한 문제를 풀 때 자주 사용해요.
Random forest
의사결정나무를 여러개 합친 모델입니다. 의사결정나무는 한 사람이 결정하는 것이라고 하면 랜덤 포레스트는 자유민주주의라고 보면 이해가 빠릅니다. 각각의 의사결정나무들이 결정을 하고 마지막에 투표(Majority voting)을 통해 최종 답을 결정하게 되죠!
머신러닝에서의 전처리
전처리(Preprocessing)란?
전처리는 넓은 범위의 데이터 정제 작업을 뜻합니다. 필요없는 데이터를 지우고 필요한 데이터만을 취하는 것, null 값이 있는 행을 삭제하는 것, 정규화(Normalization), 표준화(Standardization) 등의 많은 작업들을 포함하고 있습니다.
또한 머신러닝 실무에서도 전처리가 80%를 차지한다는 말이 있을 만큼 중요한 작업이기도 하죠. 전처리 노가다에서 항상 시간이 오래 걸리고 실수가 많습니다.
정규화 (Normalization)
정규화는 데이터를 0과 1사이의 범위를 가지도록 만듭니다. 같은 특성의 데이터 중에서 가장 작은 값을 0으로 만들고, 가장 큰 값을 1로 만들죠. 수식으로 표현하면 아래와 같아요.
이렇게 정규화를 하면 같은 50점이라도 깔끔하게 구분할 수 있겠죠?
표준화 (Standardization)
표준화는 데이터의 분포를 정규분포로 바꿔줍니다. 즉 데이터의 평균이 0이 되도록하고 표준편차가 1이 되도록 만들어주죠. 수식으로 표현하면 아래와 같습니다.
수식보다는 개념이 더 중요합니다. 수식으로 할 수 있는 것들은 코드를 작성하면 컴퓨터가 알아서 해주거든요.
일단 데이터의 평균을 0으로 만들어주면 데이터의 중심이 0에 맞춰지게(Zero-centered) 됩니다. 그리고 표준편차를 1로 만들어 주면 데이터가 예쁘게 정규화(Normalized) 되죠. 이렇게 표준화를 시키게 되면 일반적으로 학습 속도(최저점 수렴 속도)가 빠르고, Local minima에 빠질 가능성이 적습니다.
아래의 그래프에서 정규화의 표준화의 차이를 대략 느낄 수 있습니다.
*** 요는 표준화 / 정규화를 거쳐서 데이터를 쓰기 쉽게 만든다
이진 논리회귀 실습
- 데이터 다운받기
- 필요한 패키지 임포트하기
- 데이터 로딩하기
- 전처리하기
- 사용할 컬럼 추출하기
- 비어있는 행 없애기
- X, Y 데이터 분할하기
- 표준화하기
- 학습/검증 데이터 분할하기
- 모델 학습시키기
다항 논리회귀 실습
- 데이터 다운받기
- 필요한 패키지 임포트하기
- 데이터 로딩하기
- 전처리하기
- 헤더 정보 채워넣기
- X, Y 데이터 분할하기
- 표준화하기
- One-hot 인코딩하기
- 학습/검증 데이터 분할하기
- 모델 학습시키기
비교해보면 데이터의 전처리 과정만 다를뿐 방식은 똑같다!