본문 바로가기

개발 공부/머신러닝

[Machine Learning] 전체 워크플로우와 유방암 데이터 탐색하기

scikit-learn의 유방암 데이터를 이용해 전체 과정을 한 번 훑어본다.

 

1. 실습 환경 준비하기

uv add pandas numpy matplotlib seaborn scikit-learn category-encoders

결과 확인: 설치가 끝나면 pyproject.toml과 uv.lock에 패키지 정보가 반영된다.
Jupyter 커널을 다시 시작한 뒤 import 오류가 없는지 확인한다.

 

2. 머신러닝의 전체 워크플로우

전체 흐름 데이터 수집 → 점검·탐색(EDA) → 전처리·정제 → 모델링·훈련 → 테스트 데이터 평가

  • 수집: 모델이 배울 feature(X)와 정답인 target(y)을 확보
  • EDA: shape, info(), head(), describe() 등으로 구조·자료형·분포·결측치 확인
  • 전처리: 결측치 처리, 중복 제거, 피처 생성, 범주형 인코딩, 스케일 조정 등
  • 모델링: 문제에 맞는 알고리즘을 고르고 학습, 필요하면 하이퍼파라미터 조정
  • 평가: 학습에 쓰지 않은 테스트 데이터와 문제에 맞는 평가지표로 성능 확인

좋은 결과가 나올 때까지 이 흐름을 반복한다. 그래서 설정값과 검증 코드를 한곳에 모아두면 실험을 비교하기 쉬워진다.

 

3. 자주 쓰는 설정값을 한곳에 모으기

CONFIG = {
'seed': 42,
'target': 'target',
'test_size': 0.2,
}

SEED = CONFIG['seed']
TARGET = CONFIG['target']

결과 확인: 아래 셀에서 숫자 42나 문자열 target을 반복 입력하지 않고 CONFIG에서 꺼내 쓸 수 있다.
값을 바꿀 때도 한 곳만 수정하면 된다.

 

3-1. random_state를 고정하는 이유

데이터 분할이나 일부 알고리즘에는 무작위 과정이 들어간다.
random_state를 고정하면 같은 코드에서 같은 분할과 결과를 재현할 수 있어,
코드 수정이 실제 성능 개선인지 우연인지 비교하기 쉽다.

정확히 기억하기 개발·실험·경진대회에서는 재현성을 위해 시드를 고정한다. 운영 서비스에서 시드를 풀어야 한다는 일반 규칙은 없다. 서비스의 무작위성 필요 여부와 모델 동작에 따라 별도로 설계한다.

 

4. scikit-learn 유방암 데이터 불러오기

from sklearn.datasets import load_breast_cancer

bunch = load_breast_cancer()
print(bunch.keys())

결과 확인: data, target, feature_names, target_names, DESCR 등
데이터와 설명이 함께 들어 있는 Bunch 객체가 출력된다.

print(bunch.feature_names)  # 피처 이름
print(bunch.target_names)  # 타겟 클래스 이름
print(bunch.data.shape)  # 피처 데이터 크기
print(bunch.target.shape)  # 타겟 데이터 크기
print(bunch.DESCR[:800])  # 데이터셋 설명

  • data: 각 샘플의 측정값이 들어 있는 2차원 피처 행렬
  • target: 각 샘플의 정답이 들어 있는 1차원 벡터
  • feature_names: feature 컬럼명
  • target_names: 이진 분류 클래스 이름
  • DESCR: 데이터 출처와 변수 설명

 

5. DataFrame으로 만들고 타겟 합치기

import pandas as pd

df = pd.DataFrame(bunch.data, columns=bunch.feature_names)
df[TARGET] = bunch.target

결과 확인: 피처 30개에 target 컬럼이 추가된 표 형태가 된다.
모델링 전 탐색과 전처리를 Pandas로 진행하기 편해진다.

 

6. 기본 점검과 탐색

df.shape
df.info()
df.head()
df.describe().T

  • shape: 학습 샘플 수와 전체 컬럼 수 확인
  • info(): 저장 자료형, non-null 개수, 메모리 사용량 확인
  • head(): 실제 값과 컬럼 배치 확인
  • describe().T: 평균·표준편차·사분위수·최솟값·최댓값을 컬럼별로 확인

검증 포인트 target을 제외한 컬럼은 피처이며, target은 예측할 정답이다.
유방암 데이터는 이미 수치형으로 정리되어 있어 인코딩 실습이 필요하지 않지만, 실
제 데이터에는 문자열 범주형 피처가 자주 포함된다.

 

7. 피처와 타겟을 분리하고 학습·테스트 나누기

from sklearn.model_selection import train_test_split

X = df.drop(columns=[TARGET])
y = df[TARGET]

X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=CONFIG['test_size'],
random_state=SEED, stratify=y
)

결과 확인: X_tr·y_tr는 학습과 전처리 기준을 만들 때 사용하고, X_te·y_te는 마지막 평가에 사용한다.
stratify=y는 클래스 비율이 두 데이터셋에 비슷하게 유지되도록 돕는다.

데이터 누수 방지 평균, 인코딩 규칙, 스케일 등은 학습 데이터에서만 fit한다. 테스트 데이터는 학습한 규칙으로 transform만 해야 한다.

반응형