학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.06.23) 머신러닝, (의사결정나무알고리즘)

cd-record 2026. 6. 23. 18:33

 

 

머신러닝

머신러닝(Machine Leraning)이란?

머신러닝은 사람이 공부를 통해 지식을 습득하듯이, 컴퓨터에게 데이터를 제공하여 스스로 규칙을 학습하게 만드는 기술

머신러닝과 전통적 프로그래밍의 차이점

전통적 프로그래밍

입력 데이터
    ↓
프로그램(규칙)
    ↓
결과

머신러닝

데이터 + 정답
      ↓
머신러닝 학습
      ↓
모델 생성
      ↓
새로운 데이터 입력
      ↓
예측 결과

머신러닝의 종류

1. 지도학습(Supervised Learning)

정답이 있는 데이터를 학습하는 방식

 

대표 알고리즘

  • 의사결정나무
  • 로지스틱 회귀
  • SVM
  • 랜덤포레스트

사용 예시

  • 스팸메일 분류
  • 질병 진단
  • 주택 가격 예측

2. 비지도학습(Unsupervised Learning)

정답이 없는 데이터를 학습하는 방식

20대 여성 그룹
30대 직장인 그룹
고가 제품 선호 그룹

대표 알고리즘

  • K-Means
  • DBSCAN
  • PCA

사용 예시

  • 고객 세분화
  • 군집 분석
  • 이상치 탐지

3. 강화학습(Reinforcement Learning)

보상(Reward)을 통해 학습하는 방식

 

예시

게임 AI가 있다고 가정

이기면 +10점
지면 -10점
 

AI는 높은 점수를 얻기 위해 행동을 계속 수정합니다.

사용 예시

  • 자율주행
  • 게임 AI
  • 로봇 제어

4. 딥러닝(Deep Learning)

인간의 뇌를 모방한 신경망(Neural Network)을 이용하는 학습 방법

대표 사례

  • ChatGPT
  • 이미지 생성 AI
  • 음성 인식
  • 얼굴 인식

데이터 전처리

데이터 수집

전처리

학습

예측

정규분포

데이터가 가장 많이 나타내는 형태(평균 근처에 데이터가 많이 모이고, 평균에서 멀어질수록 데이터가 적어지는 분포)

 

대표적으로 정규분포를 따르는 경우

  • 몸무게
  • 시험점수

정규분포의 특징

  • 평균 근처에 데이터가 몰려있음
  • 양쪽으로 갈수록 데이터가 적어짐
  • 종 모양(Bell Curve)
## 정규분포
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 표준정규분포를 따르는 랜덤 데이터 (평균: 0, 표준편차: 1)
np.random.seed(42) # seed
data = np.random.randn(1000) # # 평균이 (0)이고 표준편차가 (1)인 표준정규분포로부터 1000개의 \(z\)-점수 난수를 생성

plt.hist(data, bins=30)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Nomaly Data')
plt.show()

 


스케일링

서로 다른 형태나 범위를 가진 데이터들을 공평하게 비교할 수 있도록 동일한 크기(스케일)로 맞춰주는 작업

 

1. 스케일링이 왜 필요한가요? (일상의 비유)

우리가 사과와 코끼리의 무게를 비교한다고 가정해 보겠습니다.
  • 사과는 '그램(g)' 단위로 재서 '300'이라는 숫자가 나왔습니다.
  • 코끼리는 '톤(t)' 단위로 재서 '4'라는 숫자가 나왔습니다.
숫자만 보면 300이 4보다 훨씬 큽니다. 하지만 컴퓨터는 단위(g, t)를 이해하지 못하고 숫자의 크기(300 vs 4)만 보고 사과가 코끼리보다 75배 더 무겁고 중요하다고 착각합니다. 이런 치명적인 오류를 막기 위해 단위를 통일하는 작업이 스케일링입니다.
 

 

