ROC Curve (수신자 조작 특성 곡선)

 

ROC Curve

 

ROC(Receiver Operating Characteristic) Curve는 모든 분류 임계값에서 분류 모델의 성능을 보여주는 그래프 x축이 FPR(1-특이도), y축이 TPR(민감도)인 그래프이다. 즉 민감도와 특이도의 관계를 표현한 그래프이다. ROC Curve는 AUC(Area Under Curve : 그래프 아래의 면적)를 이용해 모델의 성능을 평가한다. AUC가 클수록 정확히 분류함을 뜻한다. 즉, 위의 그래프에서 A = 0.95인 모델은 95%의 확률로 제대로 분류하고 있음을 뜻한다. 그렇다면 ROC Curve의 x축과 y축을 담당하는 FPR과 TPR이란 무엇일까?

 

 

 


 

 

 

앞으로 기술하는 내용에 대해 더 자세한 내용은 이 블로그를 참고하기를 바란다. 상당히 친절하게 설명되어있다.

또한 더 자세하게 설명해 준 블로그에 대한 링크를 여기에 남기겠다.

 

 

Confusion Matrix (혼동 행렬, 이원교차표)

 

Confusion matrix는 알고리즘의 성능을 평가하는데 사용된다.

 

Confusion Matrix

 

양성인데 양성으로 제대로 검출된 것은 True Positive (TP)  /  양성인데 음성으로 잘못 검출된 것은 False Negative (FN)

음성인데 양성으로 잘못 검출된 것은 False Positive (FP)   /   음성인데 음성으로 제대로 검출된 것은 True Negative (TN)

 

따라서 위의 이원교차표를 분석할때는 대각선인 TP와 TN을 확인하면 이 모델이 얼마나 정확하게 예측했는지를 알 수 있다.

 

 

 

조금 더 직관적으로 설명하도록 하겠다.

예시로, 암을 분류하는 모델에 대해서 위의 Confusion Matrix, 즉 이원교차표로 성능을 확인하고자 한다.

 

TP (True Positive) 분류기가 병이 있다고 예측했고 실제로도 병이 있는 경우
TN (True Negative) 분류기가 병이 없다고 예측했고 실제로도 병이 없는 경우
FP (False Positive) 분류기가 병이 있다고 예측했지만 실제로는 병이 없는 경우
FN (False Negatvie) 분류기가 병이 없다고 예측했지만 실제로는 병이 있는 경우

 

조금은 이해가 갔길 바란다. 실제로 병원에서는 FN, 즉 분류기가 병이 없다고 예측했지만 실제로 병이 있는 경우에 대한 오차를 줄이는 것이 매우 중요하다.

 

 

Multi-Class Confusion Matrix

Multi-Class인 경우에는 밑의 그림과 같이 판단한다.

 

Multi-Class Confusion Matrix

 

 

 

 


 

 

 

 

정확도(Accuracy)

   전체 데이터 중에서 제대로 분류된 데이터의 비율로 모델이 얼마나 정확하게 분류를 하는지를 나타낸다.

   이것이 대체로 우리가 모델의 성능을 파악하는데 봐왔던 정확도이다.

Accuracy = (TP + TN) / (TP + TN + FP + FN) = (TP + TN) / (P + N)

 

 

정밀도와 재현율

정밀도(Precision)

   모델이 양성이라고 분류한 데이터 중에서 실제로 양성인 데이터의 비율이다.

   EX) 제품을 구매할 것으로 예측한 사람 중에서 실제 제품을 구매한 사람의 비율

Precision = TP / ( TP + FP)

 

재현율(Recall)

   실제로 양성인 데이터 중에서 모델이 양성으로 분류한 데이터의 비율이다.

   EX) 실제 제품을 구매한 사람 중에서 구매할 것이라고 예측했던 사람의 비율

Recall = TP / (TP + FN) = TP / P

 

정밀도와 재현율은 소극적 예측과 공격적(적극적) 예측을 판단할 때 사용한다.

 

암을 예측하는 모델에서 소극적 예측은 확실한 경우가 아니면 암이 아니라고 판단하는 것이고, 공격적(적극적) 예측은 조금만 의심이 가더라도 암이라고 판단하는 것을 의미한다.

 

소극적 예측 정밀도 ↑ 재현율 ↓
공격적(적극적) 예측 정밀도 ↓ 재현율 ↑

 

 

민감도와 특이도

민감도(sensitivity) : TPR (True Positive Rate)           민감도는 정밀도와 같다.

   정확히 분류된 긍정 예시의 비율

   EX) 실제 제품을 구매한 사람 중에서 구매할 것이라고 예측했던 사람의 비율

TPR = TP / (TP + FN) = TP / P

 

특이도(specificity) : TNR (True Negative Rate)

  정확히 분류된 부정 예시의 비율

  EX) 실제 제품을 구매하지 않은 사람 중에서 구매하지 않을것이라고 예측했던 사람의 비율

TNR = TN / (TN+FP) = TN / N

 

민감도와 특이도는 0~1까지의 범위에 있으며, 값이 1에 가까울수록 바람직하나 실제로 한쪽이 높으면 한쪽이 낮아져, 둘 다 높게 맞출 수 없다.

그래서 여러 모델 중 하나를 선택해야한다면 민감도가 최대인 것 중 특이도가 높은 것을 선택한다.

 

 

FPR (False Positive Rate) = False Alarm

  실제로 양성인 데이터 중에서 모델이 음성으로 분류한 데이터의 비율이다. 즉, 반대로 예측하는 경우를 뜻한다.

FPR = FP / ( FP + TN ) = FP / N = 1- ( TN / ( TN + FP ) ) = 1 - 민감도

 

모델의 전체적인 정확도가 높아도 FPR, 즉 제대로된 값을 잘못 측정하면 예측에 큰 영향을 줄 수있으므로 FPR도 중요한 지표이다.

FPR은 ROC Curve의 x축으로, TPR과 함께 AUC를 판단하는 매우 중요한 척도이다.

 

 

