본격적인 모델 소개 전 머신러닝 학습에 미리 알아야할 개념들을 정리하고 넘어가야겠다.
1. 과적합 (Overfitting)
모델의 진짜 목적은 훈련 데이터가 아니라 새 데이터를 잘 맞추는 것이다. 이걸 일반화(generalization) 라고 한다.
문제는 — 훈련 데이터에 너무 잘 맞추면 오히려 새 데이터에서 성능이 나빠진다. 이게 과적합이다.

| 상태 | 모델 | 훈련 성능 | 테스트 성능 |
| 과소적합 | 너무 단순 | 낮음 | 낮음 |
| 적정 | 균형 | 높음 | 높음 |
| 과적합 | 너무 복잡 | 매우 높음 | 낮음 |
훈련과 테스트 성능의 격차로 확인한다. 격차가 크면 과적합, 둘 다 낮으면 과소적합.
전통적인 통계가 ⍺ error와 β error 을 중요하게 다루었다면, 머신러닝은 이러한 과적합을 줄이는것에 중요하게 다룬다.
2. Train / Test / Validation data - 머신러닝 데이터의 3분할
보통 머신러닝에서는 가지고 있는 데이터를 3개의 세트 로 나눠서 쓴다.
Train set : 모델이 패턴을 학습하는 데이터. 학습단계에 사용되며, 매 epoch/반복마다 사용됨.
Validation set : 학습 중간에 모델의 일반화 성능을 점검하고 조정하는 데이터. 하이퍼파라미터 튜닝, 조기종료, 변수선택 등에 이용됨.
Test set : 모든 결정이 끝난 후, 진짜 새 데이터에 대한 성능을 추정하는 데이터. Test set의 데이터는 Train에 사용되어서는 안된다.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3. 데이터 전처리
머신러닝 모델은 숫자를 입력으로 받는다. 의학 데이터는 범주형 변수, 단위가 다른 연속변수, 결측치 등이 섞여 있어 그대로 못 쓰기 때문에 전처리가 필요하다. 또한, 결측치가 존재하면 학습하는데 불가한 모형들이 있기 때문에 결측치도 미리 적절히 처리해야 한다.
3-1. One-Hot Encoding — 범주형 변수 처리
문제 — 혈액형(A, B, O, AB)을 A=1, B=2, O=3, AB=4 로 쓰면 모델이 서열로 오해한다 ("AB는 A보다 4배 크다"). 사실은 서열 없는 범주인데도.
해결 — 각 범주를 별도의 0/1 컬럼으로 분해.

파이썬에서 두 가지 방법이 있다.
방법 1 — pandas get_dummies : 빠른 탐색·분석에 적합.
import pandas as pd
df_encoded = pd.get_dummies(df, columns=['blood_type'])
방법 2 — sklearn OneHotEncoder : 프로덕션·파이프라인에 표준.
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
X_train_encoded = encoder.fit_transform(X_train[['blood_type']])
X_test_encoded = encoder.transform(X_test[['blood_type']]) # 주의: fit은 train에서만!
둘의 차이 — get_dummies는 사용이 빠르고 간단하지만, test에 새 범주가 나오면 컬럼 수가 달라질 수 있다. OneHotEncoder는 훈련 시 학습된 범주를 기억하고 handle_unknown='ignore' 로 새 범주를 안전하게 처리한다. 그래서 학습-배포 파이프라인에서는 OneHotEncoder가 주로 사용된다. 하지만 두 방법의 결과는 동일하고 큰 차이없다.
3-2. Standard Scaling — 연속 변수 표준화
연속변수에서 나이(0-100), 혈압(60-180), 콜레스테롤(100-300) 처럼 단위가 다르면, 일부 모델은 큰 단위 변수에 압도된다. 절대값이 큰 콜레스테롤이 가장 중요한 변수처럼 학습됨. 모든 변수를 평균 0, 표준편차 1로 변환하여 학습할 수 있으며, 이를 Standard scaler 라고 한다. Standard scaler가 유일한 표준화 방법은 아니지만 많이 사용되는 방법이며, 중요한점은 학습전에 범주형 변수를 One-hot encoding 한다면, 연속변수를 표준화 시켜야 한다는 점이다.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test) # 주의: fit은 train에서만!
중요한 함정 — fit_transform은 훈련 데이터에서만. 테스트는 훈련의 평균·표준편차로 변환만 한다. 그렇지 않으면 데이터 누설이 일어난다.
3-3. Tensor — 딥러닝의 데이터 형식
지금까지 다룬 데이터 형식은 Pandas DataFrame과 NumPy 배열이다. 그런데 딥러닝(PyTorch, TensorFlow) 은 또 다른 형식 — Tensor(텐서) — 를 쓴다.
Tensor란? — 다차원 배열. NumPy의 ndarray와 거의 같지만, 두 가지 추가 능력이 있다.
| 형식 | 사용처 | 핵심 특징 |
| Pandas DataFrame | 데이터 전처리·탐색 | 라벨 있는 표 |
| NumPy ndarray | 전통 ML (scikit-learn) | 빠른 수치 연산 |
| PyTorch Tensor | 딥러닝 | NumPy + GPU 가속 + 자동 미분 |