2. 스케일링을 하면 무엇이 좋나요?

  • 공정한 비교: 단위와 범위가 다른 데이터(예: 키 180cm, 몸무게 70kg, 연봉 4000만 원)를 동일한 기준에서 비교할 수 있습니다.
  • 인공지능의 속도 향상: 컴퓨터가 정답(최적의 값)을 찾아가는 과정에서 숫자의 범위가 균일하면 지그재그로 헤매지 않고 최단 거리로 빠르게 찾아갑니다.

예측 정확도 상승: 숫자가 크다는 이유만으로 특정 데이터에만 모델이 과도하게 집중하는 현상을 막아주어 전체적인 예측 성능이 올라갑니다.

Z-Score 표준화(Standardization)

데이터의 평균을 0, 표준편차를 1로 변환하여 서로 다른 변수들의 척도를 통일하는 데이터 전처리 기법

 

장점

  • 이상치에 비교적 강함
  • 정규분포 데이터에 적합
  • 통계 기반 모델에 적합

사용하는 모델

  • 선형회귀
  • 로지스틱회귀
  • 신경망
  • PCA
  • SVM

 

공식

# 공식: (원점수 - 평균) / 표준편차
meat['Korea_std'] = (meat['Korea'] - meat['Korea'].mean()) / meat['Korea'].std()
meat['Japan_std'] = (meat['Japan'] - meat['Japan'].mean()) / meat['Japan'].std()

 

결과
평균 = 0
표준편차 = 1

# 결과값 변수를 Z라고 할 때
Z=1 => 평균보다 표준편차 1만큼 높은 값입니다.

Z=-2 => 평균보다 표준편차 2만큼 낮은 값입니다.

 

역변환

Z-Score 공식: z = (X - mu)/ sigma
 
 
  • X: 원래 데이터 값
  • mu: 데이터의 평균 (Mean)
  • sigm: 데이터의 표준편차 (Standard Deviation)
이 식을 우리가 구하고자 하는 원래 데이터 \(X\)에 대해 정리(역변환)하면 다음과 같은 식이 유도
 

X= (sigma * z) + mu

 
즉, (표준편차 \(\times z\)-점수) + 평균의 형태가 됩니다.
# 1000명의 연간 육류 소비량
# 한국인: 평균 53.9kg, 표준편차: 5kg
# 일본인: 평균 32.7kg, 표준편차: 4kg

meat_korea = 5 * np.random.randn(1000) + 53.9
meat_japan = 4 * np.random.randn(1000) + 32.7
 

Min-Max 정규화

데이터의 범위를 일정하게(보통 0과 1 사이) 조정하는 기법

 

장점

  • 데이터 범위를 동일하게 맞춤
  • 계산이 빠름
  • 거리 기반 알고리즘에 유리

사용하는 모델

  • KNN
  • K-Means
  • 신경망
  • 이미지 데이터

 

공식

# 공식: (원점수 - 최솟값)/(최댓값 - 최솟값)
Min = np.min(meat['Korea'])
Max = np.max(meat['Korea'])
meat['Korea_mm'] = (meat['Korea'] - Min) / (Max - Min)

meat['Korea_mm'] = (meat['Korea'] - meat['Korea'].min()) / (meat['Korea'].max() - meat['Korea'].min())
meat["Japan_mm"] = (meat['Japan'] - meat['Japan'].min()) / (meat['Japan'].max() - meat['Japan'].min())

meat.sample(10)
 

결과

# 모든 값이
0 ~ 1

# 원래 값변환 값
10	=> 0
20	=> 0.5
30	=> 1
 

사이킷런 스케일러를 이용한 표준화/정규화

# 사이킷런 스케일러를 이용한 표준화 / 정규화
from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler = StandardScaler()
meat['Korea_std2'] = scaler.fit_transform(meat[['Korea']])
meat['Japan_std2'] = scaler.fit_transform(meat[['Japan']])
meat.sample(10)
scaler2 = MinMaxScaler()
meat['Korea_mm2'] = scaler2.fit_transform(meat[['Korea']])
meat['Japan_mm2'] = scaler2.fit_transform(meat[['Japan']])

meat.sample(10)

 


의사결정나무(지도학습)

데이터를 분류(Classification)하거나 연속적인 값을 예측(Prediction)하기 위해, 의사결정 규칙을 나무(Tree) 구조로 도표화한 지도학습 머신러닝 알고리즘

 