카파 통계량 (Kappa Statistic)

  두 관찰자(실제,예측)간의 측정 범주값에 대한 일치도를 측정하는 방법으로 K=0이면 완전 불일치, K=1이면 완전 일치이다.

 

카파 통계량 공식

Pr(a) : 데이터에서 관찰된 2명의 평가자(실제,예측)들의 일치확률

Pr(e) : 2명의 평가자(실제,예측)들의 데이터로부터 계산된 확률적 일치확률 (우연히 일치할 확률)

 

K는 이원교차표를 통해 구할 수 있으며, PythonR(install.packages("vcd"))에서도 패키지로 한번에 계산할 수 있다.

Pr(a)는 실제와 예측들의 일치 확률이므로 정확도를 의미한다. Pr(a) = 정확도(Accuracy) =  (TP + TN) / (P + N)

Pr(e)에 대해서는 아래의 예를 통해 설명하도록 하겠다.

 

  평가자 A (예측)
평가자 B
(실제)
  합격 불합격  
합격 40 10 50
불합격 20 30 50
  60 40  

 

위의 표에서 Pr(e) : 2명의 평가자들의 데이터로부터 계산된 확률적 일치, 즉 우연히 일치할 확률을 구해보자.

 

평가자 A(예측)는 합격확률이 0.6, 불합격확률이 0.4이다.

평가자 B(실제)는 합격확률이 0.5, 불합격확률이 0.5이다.

 

평가자 A와 B 모두 합격을 줄 확률은 0.6 * 0.4 = 0.3 이며, 평가자 A와 B 모두 불합격을 줄 확률은 0.4 * 0.5 = 0.2 로,

Pr(e) = 0.3 + 0.2 = 0.5이다.

 

위의 예시표에 대한 카파 통계량은 (0.7(정확도) - 0.5) / (1 - 0.5) = 0.4로 그리 많이 일치하진 않다는 것을 알 수 있다.

카파 통계량이 크면 클수록 모델의 정확도가 우연히 나온 것이 아니라는 것을 알 수 있다.

 

 

 

이것을 이원교차표에 대해서 계산을 하고자 하면 Predicted class의 Positive와 Actual class의 Positive를 곱한 것과 Predicted class의 Negative와 Actual class의 Negative를 곱한 것의 합이 Pr(e)이다.

 

∴ Pr(e) = Predicted class Positive * Acutal class Positive + Predicted class Negative * Actual class Negative

 

 

 

 

 

 


 

 

 

 

 

 

PR Curve

 

PR Curve란 x축을 Recall, y축을 Precision으로 두고 시각화한 그래프로 ROC Curve와 마찬가지로 AUC로 평가한다. 주로 데이터 라벨의 분포가 심하게 불균등한 경우, 예를 들면 사람들에게 떡을 2개 주도록 설계된 기계를 상용화하기 위해 테스트할 때 떡을 그 이상이나 이하로 줄 확률보다 설계대로 2개만 줄 확률이 압도적으로 더 높은 (이게 올바른 예시인지는 잘 모르겠다 아 떡먹고 싶네 갑자기) 경우와 같이, 분류의 분포가 심하게 치우쳐진 경우에 사용한다.

 

출처 : https://m.blog.naver.com/sw4r/221681933731

 

PR Curve는 ROC Curve와 다르게 1에서부터 줄어드는 형태를 띄고 있다. PR Curve는 불균형한 데이터 셋을 가졌을 때의 핵심 성능평가 방법이다.

 

 

 

 

F1 점수 (F 척도)

 

F1 Score는 아래의 그림과 같이 모델의 성능을 하나의 수로 표현하고자 할 때, ROC 곡선이나 PR 곡선의 AUC 외에 많이 사용되는 지표이다.(0~1사이) F1 Score도 정밀도(Precision)와 재현율(Recall)을 이용한다. F1 Score는 모델의 성능을 하나의 숫자로 설명하기 때문에 여러 모델을 나란히 비교할 수 있다.

 

F1 Score는 정밀도와 재현율의 조화평균으로, 일반적인 산술평균이 아닌 조화평균을 사용하는 이유는 두 지표를 모두 균형있게 반영하여 모델의 성능을 판단하기 위함이다. 조화평균으로 평균을 구하면 작은값을 위주로 평균을 구할 수 있기 때문에 보다 정확한 평균값을 구할 수 있다.

 

정확도가 만약 높더라도 F1 Score가 현저히 작은 경우는 좋은 모델이라고 볼 수 없기 때문에 F1 Score도 모델의 성능을 파악하는데 중요한 지표라고 할 수 있다. 이에 대한 자세한 설명은 여기를 참고하길 바란다.

 

F1 Score도 PythonR(install.packages("MLmetrics"))에 있는 패키지들을 통해 한번에 구할 수 있다.

 

 

F1 Score 계산 방법

 

정밀도(P)와 재현율(R)로 산술평균(Average) 낸 것과 조화평균(F1 Score) 낸 것의 차이를 보여주는 표

 

 

 

 

 

'인공지능 > 인공지능 이론' 카테고리의 다른 글

12. Clustering  (0) 2019.09.13
11. 차원의 저주 / PCA  (0) 2019.09.13
9. Classification (분류)  (0) 2019.09.11
8. Regression (회귀)  (0) 2019.09.08
7. 머신러닝종류  (0) 2019.09.08

 

 

 

Regression(회귀)이 결과값을 추정하는 방식이었다면, Classification(분류)은 카테고리에 분류하는 방식이다.

Classification에서 Linear Regression은 사용할 수 없다. 왜냐하면 Classification은 0 또는 1값만 가지는데, linear regression은 그 범위 이상의 값을 가질 수 있기 때문이다. 따라서 Linear Regression을 Classification에서 사용하기 위해서는 0 또는 1 사이의 값만 내보내는 Hypothesis 함수가 필요하다.

 

 

 

 

Logistic Regression

 

선형 회귀 / 로지스틱 회귀 그래프

 

