본문 바로가기

데이터 사이언스/머신러닝

[NIPA AI 교육/응용] 04. 지도학습

1. 분류란?

  • 주어진 입력 값이 어떤 클래스에 속할지에 대한 결과값을 도출하는 알고리즘
  • 다양한 분류 알고리즘이 존재
  • 예측 목표와 데이터 유형에 따라 적용됨
  • 분류 문제에는 다양한 머신러닝 모델을 사용하여 해결(트리구조, 확률모델, 결정 경계 등)

 

2. 의사결정나무(Decision Tree)

  • 스무고개와 같이 특정 질문들을 통해 정답을 찾아가는 모델
  • 결과가 직관적이며, 해석하기 용이
  • 학습이 끝난 트리의 작업 속도가 매우 빠름
  • 최상단의 뿌리마디(Root Node)에서 마지막 끝 마디(Terminal Node)까지 아래 방향으로 진행
  • 중간 마디(Internal node)를 통해 분리 기준을 더 추가할 수 있음
  • 분리 기준은 데이터의 불순도(impurity)를 최소화하는 구역으로 나눔
    • 불순도란, 다른 데이터가 섞여 있는 정도
    • 불순도 측정은 지니 불순도(Gini Impurity)엔트로피(entropy)가 있음
    • 지니 계수(Gini index)란, 해당 구역 안에서 특정 클래스에 속하는 데이터의 비율을 모두 제외한 값으로, 다양성을 계산하는 방법임 $$ Gini Index = 1 - (yes의 확률)^2 - (no의 확률)^2 $$
    • 지니 불순도 $$ Gini Impurity = \frac{n_1}{N}Gini_1 + \frac{n_2}{N}Gini_2 $$
      • \(n_i\) : \(i\)번째 자식 마디의 데이터 개수
      • \(N\) : 부모 마디의 데이터 개수
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(train_X, train_Y)

# 예측하기
pred_X = model.predict(test_X)

 

의사결정나무 깊이의 trade-off

  • 의사결정나무의 깊이가 깊어질수록 세분화해서 나눌 수 있음
  • 하지만 너무 깊은 모델은 과적합(Overfitting)을 야기할 수 있음
  • 데이터에 따라 다를 수 있지만 너무 깊은 모델은 지양

3. 분류 평가 지표

3.1. 혼동 행렬(Confusion Matrix)

  예측
Positive Negative
실제 Positive True Positive(TP) False Negative(FN)
Negative False Positive(FP) True Negative(TN)
  • True Positive(TP) : 실제 Postivie인 값을 Postivie라고 예측 = 정답
  • True Negative(TN) : 실제 Negative인 값을 Negative라고 예측 = 정답
  • False Positive(FP) : 실제 Negative인 값을 Positive라고 예측 = 오답; 1형 오류
  • False Negative(FN) : 실제 Positive인 값을 Negative라고 예측 = 오답; 2형 오류
from sklearn.metrics import confusion_matrix

y_pred = model.predict(test_X)

cm = confusion_matrix(y_test, y_pred)

3.2. 정확도(Accuracy)

$$ Accuracy = \frac{TP+TN}{P+N} = \frac{TP+TN}{(TP+FN) + (TN +FP)} $$

  • \( P: TP + FN, N: TN + FP \)
  • 전체 데이터 중에서 제대로 분류된 데이터의 비율
  • 모델이 얼마나 정확하게 분류했는지 나타내며, 일반적으로 분류 모델의 주요 평가 방법으로 사용
  • 클래스 비율이 불균형 할 경우, 평가 지표의 신뢰성을 잃을 가능성이 있음
from sklearn.metrics import accuracy_score

y_pred_train = model.predict(x_train)
y_pred_test = model.predict(x_test)

acc_train = accuracy_score(y_train, y_pred_train)

3.3. 정밀도(Precision)

$$ Precision = \frac{TP}{TP+FP} $$

  • 모델이 Positive라고 분류한 데이터 중에서 실제로 Positive인 데이터의 비율
  • 즉, 실제로 Negative인 데이터를 Positive라고 판단하면 안되는 경우 사용되는 지표(Negative가 중요한 이유)
from sklearn.metrics import precision_score

precision_score(train_Y, y_pred_train)

3.4. 재현율(Recall, TPR)

$$ Recall= \frac{TP}{TP+FN} = \frac{TP}{P} $$

  • 실제로 Positive인 데이터 중에서 모델이 Positive로 분류한 데이터의 비율
  • 즉, 실제로 Positive인 데이터를 Negative라고 판단하면 안되는 경우 사용되는 지표(Positive가 중요한 이유)
from sklearn.metrics import recall_score

recall_score(train_Y, y_pred_train)

 

 

  • 분류 결과를 전체적으로 보고 싶다 : 혼동 행렬(Confusion Matrix)
  • 정답을 얼마나 잘 맞췄는지 보고 싶다 : 정확도(Accuracy)
  • FP 또는 FN의 중요도가 높다 : 정밀도(Precision), 재현율(Recall)