🌲 의사결정나무의 주요 특징
  • 직관적인 구조: 마치 '스무고개'나 조건문(if-else)과 같이 데이터를 분류하여 누구나 쉽게 이해하고 결과를 설명할 수 있습니다.
  • 분류 및 회귀: 범주형 데이터를 분류하는 분류 트리와 연속형 데이터를 예측하는 회귀 트리 모두에 사용됩니다.
  • 데이터 전처리 용도: 변수의 정규화(스케일링) 등 복잡한 데이터 전처리가 거의 필요 없어 사용이 편리합니다.
  • 과적합(Overfitting)의 위험: 나무가 너무 복잡해지면 학습 데이터에만 맞춰져 새로운 데이터에 대한 예측 성능이 떨어질 수 있습니다. 이를 방지하기 위해 가지치기(Pruning) 과정이 필수적입니다
🌳 의사결정나무의 핵심 구조와 작동 원리
데이터의 불순도(Impurity)를 낮추고 순도(Purity)를 높이는 방향으로 데이터를 분할합니다.
  1. 루트 노드(Root Node): 나무의 가장 최상단으로, 전체 데이터가 시작되는 지점입니다.
분할 기준 (불순도 측정 지표)
  • 지니 계수(Gini Index): 데이터가 얼마나 불순한지를 나타내며, 값이 0에 가까울수록 완벽하게 분류된 상태를 의미합니다.
  • 엔트로피(Entropy): 데이터의 무질서함을 측정하는 지표로, 엔트로피가 낮을수록 정보가 명확합니다.

## 1) 필수 패키지 import
# 패키지 임포트
import pandas as pd
import numpy as np
import sklearn

# 학습 및 테스트 데이터셋 분리를 패키지
from sklearn.model_selection import train_test_split

# 의사결정나무 분류모델을 위한 알고리즘
from sklearn.tree import DecisionTreeClassifier

## 2) 데이터 불러오기
df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
df

## 3) 데이터 탐색
df.shape # 데이터 개수와 열 개수를 확인
df.info()
df.describe()

## 4) 전처리
# 범주형값 바꾸기 (레이블 인코딩)
df['species'].unique()
df['species'].value_counts()
df['species'] = df['species'].replace({'setosa':0, 'versicolor':1,'virginica':2})
df.info()

## 5) 데이터셋 분리
# 분석 데이터셋 준비 (독립변수(피처), 종속변수(타겟))
X = df[['sepal_length','sepal_width','petal_length','petal_width']]
y = df['species']

# 데이터셋 분리 (학습용, 테스트용 = 8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape, sep="\n")

## 6) 머신러닝 학습
### DecisionTreeClassifier 객체 생성 (알고리즘 선택)
dt = DecisionTreeClassifier(random_state=42)

# 학습 수행
dt.fit(X_train, y_train) # 학습용 문제와 답지

## 7) 예측 수행
pred = dt.predict(X_test)
pred

y_test.values

## 8) 성능분석 (성능지표 확인)
# 정확도
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, pred)
print(acc)

# 정밀도, 재현율, f1-score
from sklearn.metrics import classificaton_report
rpt = classification_report(y_test, pred)
print(rpt)

핵심 4대 척도 (Metrics)

4대 척도의 역할과 쓰임새

 

모델이 단순히 전체 정확도(Accuracy)만 높다고 좋은 모델은 아닙니다. 데이터가 한쪽으로 치우쳐 있을 때(예: 암 환자가 1%밖에 없는 경우) 정확도는 99%가 나와도 실제 암 환자를 하나도 못 찾을 수 있기 때문입니다. 이때 이 척도들이 필요합니다.

 

정확도 (Accuracy)

  • 수식: (TP + TN) / (TP + TN + FP + FN)
  • 필요성: 전체 예측 중 맞춘 비율을 나타내므로, 전체 성능을 간단하게 평가 할수 있습니다.
  • 언제 사용하나: 클래스 불균형이 심하지 않은 경우에 유용합니다.
  • 왜 필요한가: 모델이 전반적으로 잘 작동하는지 확인하기 위해 사용합니다.