위의 그림에서 왼쪽에 위치한 선형 회귀의 그래프를 보자. 그래프의 y축은 -4 ~ 4 까지 분포되어 있는 것을 알 수 있다. 이런 경우는 앞서 공부했던 Regression으로는 풀리지만 0과 1만을 나타내는 Classification에서는 적용되지 못한다. 왜냐하면 y값이 선형적인 값으로 -4 ~ 4 까지 분포하고 있으니까 말이다. 이런 Regression의 한계점을 해결하여 Classification에서도 문제를 풀기 위해서 우리는 Logistic Regression을 사용한다. (똑똑한 인간들 덕에 이만큼 발달된 사회에서 산다지만 내가 밥 벌어먹으려고 공부하다보니 드는 생각은 똑똑한 것들 다 없어졌으면) 오른쪽 그래프를 보자. Logistic Regression은 y값이 0 ~ 1 까지 밖에 없다. 그 사이에 있는 값들은 일정한 기준을 통해 0 또는 1로 구분할 수 있을 것이고 그렇게 되면 우리는 Regression을 Classification에 적용하여 풀 수 있게 될 것이다.

 

Linear Regression을 Logistic Regression으로 바꿔주기 위해 우리는 Sigmoid Function을 사용한다.

 

Sigmoid(Logistic) Function

 

𝑃(𝑦=1|𝑥;𝜃) +𝑃(𝑦=0|𝑥;𝜃) = 1

 

여기서 만들어진 함수는 1번 class일 확률과 0번 class 일 확률의 합이 항상 1이 되어야 한다.

 

 

 


 

 

Cost Function (비용 함수)

우리는 Linear Regression을 Classification에서도 활용하도록 Sigmoid Function을 사용하여 Logistic Regression으로 바꿨다. 그렇기 때문에 우리가 예측한 데이터가 실제 데이터와 얼마나 유사한지에 대해 판단하는 Cost Function 식도 바꿔야 한다. 왜 바꿔야할까? 귀찮아죽겠는데

 

 

Linear Regression의 Cost Function을 사용하는 경우 / Non-convex Fucniton

 

기존의 Linear Regression의 Cost Function을 Logistic Regression에 사용하는 경우는 위의 이미지와 같은 문제가 발생한다.

(Local Minima(모델과 데이터에 따라 경사도가 0인 지점이 여러 개 존재할 수 있는 문제)가 생기는 문제)

왜 Local Minima가 생길까? 그 이유는 로지스틱 회귀에서 사용하는 sigmoid가 비선형 함수이기 때문에 Non-convex Function이 되기 때문이다.

 

위의 그림에서 볼 수 있다시피 가장 최소값 이전에 구간의 최소값이 존재하므로 우리의 멍청한 컴퓨터는 가장 최소값(Global Minima)을 찾기도 전의 최소값(Local Minima)을 그 함수의 가장 최소값으로 판단할 것이다. 따라서 기존의 Cost Function은 모델의 정확성을 판단하는데 어려움이 있다.

 

 

Logistic Regression의 Cost Function

 

Logistic Regression의 Cost Function은 위와 같다. 빨간색 선은 y=0, 즉 실제 데이터가 0일 때의 그래프이다. x축인 h(x)는 Logistic Regression을 통해 우리가 예측한 값으로 예측값인 h(x)가 실제 데이터의 값인 0과 일치하면 Cost는 0이고, 그와 반대로 예측값을 1로 잘못 예측할 경우 Cost가 기하급수적으로 증가한다. 이는 잘못 예측한 값에 대해 패널티를 주는 개념으로 모델의 예측 정도를 판단하는데 도움이 된다. 파란색 선은 y=1, 즉 실제 데이터가 1일 때의 그래프이고 위의 설명과 같게 예측값과 실제 값이 모두 일치하는 1일 경우에는 Cost가 0, 잘못 예측했을 때는 큰 Cost를 주어 모델이 잘못 예측되었음의 지표를 알려주게 된다. 따라서 Logistic Regression의 Cost Function은 모두 convex하다.

 

 

 

Logistic Regression의 경사하강법

Gradient Descent

 

Gradient Descent에 대해서는 앞에서 공부한 Regression에서 자세히 설명하였으므로 여기서는 수식에 대해서만 적겠다. 어쨌든 Logical Regression도 경사하강법(Gradient Descent)을 사용하여 Cost를 최소화하는 계수를 찾는다는 것이다.

 

 

 

 

 


 

 

 

 

 

단순히 위의 Logistic Regression과 같은 그래프 모양이 나타난다면 우리는 대부분 0.5를 기준으로 0.5보다 낮은 값은 0으로, 0.5보다 큰 값은 1로 판단할 것이다.

 

이런 경우는?!

 

하지만 세상의 모든 일이 그렇듯 우리가 예상했던 것처럼 항상 저렇게 예쁜 모양으로 나타나지는 않는다. 위의 이미지처럼 특이하지만 명확히 구분할 수 있는 모양이 나온다. 이런 경우에 대한 분류는 참고할만한 사이트들의 링크를 거는 것으로 넘어가겠다. 자세히 설명하자니 방대하고, 다른 블로그에서도 충분히 설명을 잘해주셨기 때문이다.

 

 

1. SVM (Support Vector Machine : 서포트 백터 머신)

두 범주를 잘 분류하면서 마진(margin)이 최대화된 초평면(hyperplane)을 찾는 기법으로 기본적으로 선형분류를 한다.

아래에 참고할만한 블로그 3개의 링크를 걸어놨다. 다들 참고하기를 바란다. 

참고      참고      참고

 

 

추가적으로 SVM과 Logistic Regression의 차이점에 대한 표를 남기겠다.

  Logistic Regression SVM
데이터 종류 이미 식별된 독립 변수 텍스트 및 이미지와 같은 비정형 및 반정형 데이터
모델 생성 방식 통계적 접근 방식 기반 기하학적 특성 기반
과적합 과적합 위험 많음 과적합 위험 적음

 

3차원에서의 서포트 벡터 머신을 단적으로 보여주는 그림

 

 

2. Kernel SVM

