데이터 분석/데이터 사이언스

데이터 사이언스 - 6. 머신러닝 기초 (6.2 머신러닝 라이브러리 (scikit-learn))

개발_노트 2025. 3. 20. 16:09

6.2 머신러닝 라이브러리 (scikit-learn)

Scikit-learn머신러닝을 위한 가장 널리 사용되는 파이썬 라이브러리로,
데이터 전처리, 모델 학습, 평가, 하이퍼파라미터 튜닝 등의 다양한 기능을 제공한다.

이 장에서는 Scikit-learn을 활용한 데이터 처리(Pipeline)와 모델 저장(joblib, pickle) 방법을 다룬다.


6.2.1 Scikit-learn 개요

Scikit-learn 특징

  • 다양한 머신러닝 알고리즘 제공 (선형 회귀, 랜덤 포레스트, SVM 등)
  • 데이터 전처리 기능 지원 (결측치 처리, 스케일링, 인코딩 등)
  • 모델 평가 및 하이퍼파라미터 튜닝 지원

설치 방법

pip install scikit-learn

Scikit-learn 기본 사용 흐름

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 샘플 데이터 생성
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [0, 1, 0, 1, 0]

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 예측 및 평가
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print("Accuracy:", accuracy)

출력 예시

Accuracy: 1.0

6.2.2 Pipeline을 활용한 데이터 처리

① Pipeline이란?

Pipeline은 데이터 전처리 → 모델 학습 과정을 하나의 흐름으로 자동화하는 기능이다.

  • 여러 단계를 하나의 객체로 묶어서 실행 가능
  • 데이터 전처리와 모델 학습을 한 번에 적용 가능
  • 데이터 변환 과정에서 데이터 누수를 방지

② Pipeline 기본 사용 예제

📌 표준화(Scaling) + 로지스틱 회귀(Logistic Regression) 모델 적용

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Pipeline 생성 (표준화 + 로지스틱 회귀)
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 데이터 스케일링 (정규화)
    ('classifier', LogisticRegression())  # 로지스틱 회귀 모델
])

# 모델 학습
pipeline.fit(X_train, y_train)

# 예측 및 평가
accuracy = pipeline.score(X_test, y_test)
print("Pipeline Accuracy:", accuracy)

Pipeline 사용 장점

  • 데이터 전처리 및 모델 학습을 한 번에 수행
  • 데이터 스케일링과 모델 학습을 자동으로 연결
  • 새로운 데이터가 들어와도 동일한 변환 적용 가능

③ 여러 개의 전처리 단계를 포함한 Pipeline 예제

📌 결측치 처리(SimpleImputer) + 표준화(StandardScaler) + 분류 모델(RandomForestClassifier)

from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier

# Pipeline 생성
pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='mean')),  # 결측치 평균 대체
    ('scaler', StandardScaler()),  # 표준화
    ('classifier', RandomForestClassifier(n_estimators=100))  # 랜덤 포레스트 모델
])

# 모델 학습
pipeline.fit(X_train, y_train)

# 예측 및 평가
accuracy = pipeline.score(X_test, y_test)
print("Pipeline Accuracy with Imputer:", accuracy)

추가적인 전처리 단계를 포함하여 자동화 가능


6.2.3 모델 저장 및 로드 (joblib, pickle 활용)

머신러닝 모델은 학습 후에도 저장하여 재사용할 수 있어야 한다.
Scikit-learn에서는 joblib와 pickle을 활용하여 모델을 저장하고 불러올 수 있다.


① joblib을 활용한 모델 저장 및 불러오기

joblib은 대용량 모델을 저장하는 데 최적화

import joblib

# 모델 저장
joblib.dump(pipeline, "model_pipeline.joblib")

# 모델 불러오기
loaded_model = joblib.load("model_pipeline.joblib")

# 로드한 모델로 예측 수행
accuracy = loaded_model.score(X_test, y_test)
print("Loaded Model Accuracy:", accuracy)

joblib 사용 장점

  • 대용량 모델 저장에 적합
  • NumPy 배열을 효율적으로 저장

② pickle을 활용한 모델 저장 및 불러오기

pickle은 일반적인 파이썬 객체 저장에 적합

import pickle

# 모델 저장
with open("model_pipeline.pkl", "wb") as f:
    pickle.dump(pipeline, f)

# 모델 불러오기
with open("model_pipeline.pkl", "rb") as f:
    loaded_model = pickle.load(f)

# 로드한 모델로 예측 수행
accuracy = loaded_model.score(X_test, y_test)
print("Loaded Model Accuracy (Pickle):", accuracy)

pickle 사용 장점

  • 모델뿐만 아니라 파이썬 객체(리스트, 딕셔너리 등) 저장 가능
  • 소규모 모델을 간단히 저장할 때 유용

6.2.4 joblib vs pickle 비교

방법 장점 단점 사용 예시
joblib 대용량 모델 저장 최적화 일반 객체 저장에는 부적합 대규모 머신러닝 모델 저장
pickle 모든 파이썬 객체 저장 가능 대용량 모델 저장 비효율적 소규모 모델 또는 일반 객체 저장

모델 크기가 크다면 joblib 사용을 권장!


결론

Scikit-learn을 활용하면 머신러닝 모델을 손쉽게 학습, 평가, 저장할 수 있다.

핵심 요약

  • Pipeline → 데이터 전처리 + 모델 학습을 한 번에 처리
  • joblib, pickle → 학습된 모델을 저장하고 재사용 가능
  • joblib은 대용량 모델 저장에 적합, pickle은 일반 객체 저장에 적합

이러한 개념을 이해하면 머신러닝 모델을 효율적으로 관리하고 배포할 수 있다.