정밀도 (Precision)

  • 수식: TP / (TP + FP)
  • 용도: 실제는 아닌데 참이라고 잘못 판단하면 큰 손해가 발생하는 경우 중요합니다 (예: 스팸 메일 분류).
  • 필요성: 모델의 긍정 예측이 얼마나 신뢰할 수 있는 지를 측정
  • 언제 사용하나: False Postibie(잘못된 긍정 예측0의 비용이 높은 경우에 중요합니다
  • 왜 필요한가: 긍정 예측의 신뢰성을 높이고자 할 때 사용합니다.

재현율 (Recall 또는 Sensitivity)

  • 수식: TP / (TP + FN)
  • 용도: 실제 참인 것을 놓치면 치명적인 경우 중요합니다 (예: 암 진단, 범죄 탐지).
  • 필요성: 실제 긍정 중에서 모델이 얼마나 잘 긍정 예측을 했는 지를 나타냅니다.
  • 언제 사용하나: False Negative(잘못된 부정 예측)의 비용이 높은 경우에 중요합니다.
  • 왜 필요한가: 긍정 사례를 최대한 많이 찾아내고자 할 때 사용합니다.

F1-Score

  • 수식: 2 x ((Precision x Recall) / (Precision + Recall))
  • 용도: 한쪽 지표에 치우치지 않고 모델의 전체적인 성능을 균형 있게 평가할 때 사용합니다.
  • 필요성: 정밀도와 재현율 간의 균형을 평가합니다.(조화 평균)
  • 언제 사용하나: 정밀도와 재현을 모두 중요할 떄, 특히 데이터가 불균형할 경우에 유용합니다.
  • 왜 필요한가: 두 지표간의 균형을 유지하여, 한쪽에 치우치지 않은 성능 평가를 위해 사용합니다.

Support

  • 개념: 각 클래스에 속한 실제 데이터의 개수입니다.
  • 특징: 성능을 평가할 때 해당 클래스의 데이터 수가 너무 적지는 않은지(신뢰할 수 있는지) 판단하는 기준이 됩니다. 위의 예시에서는 0번 클래스 50개, 1번 클래스 50개로 총 100개의 데이터가 평가에 사용되었음을 의미합니다.

혼동행렬(Confusion Matrix)

4가지 경우의 수 (혼동 행렬의 구성 요소)

 

모델의 예측값과 실제 정답을 비교했을 때 발생하는 4가지 조합입니다. (여기서 양성/음성은 모델이 분류하고자 하는 대상을 의미합니다.)

  • TP (True Positive): 실제 정답이 '참'인데, 모델도 '참'이라고 맞춘 경우.
  • TN (True Negative): 실제 정답이 '거짓'인데, 모델도 '거짓'이라고 맞춘 경우.
  • FP (False Positive): 실제 정답은 '거짓'인데, 모델이 '참'이라고 틀린 경우 (오경보, 1종 오류).
  • FN (False Negative): 실제 정답은 '참'인데, 모델이 '거짓'이라고 틀린 경우 (놓침, 2종 오류).

분류 모델의 성능을 '교차표(Cross-table)' 형태

 

구조 살펴보기 (2x2 이진 분류 예시)

 

가장 기본이 되는 이진 분류(맞다/틀리다)의 혼동 행렬은 다음과 같습니다.

실제 \ 예측 예측: 양성(Positive) 예측: 음성(Negative)
실제: 양성(Positive) TP (잘 맞춤) FN (놓침 - 오답)
실제: 음성(Negative) FP (잘못된 경고 - 오답) TN (잘 맞춤)

 

다중 분류(Multi-class)로 확장

# 혼동 행렬 (가로: 예측, 세로: 실제 답)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, pred)
  • 대각선 요소: 실제 클래스와 예측 클래스가 일치하는 경우 (모델이 맞춘 것)
  • 대각선 외 요소: 실제 클래스와 예측 클래스가 다른 경우 (모델이 무엇으로 착각했는지 확인 가능)

 

 

 

 

 

 

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.