상당히 복잡한 모양의 데이터들을 분류하는 방법이다. 이 또한 링크를 참고하기를 바란다.

참고      참고

 

 

Kernel 서포트 벡터 머신을 단적으로 보여주는 그림

 

 

3. Bayes Rule (베이즈 정리)

확률통계에서 사용하는 방법이다. 

참고      참고

 

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

참고      참고

 

5. Decision Tree (의사 결정 나무) / Random Forest / 앙상블

Decision Tree         Random Forest         앙상블

 

 

 

 

 

 

 

 

 

'인공지능 > 인공지능 이론' 카테고리의 다른 글

11. 차원의 저주 / PCA  (0) 2019.09.13
10. ROC Curve  (0) 2019.09.12
8. Regression (회귀)  (0) 2019.09.08
7. 머신러닝종류  (0) 2019.09.08
6. Train, Valid, Test Data / CrossValidation (교차 검증)  (0) 2019.08.27

 

 

 

Regression(회귀)

 

앞선 머신러닝종류에 대한 글에서 Regression에 대한 설명이 너무 간략했다. 이번 글에서는 Regression에 대해 자세하게 설명하고자 한다.

Regression은 분포된 데이터를 방정식(Hypothesis)을 통해 결과의 값을 예측하는 것을 뜻한다.

 

 

Linear Regression (선형 회귀)

 

Linear Regression은 H(x) = Wx + b 로 나타낼 수 있다. H(x)는 우리가 도출하고자하는 예측 값이다. x는 우리가 갖고 있는 데이터들을 의미한다. 수많은, 그리고 다양한 특징을 갖는 데이터들을 하나의 수식으로 나타내는 W와 b의 값을 구하는 것이 Linear Regression의 최종 목표라고 할 수 있겠다. 그렇다면 어떻게 W와 b를 구할 수 있을까?

 

 

여기 이미지를 보자. 빨간색 점은 우리가 갖고 있는 데이터이다. 이렇게 다양한 위치에 존재하는 데이터의 전체적인 경향성을 파악하기란 여간 어려운 일이 아니다. 그래서 우리는 이런 다양한 데이터들을 전체적으로 예측할 수 있는 모델을 만들기 위해 갖고 있는 데이터와 예측한 함수에 대한 오차값을 사용한다. 그림에 있는 초록색 선이 예측한 모델과 주어진 데이터간의 오차이다. 우리는 갖고 있는 모든 데이터에 대해 이 오차 값이 제일 적은 모델을 선택해야 원하는 예측값을 얻을 수 있을 것이다.

 

 

Cost Function (비용 함수)

 

Cost Function, 이 그림에서 𝜃0은 b, 𝜃1은 W를 의미한다.

 

오차는 예측값( h(x) )과 정답( y )의 차이이다. 단순한 차는 양수와 음수를 모두 포함하므로 지표적으로 해석하기 쉽게하기 위해서는 제곱하는 것이 편하다. 따라서 우리는 오차값을 제곱하여 합산한다. 분모에 있는 2m의 m은 데이터의 개수이다. (+ 2로 나누는 것은 미분값(Gradient)을 간소하게 만들기 위해 추가한 것) 위와 같은 식을 우리는 Cost Function(비용 함수)이라고 한다. Cost Function의 값이 낮을수록 좋은 선형방정식이라고 할 수 있다.

 

convex(볼록함수)를 통해 최소값을 쉽게 찾을 수 있다.

 

위의 이미지와 같이 쉽다면 인공지능이 얼마나 재미있을까? 하지만 저렇게 쉬운 문제만 있다면 애초에 인공지능까지도 필요 없었을 것이다. 그냥 대충 계산하면 사람도 쉽게 할 수 있으니 말이다. 우리는 대체로 이런 말도 안되는 그래프들을 만나게 될 것이다.

 

벌써부터 가슴이 답답하다.

 

최하점을 찾기 꽤나 까다로운 그래프가 아닐 수 없다. 우리는 현재 빨간색 쪽에 있는 별에 위치해 있다. 우리는 제일 최저점인 짙은 파란색에 있는 값들을 알아내야 한다. 그렇다면 어떻게 해야 우리는 저 최저점에 도달할 수 있을까? 이를 위해 우리는 Gradient Descent(경사 하강법)를 사용한다.

 

 

 


 

 

 

 

Gradient Descent (경사 하강법)

 

Gradient Descent (경사 하강법)은 1차 근삿값 발견용 최적화 알고리즘이다.

기본 개념은 함수의 기울기(경사)를 구하여 기울기가 낮은 쪽으로 계속 이동시켜서 극값에 이를 때까지 반복시키는 것이다. 즉, Gradient Descent란 Cost를 최소로 만드는 예측직선 h(x)에서 최적의 W를 발견하는 과정이라고 할 수 있다.

 

수식 극혐

 

 𝛼 : learning rate, 𝛼 > 0

≔ : 할당 (assignment) 연산자

𝜃0, 𝜃1은 한번에 업데이트 해야 함

 

위의 수식은 Cost Function(비용함수)의 편미분값 * 𝛼값을 기존 𝜃값에서 빼주는 것을 계속 반복하는 방식이다. 이걸 단번에 이해하는 당신은 천재라고 할 수 있겠다. (왜나면 내가 바보이기 싫기 때문) 이해를 돕기 위해 선형 회귀에 대해 잘 설명한 블로그에서 갖고 온 이미지를 보자.

 

비교적 이해하기 쉬운 이미지라고 생각한다.

 

위의 이미지를 보면서 다시 수식에 대해 이야기 해보자. Cost Function(비용함수)의 편미분값은 그 지점의 접선 기울기와 같다. Gradient Descent 방법대로 기울기에 𝛼값을 곱한 값을 기존 𝜃값에 빼주면 그래프는 최적점과 조금 더 가까워지게 된다. 이 방법을 여러번 반복하면서 우리가 원하는 최저점을 찾아가는 것이 Gradient Descent라고 할 수 있겠다. 여기서 𝛼값은 어떻게 조정해야할까?

 

 

Learning Rate (𝛼)

 

