이번 포스팅에선 Scikit-learn으로 K-최근접 이웃(KNN)Keras(TensorFlow)로 MLP 두 가지 예제를 합쳐서
1) 모델 학습의 공통 흐름
2) 코드 구성 방식
3) 주요 포인트
를 정리해볼게요.


1. 개요

머신러닝·딥러닝 모델을 학습할 때 기본적으로 거치는 단계는 크게 다음과 같아요.

  1. 라이브러리 임포트
  2. 데이터 수집 및 전처리
  3. 모델 정의(구축)
  4. 모델 학습(Training)
  5. 모델 평가(Evaluation)

아래에서 두 가지 대표 예제를 보면서, 각 단계에서 무엇을 해야 하는지 차근차근 살펴보게요.


2. 필요한 라이브러리 임포트


# Scikit-learn 예제용
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# Keras(TensorFlow) 예제용
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical
  • Scikit-learn: 일반적인 전통 ML 알고리즘
  • TensorFlow/Keras: 심층 신경망(Deep Learning) 구축에 최적

3. 데이터 수집 및 전처리

3.1 Iris 데이터 (KNN)

iris = load_iris()
X, y = iris.data, iris.target

# 데이터프레임으로 미리보기 (선택)
df = pd.DataFrame(X, columns=iris.feature_names)
df['species'] = y

# 훈련/테스트 분리
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 스케일링 (거리 기반 알고리즘은 필수!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled  = scaler.transform(X_test)
  • stratify=y: 클래스 비율 유지
  • StandardScaler(): 평균 0, 분산 1로 맞춰줘야 KNN 성능 UP

3.2 MNIST 숫자 이미지 (MLP)


# 데이터 로드
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 정규화 (픽셀값 0~1로)
X_train = X_train.astype('float32') / 255.0
X_test  = X_test.astype('float32') / 255.0

# 원-핫 인코딩 (10가지 클래스)
y_train = to_categorical(y_train, 10)
y_test  = to_categorical(y_test, 10)
# 이미지일 땐 정규화 필수!
  • to_categorical: 다중 클래스 분류용 레이블 변환

4. 모델 정의

4.1 KNN 분류기


model = KNeighborsClassifier(n_neighbors=3)
  • K-NN: 별도 학습 과정 없이, 거리를 기반으로 예측
  • n_neighbors=3: 주변 3개의 샘플 투표로 클래스 결정

4.2 간단한 MLP (다층 퍼셉트론)


model = Sequential([
    Flatten(input_shape=(28, 28)),     # 28×28 → 784 벡터
    Dense(128, activation='relu'),     # 은닉층 128개 노드
    Dense(10, activation='softmax')    # 출력층 10개 클래스
])

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)
  • Flatten: 2D 이미지를 1D로 변환
  • relu 활성화: 은닉층에서 폭넓게 쓰임
  • softmax + categorical_crossentropy: 다중 클래스 분류에서 기본 조합

5. 모델 학습

5.1 Scikit-learn KNN


model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
.fit()

# 거리 기반이라 추가 하이퍼파라미터 튜닝 별도 고려

5.2 Keras MLP


history = model.fit(
    X_train, y_train,
    epochs=5,
    batch_size=32,
    validation_split=0.1,
    verbose=2
)
  • epochs: 전체 데이터를 몇 번 반복 학습할지
  • batch_size: 한 번에 처리할 샘플 수
  • validation_split: 학습 중 검증용 분리 비율

6. 모델 평가

6.1 Iris KNN 평가


from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")

print(classification_report(y_test, y_pred, target_names=iris.target_names))
print(confusion_matrix(y_test, y_pred))
# 정확도, 정밀도/재현율/F1, 혼동 행렬로 성능 전반 확인

6.2 MNIST MLP 평가


loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f"테스트 정확도: {accuracy:.4f}")
print(f"테스트 손실: {loss:.4f}")

7. 마무리 및 팁

  • 데이터 전처리(스케일링, 정규화, 인코딩)가 성능의 80%를 좌우
  • 모델 구조와 하이퍼파라미터(k 값, learning rate, batch size 등)는 실험으로 최적화
  • 학습 곡선(history)를 시각화하면 과적합/과소적합 판단에 도움

이제 Scikit-learn과 Keras 예제를 활용해, 프로젝트에 맞게 데이터➜모델➜학습➜평가 플로우를 자유롭게 응용해보세요


작성일:2025.07.08
작성자:발라

profile
능숙한 바이브코딩을 할 수 있게 됨을 꿈꾸며

0개의 댓글