Tensor의 두 가지 추가 능력:
- GPU 가속 — tensor.to('cuda') 로 GPU 메모리에 올려 수십~수백 배 빠른 행렬 연산
- 자동 미분 (Autograd) — 신경망 학습에 필수인 그래디언트를 자동 계산. NumPy로는 직접 못함.
이 두 가지 때문에 딥러닝 모델은 반드시 Tensor를 입력으로 받는다.
3-4. DataFrame → Tensor 변환
전형적 흐름은 2단계 이다 — DataFrame → NumPy → Tensor.
import pandas as pd
import torch
# 1. DataFrame 준비
df = pd.read_csv('data.csv')
features = ['age', 'bp', 'chol']
X_df = df[features]
y_df = df['outcome']
# 2. NumPy 배열로 변환
X_np = X_df.values # 또는 X_df.to_numpy()
y_np = y_df.values
# 3. Tensor로 변환
X_tensor = torch.tensor(X_np, dtype=torch.float32)
y_tensor = torch.tensor(y_np, dtype=torch.long) # 분류면 long, 회귀면 float
print(X_tensor.shape) # torch.Size([n, 3])
print(X_tensor.dtype) # torch.float32
한 줄로도 가능:
X_tensor = torch.tensor(df[features].values, dtype=torch.float32)
자주 만나는 함정
(1) dtype 명시 — torch.tensor()는 데이터 타입을 자동 추론하는데, 신경망은 보통 float32를 기대한다. 명시적으로 지정하는 게 안전하다.
(2) Tensor → DataFrame (역변환) — 결과를 분석하려면 다시 Pandas로 돌려야 할 때가 있다.
# GPU에 있다면 CPU로, gradient가 있다면 detach
df_back = pd.DataFrame(tensor.detach().cpu().numpy(), columns=features)
(3) 배치 학습 — 실제 신경망은 전체 Tensor를 한꺼번에 안 쓴다. DataLoader로 배치 단위로 쪼개서 학습한다.
from torch.utils.data import TensorDataset, DataLoader
dataset = TensorDataset(X_tensor, y_tensor)
loader = DataLoader(dataset, batch_size=32, shuffle=True)
for X_batch, y_batch in loader:
# 학습 한 스텝
...
4. 머신러닝의 표기법 — X, y, ŷ
머신러닝 코드와 논문을 읽으려면 표준 표기법부터 알아야 한다. 이 표기는 선형대수학에서 유래된 관습이고, scikit-learn 같은 라이브러리들이 충실히 따른다.
4-1. 핵심 표기 규칙
선형대수학의 정통 표기 규칙이 그대로 들어와있다.
- 대문자(X, A, B 등) : 행렬(matrix) 또는 데이터셋
- 소문자(x, y, z) : 벡터 또는 스칼라
- 그리스 문자(α, β, λ, θ) : 스칼라 매개변수
- i, j, k : 인덱스 변수
4-2. X (대문자) — 입력 행렬
머신러닝의 입력 데이터는 일반적으로 다음 구조를 가진다.
머신러닝 코드와 논문을 읽으려면 표준 표기법부터 알아야 한다. 이 표기는 선형대수학에서 유래된 관습이고, scikit-learn 같은 라이브러리들이 충실히 따른다.
변수1 변수2 변수3 ... 변수p
샘플1 [ x11 x12 x13 ... x1p ]
샘플2 [ x21 x22 x23 ... x2p ]
샘플3 [ x31 x32 x33 ... x3p ]
: [ : : : ... : ]
샘플n [ xn1 xn2 xn3 ... xnp ]
n개 행(샘플) × p개 열(변수, feature)로 구성된 2차원 행렬이라 대문자 X로 쓴다.
4-3. y (소문자) — 출력 벡터
각 샘플이 정답값 하나씩만 가지므로 1차원 벡터이다. 그래서 소문자 y로 쓴다.
샘플1: y1 = 0
샘플2: y2 = 1
샘플3: y3 = 0
: :
샘플n: yn = 1
4-4. ŷ (와이 햇) — 모델의 예측값
ŷ은 y에 곡절 부호(circumflex, "햇 hat")를 씌운 것이다. 추정량 또는 예측값을 나타내는 통계학의 표준 표기가 그대로 머신러닝에 들어왔다.
원래 통계학에서는 진짜 모수와 추정한 모수를 구별하기 위해 햇을 씌웠다. β는 진짜 회귀계수, β̂은 데이터로부터 추정한 값. 같은 논리로:
- y : 실제 정답 (관측된 값)
- ŷ : 모델이 예측한 값
이 둘의 차이 y − ŷ가 잔차(residual)이고, 모델 학습은 이 잔차의 제곱합을 최소화하는 작업이다.
4-5. 자주 함께 쓰이는 표기들
| 표기 | 의미 |
| X | 입력 행렬 (n × p) |
| xᵢ | i번째 샘플의 입력 벡터 |
| xᵢⱼ | i번째 샘플의 j번째 변수 값 |
| y | 출력 벡터 (n차원) |
| yᵢ | i번째 샘플의 정답 |
| ŷ | 모델의 예측 벡터 |
| β 또는 w | 회귀계수 / 가중치 |
| θ | 일반적인 모델 파라미터 |
| n | 샘플 수 |
| p 또는 d | 변수 수 |
| f(x) | 모델 함수 |
| L 또는 ℓ | 손실 함수 (Loss) |
전형적인 머신러닝 수식은 ŷ = f(X; θ) 형태이다. 읽는 법 — "파라미터 θ를 가진 모델 f가 입력 X에 대해 예측값 ŷ을 만든다".
이 표기는 관습이고 절대적이지는 않다. 어떤 책은 입력을 t로 표시하기도 하고(시계열에서), 가중치를 w 또는 β로 다르게 쓰기도 한다. 하지만 X, y, ŷ만큼은 거의 모든 ML 자료의 표준이라고 보면 된다.
5. 하이퍼파라미터
머신러닝에는 조절 가능한 값이 두 종류 있다. 헷갈리기 쉽다.
| 파라미터 | 하이퍼 파라미터 | |
| 누가 정하나 | 모델이 데이터로부터 학습 | 사람이 학습 전에 설정 |
| 언제 | 학습 중 | 학습 전 |
| 예시 | 회귀계수 β, 신경망 가중치 | 트리 깊이, 학습률 |
하이퍼파라미터는 연구자가 직접 설정해야 한다. 의학연구들에서는 기존의 연구들에서 또는 연구자의 판단에 따라 설정을 할 수도 있고, 여러개의 하이퍼파라미터를 변경해가며 가장 좋은 성능의 값을 찾을 수도 있다. 연구자의 개입이 들어갈 수도 있다는 점에서 연구의 객관성에 대해 주의를 요한다.
6. Data Leakage
Data Leakage란 모델 학습 단계에서 원래 알 수 없어야 할 정보가 어떻게든 학습에 사용되는 현상으로, 조금 더 직관적으로 말하면, "test에서 봐야 할 정보를 train이 미리 훔쳐본 것"이다.
| 유형 | 원인 | 해결 방법 |
| Target Leakage | 결과 정보가 변수에 포함 (예: follow-up duration이 사망 예측 변수로) | 변수 측정 시점이 target보다 앞서는지 검토 |
| Train-Test Contamination | Scaler·Imputer를 전체 데이터로 fit | Train/Test Split 먼저 / Pipeline으로 묶기 |
| Group Leakage | 같은 환자가 train·test 양쪽에 | GroupKFold / GroupShuffleSplit |
| Temporal Leakage | 시간 순서 무시한 split | TimeSeriesSplit 또는 시간순 절단 |
| Resampling Leakage | SMOTE를 split 전에 적용 | Split 후 train에만 SMOTE |
핵심 원칙 3가지
- Split을 가장 먼저 — 어떤 전처리도 split 전에 하지 않는다.
- Pipeline으로 묶기 — ColumnTransformer + Pipeline이 leakage를 물리적으로 차단한다.
- 너무 좋으면 의심 — 의학 데이터에서 AUC 0.95+ 또는 test가 train보다 좋게 나오면 거의 확실한 leakage.
7. 기타 용어
- 피쳐 Feature : 통계에서 독립변수에 해당한다.
- 손실 Loss : 모델 예측이 정답과 얼마나 다른지를 나타내는 숫자
- Epoch : 훈련 데이터 전체를 한 번 다 학습한 단위
- 배치 Batch : 한 번에 묶어서 처리하는 데이터 덩어리 (예: 환자 32명씩)
'의학 연구' 카테고리의 다른 글
| [비전공자의 머신러닝 의학연구 #5] Random Forest, Random Survival Forest (0) | 2026.05.03 |
|---|---|
| [비전공자의 머신러닝 의학연구 #4] 결정트리 Decision Tree (0) | 2026.05.02 |
| [비전공자의 머신러닝 의학연구 #2] 머신러닝을 위한 파이썬 패키지 — 도구 박스 정리 (0) | 2026.04.30 |
| [비전공자의 머신러닝 의학연구 #1] 머신러닝의 개요, 분류 (0) | 2026.04.28 |
| 정부가 숨기고 있는 의대증원의 근거 (OECD 통계) (3) | 2024.02.18 |