𝛼, 즉 Learning Rate의 값이 너무 크거나, 너무 작다면 어떤 현상이 발생할까? 이를 잘 설명해주는 이미지가 있다.

 

내가 이해하는 영어라면 여러분도 이해할 수 있다.

 

𝛼값이 너무 작은 경우는 천천히 수렴하므로 수렴하기까지의 시간이 너무 오래걸린다.

𝛼값이 너무 큰 경우는 제대로 최저점을 찾지 못할 확률이 높으며 수렴하지 못한다.

𝛼값은 𝐽(𝜃)의 변화 값이 일정 수준이상 작아지면 수렴으로 판정되기 때문에 우선 작은 값으로 시작하여 큰 값으로  늘려나가는 것이 바람직하다고 볼 수 있다.

 

우리는 𝛼값을 Hyper Parameter(초매개변수)라고 한다. Hyper Parameter는 사람이 직접 설정해야 하고, Parameter는 훈련데이터와 학습 알고리즘을 통해 모델 내부에서 결정되는 변수를 의미한다. 이에 대한 자세한 설명을 여기를 참고하길 바란다.

 

 

 

 

 

 

최선의 Linear Regression

 

위의 이미지는 여태껏 설명했던 내용을 토대로 만들어진 Linear Regression이다. 이 모델은 모든 데이터에 대해 최선으로 오차가 적은, 즉 오류가 적은 함수로 우리가 원하는 예측값을 얻을 수 있다.

 

 

 

 

 

 


 

 

 

 

 

 

데이터 정규화

  표준화(standardization) 정규화(normalization)
공통점 데이터 rescaling
정의
&
목적
데이터가 평균으로부터 얼마나 떨어져있는지 나타내는 값 전체 구간을 0~1로 설정하여 데이터를 관찰하는 방법
특정 범위를 벗어난 데이터를 outlier로 간주하여 제거 데이터 군 내에서 특정 데이터가 가지는 위치를 볼 때 사용
장점
단점
이상치를 처리하기 좋음 모든 feature들의 스케일이 동일
동일한 척도로 정규화된 데이터 생성 x 이상치를 잘 처리하지 못함
공식 (요소값 - 평균) / 표준편차  (요소값-최소값) / (최대값 - 최소값)

머신러닝에서는 표준화보다 정규화가 더 좋은 결과가 나오기 때문에 정규화 선호

 

 

 

다중공선성

다중공선성에 대해 잘 설명한 블로그 링크를 걸어두었다. 블로그가 워낙 설명을 잘해주었기 때문에 링크를 타고 들어가 설명을 읽으면 되겠다. 다중공선성의 내용을 간단하게 요약하자면 다음과 같다.

 

다중 회귀식

α : 회귀계수

X : 독립변수(설명변수)

Y : 종속변수(반응변수)

ε : 오차항

 

 

위의 다중회귀식을 보자. 우리는 데이터에 해당하는 X1과 X2가 각각 독립이라는 가정하에 다중회귀식을 구현한다. 두 독립변수가 서로 독립적이어야 회귀식을 제대로 표현할 수 있기 때문이다. 하지만 내 마음과 같지 않게 두 독립변수가 독립변수가 아니라 서로에게 영향을 주고 있는 경우가 생긴다. 이런 경우에 다중공선성이 있다고 한다. 이에 대한 자세한 설명은 다음을 눌러 더 자세히 확인하길 바란다. 결론적으로는 다중공선성이 있는 경우 서로 영향을 주는 두 컬럼 중 하나를 삭제하여 회귀식을 구성해야 우리가 원하는 결과를 도출하는 회귀식을 만들 수 있다는 것이다.

 

 

 

'인공지능 > 인공지능 이론' 카테고리의 다른 글

10. ROC Curve  (0) 2019.09.12
9. Classification (분류)  (0) 2019.09.11
7. 머신러닝종류  (0) 2019.09.08
6. Train, Valid, Test Data / CrossValidation (교차 검증)  (0) 2019.08.27
5. 타이타닉(3) / 학습모델설정  (0) 2019.08.26

 

 

 

머신러닝은 크게 3가지의 학습 방법이 있다.

지도학습(Supervised Learning), 비지도학습(Unsupervised Learning)강화학습(Reinforcement Learning)이 그것이다.

여기 머신러닝의 3가지 학습 방법에 대해 간결하며 직관적으로 설명해 주는 블로그가 있다. 참고하길 바란다.

 

 

머신러닝 종류

 

 

Supervised Learning (지도 학습)

 

지도학습과 비지도학습은 과거와 현재의 데이터를 학습하여 미래를 예측한다. 하지만 이 둘의 차이점은 지도학습은 데이터에 대한 답이 정해져 있다는 것이다. 우리가 앞서 공부했던 타이타닉이 지도학습의 일종이라고 할 수 있다. 탑승자의 사망 여부를 알 수 있다는 것은 데이터에 대한 답이 이미 주어져있다는 것으로, 우리는 이러한 데이터를 활용하여 학습하고 예측할 수 있다. (마치 공대생들이 솔루션이 있는 상태에서 공부하는 것과 같다. 처음 보면 엥 ㅁㅊ 이게 뭐야 싶은 것도 솔루션과 함께라면 두렵지 않아. 아님 영어 지문의 정답을 아는 상태에서 지문을 읽으면 맥락과 답을 더 쉽게 유추 할 수 있는 것과 같다고 할 수 있겠다.) 지도학습에는 크게 Regression과 Classification으로 나뉜다.

 

 

 

-Regression (회귀)

 

Regression이란 연속된 값을 예측하는 문제를 뜻한다. 주로 경향성(패턴, 트렌드, 추세)을 예측할 때 사용된다. 주식같은 것도 학습시킬 수 있는 것 같지만 너무 어려워서 다들 다루지 않는 것 같다. Regression을 주로 사용하는 경우는 공부시간에 따른 성적을 예측하는 것과 나이에 따라 연봉의 추이정도와 같이 선형적인 경우이다.

 

-Classification (분류)

 

