머신러닝
머신러닝(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'라는 숫자가 나왔습니다.
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만큼 낮은 값입니다.
역변환
- X: 원래 데이터 값
- mu: 데이터의 평균 (Mean)
- sigm: 데이터의 표준편차 (Standard Deviation)
X= (sigma * z) + mu
# 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) 과정이 필수적입니다
- 루트 노드(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) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.06.24) KNN 알고리즘, GridSearchCV (0) | 2026.06.24 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.06.22) Pandas 그룹화/형변환 (0) | 2026.06.22 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.19) Pandas 데이터 전처리 정리 (0) | 2026.06.19 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.17) Pandas (0) | 2026.06.17 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.11) JWT 기반 인증 (0) | 2026.06.11 |