Classification은 주어진 데이터를 정해진 카테고리에 따라 분류하는 방법이다. 가장 쉬운 예로 패논패 과목이 있겠다. 일정 수준을 넘기면 Pass인 과목은 통과했는가, 하지 못했는가로 구분된다. 이러한 경우처럼 맞다 / 아니다로 구분되는 문제를 Binary Classification이라고 부른다. 이런 Binary Classification에 대표적인 예로 스팸 메일 예측을 들 수 있겠다. 이러한 경우 우리는 메일은 스팸메일과 정상적인 메일로 구분할 것이다. 맞다 / 아니다로 구분하는 것이 아니고 분류가 여러 개로 되는 경우, 예를 들자면 학점을 예측하는 경우는 A,B,C,D,F 총 5개로 분류하여 예측하기 때문에 이렇게 분류가 여러 개로 되는 경우는 Multi Label Classification이라고 한다.

 

 


 

 

Unsupervised Learning (비지도학습)

 

비지도학습은 지도학습과 달리 답이 없는 데이터로부터 미래를 예측하는 방법이다. (벌써 노답) 데이터에 답이 없기 때문에 노답 데이터를 사용하려는 사람이 직접 데이터 간의 숨겨진 유의미한 패턴 등을 파악해야 하기 때문에 어렵다. 비지도학습도 지도학습과 같이 연속적인지(Continous Data) 분류되어있는지(Categorial Data)를 파악하여 학습할 수 있다. 비지도학습은 크게 Dimensionality Reduction와 Clustering으로 나뉜다.

 

 

 

-Dimensionality Reduction (차원 축소)

 

차원 축소를 설명하자면 길어지니 비지도학습에 대해 자세히 설명할 때 설명하도록 하겠다. 간단히 말하자면 차원이 커지면 그 차원을 설명하기 위해 너무 많은 데이터가 필요하기 때문에 차원을 줄여 데이터 간의 유의미한 특징만을 추출해 내 학습하는 것을 뜻한다.

 

-Clustering (군집화)

 

Cluster(군집)이란 유사한 패턴의 데이터들이 서로 가깝게 모여있어 하나의 무리를 이루고 있는 것을 뜻한다. 이러한 군집들을 유의미한 유사도를 갖는 군집만 남기고 불필요한 군집들을 지워나가는 처리 과정을 Clustering(군집화)라고 한다. 지도학습의 Classification(분류)와 유사하나, Classification(분류)은 답이 있는 데이터들로 학습하는 것이고 군집화(Clustering)는 답이 없는 데이터들을 직접 분류하여 학습하는 방법이라는 것을 기억하자.

 

 

지도/비지도 학습에 대해 이해하기 쉽게 구분해놓은 이미지

 

 


 

 

Reinforce Learning (강화 학습)

 

강화학습이란 컴퓨터가 어떤 행동을 하면 그에 대한 “보상”을 통해 학습하는 것을 뜻한다.

한 예로, 자동차가 벽에 부딪히지 않고 주어진 트랙을 완주하는 것을 학습시킨다고 하자. 이 때, 우리는 벽에 부딪히지 않고 제일 멀리 간 모델에 가장 큰 보상을 준다고 가정하자. 컴퓨터는 학습을 위해 수십대의 자동차 모델을 트랙에 뿌릴 것이다. 그리고 가장 큰 보상을 준 모델과 유사한 모델들로 계속해서 자동차 모델을 만들 것이다. 이 횟수가 반복함에 따라(세대가 증가함에 따라) 더 나은 모델들이 학습될 것이고 마침내 컴퓨터는 벽에 부딪히지 않고 트랙을 완주하는 모델을 만들 것이다.

자동차를 예로 들었지만 결국에 강화 학습은 사람의 학습 방법, 동물의 학습 방법과 같다. 쉬운 예로 강아지에게 '손'을 외쳤을 때 사람의 손에 손을 올려주는 것을 학습시키려고 한다고 하자. 이를 위해 인간은 끊임없이 강아지에게 '손'을 외치며 강아지의 손을 자신의 손에 올릴 것이다. 처음에 강아지는 그런 인간의 행동이 이해가 가지 않을 것이다. 그러다가 우연의 일치로 강아지가 (학습하고자 하는 방향인) 사람의 손에 손을 올리면 '보상'으로 간식을 줄 것이고, 처음엔 우연이었던 손 올리기는 보상에 의해 차츰 학습되어 강아지가 직접 '손'이라는 단어를 인지하며 사람의 손바닥에 손을 올리게 될 것이다.

이처럼 보상을 통해 원하는 결과를 향해 반복적으로 학습해 나가는 방법을 강화학습이라고 한다.

 

강화학습

 

 

 

Train Data / Valid Data / Test Data

 

우리가 지금 청소기를 개발하고 있다고 가정하자. 나는 적은 에너지로 흡입력을 높이는 방법을 연구했고 개발했다. 그것을 실제로 청소기에 적용하고자 하여 팀을 꾸렸고 우리 팀은 시제품으로 나갈 청소기를 만들었다. 청소기가 완성되었으니 우리의 일은 끝난걸까? 그렇다면 정말 좋겠지만 우리는 이것이 우리가 원하는대로 제대로 작동하는지 테스트를 해봐야한다. 만약에 우리가 원하는대로 작동하지 않는다면, 원인과 이유를 찾아 내 우리가 원하는대로 작동하도록 만들어야한다.

 

수집한 데이터를 Train용과 Test용으로 나누었다.

 

인공지능도 마찬가지이다. 성능이 원하는만큼 나오는지에 대해 테스트를 해야만한다. 특히 인공지능은 여러 개의 데이터의 유사성과 관계성을 파악하여 알고리즘을 만들기 때문에 테스트가 반드시 필요하다. 학습시킨 데이터로는 정확도가 90% 이상이 나오지만 실제로 처음보는 테스트 데이터에서는 정확도가 60%가 나올 수도 있기 때문이다. (지금 내가 하고 있는 프로젝트가 그렇다 개빡쳐)

 

 


 

 

LG 에어컨의 유명한 일화로, 사람의 음성을 인식하는 AI 에어컨을 만들어 최종 컨펌을 받으려고 했으나 표준어로 학습시킨 AI에 '니 뭐꼬' 를 투척시켜 다양한 사투리를 재학습시킨 일화처럼 (개발자의 눈물이 여기까지 느껴지는 일화) 제품이 실제로 상용화되기전에는 테스트 단계가 반드시 필요하다. 이 LG의 일화같은 경우는 밑처럼 이해할 수 있다.

 

수집한 데이터를 Train / Valid / Test 로 나누었다.

 

개발자들이 표준어(Training Set)로 열심히 학습 시켰고, '너의 이름이 뭐니', '넌 누구니', '당신의 이름은 무엇입니까'와 같은 표준어의 데이터들(Validation Set)로 모델의 성능을 파악했지만 부회장의 '니 뭐꼬'(Test Set) 앞에 무너져 다시 처음부터 Train Data를 재수집하여 새롭게 학습시키는 결과가 나타났다. 이게 올바른 예시라고 볼 수는 없겠으나 어떻게든 Train Data / Valid Data / Test Data 에 대해 이해시키려는 노력으로 받아주길 바란다.

 

예로 든 LG 에어컨의 상황같은 경우를 찬찬히 살펴보자면 개발자들은 Train Data와 Valid Data를 사용해 표준어를 잘 이해하는 인공지능을 만들었다. (그러니까 무려 부회장의 컨펌을 받으러 갔겠지) 아마 부회장이 서울분이셨다면 이 인공지능은 테스트마저 성공적으로 마무리 되었을 가능성이 높다. 이러한 생각은 Valid Data를 사용하는 이유와 밀접한 관련이 있다. Valid Data는 학습을 통해 만들어진 모델이 잘 예측하는지를 평가하기 위해서 사용된다. 이해를 쉽게 하기 위해 밑에 이미지를 참고하자.

 

loss, acc, val_loss, val_acc를 볼 수 있다.

 

우리는 Train Data를 통해 학습을 시켜 알고리즘을 만들기 때문에 당연히 Train Data로는 성능이 좋을 수 밖에 없다. 하지만 처음 보는 데이터에서 우리의 모델은 어떻게 작동될까? 그것을 알기 위해 만든 데이터가 Valid Data이다. 위의 경우는 Train Data의 성능이 좋은 것은 물론이고 Valid Data의 정확도도 평균적으로 95%인 꽤 괜찮은 모델이라고 볼 수 있겠다. 따라서 우리는 Valid Data를 통해 Test Data에서도 우리가 원하는 결과를 얻을 수 있음을 기대할 수 있다. (하지만 '니 뭐꼬'처럼 Test Data에서 예상치 못한 상황이 발생하여 정확도가 떨어지는 경우도 있다. 이런 경우는 눈물을 머금으며 새롭게 시작해야한다.)

 

 

loss, acc는 높지만 val_loss, val_acc가 낮은 경우

 

하지만 이런 경우는 어떤가? 학습시킨 Train Data에서의 정확도는 높지만 처음 보는 데이터인 Valid Data에서의 정확도는 현저히 떨어진다. 이런 경우는 Test Data로 검증을 하기도 전에 모델이 잘못되었음을 알 수 있다. 또한 이런 경우는 Train Data에 대해 Overfitting이 일어났을 가능성을 말해준다. 이렇게 Valid Data를 이용하면 Test Data로 가기 전에 모델을 검증하고 잘못된 부분을 유추하여 모델을 고칠 수 있다.

 

+) Overfitting이란 학습에 사용한 데이터에 지나치게 적합한 것을 의미한다. 우리의 인공지능은 학습된 데이터를 기반으로 새롭게 본 데이터에 대해서도 유추하여 예측해야하는데 학습된 데이터에 지나치게 적합되어 있으면 새로운 데이터에서 효과적인 성능을 나타낼 수 없다. 이런 경우는 정규화를 거치거나 Epoch를 줄여 Overfitting을 줄인다.

 

 


 

 

그런데 왜 Valid Data를 사용하는걸까?

 

지금까지 설명한 내용을 보면 이것들은 Test Data를 사용해서도 충분히 할 수 있는 일이라는 생각이 든다. 필자도 처음에는 그랬다. 하지만 Test Data는 말 그대로 Test이다. 이게 무슨 말이냐면, 시중에 나가기 직전에 하는 간단한 테스트정도라고 이해하면 되겠다. 시중에 나가기 직전이라함은, 모든 오류들을 잡은 모델을 말 그대로 간단히 테스트한다고 보면 되겠다. 따라서 이 Test Data는 모델의 성능에 영향을 미치지 않고 단지 최종적으로 모델의 성능을 평가한다. Valid Data같은 경우는 val_loss, val_acc 등을 통해 나타난 수치를 통해 모델을 새롭게 만들고 조정하는 역할을 한다.

 

 

약간 쳇바퀴도는 설명같다고 느낄 수 있겠다. 그렇다면 더 단순히 말하겠다. Valid Data는 Train Data의 일부로 개발자가 이미 정답을 알고 있다. 그래서 개발자는 val_loss, val_acc같은 값을 알 수 있다. 하지만 Test Data는 개발자가 정답을 알고 있지 않다고 가정한다. 정답이 없는 테스트용 데이터들을 이미 만들어진 모델에 적용시켜 예측한 정답 값을 만들면 개발자는 모르는 Test Data의 정답과 비교하여 최종적인 정확도를 나타낸다. 만약 Test Data에서의 정확도가 낮다면 개발자는 모델을 다시 만들어야겠으나, 모델을 다시 설정할 때 Test Data는 어떤것도 관여하지 않는다. 왜냐하면 답을 모르기 때문이다. 이것은 정말 말 그대로 단지 검증용이다. 여기서 Test Data의 정답을 알아내 모델에 적용하면 그것은 더 이상 Test Data가 아니고 Valid Data가 된다.

 

 

 


 

 

 

Cross Validation (교차 검증)

 

하지만 위와 같이 Train Data를 Train Data와 Valid Data로 나누는 것은 Train Data가 많은 경우이다. 하지만 Train Data가 충분하지 않은 경우에서 Train Data와 Valid Data로 나누는 것은 매우 비효율적인 짓이다. (애초에 학습시킬 데이터도 적어 죽겠는데 거기서 또 나누는거니까) 따라서 이렇게 데이터가 적은 경우에는 Cross Validation(교차 검증)을 사용한다. 

 

Hold out / 이미지 재탕

 

단순히 Train Data와 Test Data로 나누면 무슨 문제가 발생할까? 이것은 매우 간단한 방식이지만 앞서 말한것처럼 모델을 만드는데 Test Data가 도움을 주지 못하므로 적은 양의 Train Data로는 좋은 성능을 기대하기 어려울 것이다. 또 데이터양이 너무 적기 때문에 Train Data와 Test Data를 어떻게 나누느냐에 따라 모델의 성능이 천차만별로 달라진다.

 

 


 

 

그렇다면 위와 같은 경우를 피하기 위해, 가지고 있는 데이터를 모두 사용하여 모델을 생성하면 이 모델은 학습에 사용한 데이터에는 성능이 좋지만 새로운 데이터에 대해서는 성능이 나쁜 모델이 된다(Overfitting). 이런 것을 막기 위해, 적은 데이터로도 Overfitting을 방지하고 일반화할 수 있는 방법을 평가하는 모델 검증 기법이 바로 Cross Validation(교차 검증)이다.

 

또한 추가적으로 Cross Validation을 하면 Hyperparameter Tuning을 할 수 있다. 여기서 Hyperparameter란, KNN에서는 k, 나이브베이즈에서 laplace, 의사결정트리의 trials, SVM의 lambda와 gamma, 신경망의 learning rate와 hidden을 의미한다. Hyperparameter Tuning으로 최적의 파라미터를 찾을 수도 있다.

 

Cross Validation(교차 검증)은 Train Data와 Test Data로 한 번 나누는 것보다 더 안정적이고 뛰어난 동계적 평가 방법으로 데이터를 여러 번 반복해서 나누고 여러 모델을 학습한다. 교차 검증에는 여러가지 방법이 있다.

 

1. K-Fold

 

K-Fold

K-Fold는 Train Data Set을 K개로 나누고 나눈 K개 중 한 개를 Valid, 나머지를 Training 용으로 사용하여 학습한다. Train Data로 학습을 한 후 한 개의 Valid Data로 모델을 테스트하여 성능을 측정한다. 이 때의 성능 평가는 Valid Data를 통해 얻은 정밀도의 평균과 표준편차 등으로 평가 할 수 있다. 같은 방식으로 K개의 모델을 반복한다. 최종 성능은 각각의 모델들의 성능 평가의 산술 평균으로 나타낸다. K-Fold는 모든 데이터를 학습과 평가용으로 사용할 수 있기 때문에 적은 데이터로 높은 정확도를 얻을 수 있으나, 학습 속도가 느리다.

 

 

2. Stratified K-Fold

 

K-Fold 와 Stratified K-Fold

 

 

예를 들어 데이터가 000000000011111111112222222222 로 구성되어 있다고 하자. 이걸 기존의 K-Fold로 나눈다면 어떻게 될까. 무조건 성능이 좋지 않게 나올 것이다. 이렇게 데이터가 특이하게 나뉜 경우를 위해 Stratified K-Fold를 사용한다. Stratified K-Fold는 각 Fold의 데이터 분포를 같게 해준다. 예로 든 데이터 같은 경우는 0,1,2로 10개의 Fold가 구성될 것이다. 이렇게 되면 데이터가 편향되지 않아 원래의 K-Fold의 장점을 잘 살리며 학습될 것이다.

 

 

3. Leave One Out (LOO)

 

K-Fold 교차 검증에서 K가 데이터 개수와 같을 때를 Leave One Out (LOO)라고 한다. 즉, 데이터 한 개를 하나의 모델로 하여 K-Fold 교차 검증을 한다는 말이다. 만약 데이터가 0부터 9까지 총 10개라고 하면 각 모델은 0,1,2,3,4,5,6,7,8,9 하나씩만을 갖는 모델이 될 것이고 이 모델로 K-Fold를 진행한다는 뜻이다. 이것은 적은 데이터에서 효과가 있으나 데이터가 많아지면 매우 느려진다.

 

 

4. Leave P Out

 

LOO와 비슷하지만, 여기서는 P개 만큼을 제외하고 Train Set과 Test Set을 만든다. 즉, N개의 데이터에 대해 Train_size=N-P, Valid_size=P 로 모델을 만들고 총 N개의 데이터에 대해 만큼 연산한다. LOO보다 더 느리다.

 

 

 

5. Shuffle Split

 

Shuffle Split


반복 횟수를 Train Fold, Valid Fold 개수와 독립적으로 조절할 수 있다. 또 Train Fold, Valid Fold의 합을 전체 Fold의 수와 다르게 설정도 가능하다.

 

 

6. Bootstrap

 

계산하기 어려운 데이터들의 분산, 평균, 편차 등을 구하는 통계기법으로 모집단의 분포도를 알 수 없을 때 사용한다. 데이터 양이 적을 때 모델의 통계적 신뢰도를 높이기 위해 사용되며, 데이터 셋 내에서 복원추출 방법을 이용해 새로운 샘플을 만든다. 이런 방식으로 충분히 많은 샘플이 생기면 모집단의 통계치를 추정할 수 있다.

'인공지능 > 인공지능 이론' 카테고리의 다른 글

8. Regression (회귀)  (0) 2019.09.08
7. 머신러닝종류  (0) 2019.09.08
5. 타이타닉(3) / 학습모델설정  (0) 2019.08.26
4. 타이타닉 (2) / 전처리  (0) 2019.08.22
3. 타이타닉 / EDA (탐색적 자료 분석)  (0) 2019.08.22

+ Recent posts