[ML] scikit-learn: Pipeline 사용법

2024. 10. 3. 21:56·Programming/ML
728x90
728x90

https://www.kdnuggets.com/streamline-your-machine-learning-workflow-with-scikit-learn-pipelines

Scikit-learn의 Pipeline은
여러 데이터 처리 과정을 하나로 묶어
효율적으로 실행할 수 있게 해주는 Class.

(일반적인) Pipeline 이란?

Pipeline은 일반적으로 (데이터) 처리 과정 또는 기계학습 등에서
“여러 단계(step or component)를 순차적으로 연결한 시스템” 을 가리킴.

 

일반적인 (데이터) Pipeline:

  1. 여러 데이터 처리 컴포넌트(=step)의 연속된 sequence로 구성됨.
  2. 각 component는 대량의 데이터를 가져와 처리하고 결과를 다음 단계로 전달.
  3. Pipeline을 구성하는 components는 주로 비동기적으로 실행되며, 각 단계는 독립적으로 작동하는 게 일반적임.

Scikit-Learn의 Pipeline:

  1. 여러 데이터 전처리 단계(step, component)와 최종 예측 모델을 하나의  estimator로 encapsulation.
  2. 데이터 변환과 모델 학습을 일관된 interface로 제공.
  3. step 은 transformer 들이고, 마지막 step 은 estimator, predictor 등의 어느 것도 가능함.
  4. 각 step 은 fit(), transform(), 또는 fit_transform() 메서드를 구현해야 함.

Pipeline의 signature

class sklearn.pipeline.Pipeline(
         steps, 
         *, 
         memory=None, 
         verbose=False,
    )
  • steps:
    • pipeline에 포함될 단계들(components)의 List.
    • 각 step 는 tuple 형태: (name, transformer).
    • name은 해당 step 의 이름이며 : 단, "__" (double underscore)는 이름에 사용할 수 없음.
    • transformer은 transformer 나 model: final step can be anything.
  • memory: optional.
    • Pipeline의 중간 단계 결과를 캐싱하여 성능을 최적화.
    • 이를 설정하면 동일한 입력에 대해 중복된 계산을 피할 수 있음.
  • verbose: optional.
    • 각 단계의 실행 과정을 출력할지 여부를 결정하는 옵션
    • True로 설정하면 실행 과정이 출력.

Pipeline의 Key Attributes

  • steps
    • Pipeline 객체를 구성하는 steps (=components) 의 List
    • 각 step은 (name, transformer) 의 tuple 형태로 지정됨.
  • named_steps
    • Pipeline 객체를 구성하는 steps 를 요소로 가지는 Dictionary
    • key-value 의 페어들로 steps를 가짐.
  • n_feautre_in_
    • Pipeline의 입력 features 의 수
    • fit 후 사용 가능

Pipeline 사용법 단계별 설명

  1. 단계 정의: transformer 와 model 정의.
  2. Pipeline 객체 생성: 정의된 단계를 Pipeline 객체로 묶음.
  3. fit (데이터 학습): fit 메서드를 호출하여 파이프라인 내 components(=steps)가 데이터를 처리.
  4. predict: 학습된 파이프라인 object를 사용하여 prediction을 수행.

당뇨병 데이터셋을 이용한 Pipeline 예제

Scikit-learn의 load_diabetes 데이터를 활용하여 파이프라인을 구성하는 예제

https://gist.github.com/dsaint31x/e781e5075b618e6f1de54af6112e3f44

 

ml_pipeline_ex.ipynb

ml_pipeline_ex.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


Diabetes Dataset (당뇨병 데이터셋) 은

  • 10개의 특징(feature)을 가지고 있으며,
  • 목표값(target)은 연속형 변수 (당뇨병 진행 정도).

1.데이터 로드 및 분할

먼저, 데이터를 불러오고 학습 데이터와 테스트 데이터를 분리.

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

# 당뇨병 데이터셋 로드
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

# 학습 데이터와 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.Pipeline 단계 정의

  • StandardScaler를 사용해 데이터를 표준화,
  • 차원 축소를 위해 PCA를 적용,
  • Ridge regression model을 사용
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import Ridge

# 각 단계 정의: 표준화 -> PCA -> Ridge 회귀
pipeline = Pipeline([
    ('scaler', StandardScaler()),        # 데이터 표준화
    ('pca', PCA(n_components=5)),        # PCA로 차원 축소 (5개의 성분 사용)
    ('ridge', Ridge(alpha=1.0))          # Ridge 회귀 모델
])

3.모델 학습

이제 fit 메서드를 사용하여 파이프라인을 학습 데이터에 맞게 학습.

# 파이프라인 학습
pipeline.fit(X_train, y_train)

4. 예측 및 평가

테스트 데이터에 대해 예측을 수행하고, mean_squared_error를 통해 성능을 평가.

from sklearn.metrics import mean_squared_error

# 테스트 데이터에 대한 예측
y_pred = pipeline.predict(X_test)

# 성능 평가 (MSE)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.4f}")

5. 하이퍼파라미터 튜닝

GridSearchCV를 사용해

  • PCA의 성분 수와
  • Ridge regression 의 alpha 값을 최적화할 수 있음.
from sklearn.model_selection import GridSearchCV

# 하이퍼파라미터 그리드 설정
param_grid = {
    'pca__n_components': [2, 5, 7],
    'ridge__alpha': [0.1, 1.0, 10.0]
}

# 그리드 서치 설정 및 실행
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 최적의 파라미터 출력
print(f"Best parameters: {grid_search.best_params_}")

# 최적의 파라미터로 예측 수행
y_pred_best = grid_search.predict(X_test)
mse_best = mean_squared_error(y_test, y_pred_best)
print(f"Best Mean Squared Error: {mse_best:.4f}")

Scikit-Learn의 Pipeline 클래스의 주요 장점:

  • Data leakage (test data가 training 과정 중 노출되는 것 등)를 방지하고 코드를 간결하게 만듦.
  • 전처리 단계의 매개변수와 모델 매개변수를 동시에 최적화할 수 있음.
  • 특성 스케일링, 특성 선택, 차원 축소 등의 전처리 작업을 효율적으로 수행할 수 있음.
  • Model Fine-tuning: GridSearchCV와 같은 도구를 사용해 파이프라인에 포함된 각 단계의 하이퍼파라미터를 함께 최적화할 수 있음.

파이프라인은 복잡한 데이터 처리 작업을 체계적이고 효율적으로 수행할 수 있게 해주며, 특히 대규모 데이터셋을 다룰 때 유용함.

728x90

'Programming > ML' 카테고리의 다른 글

[ML] Imputation  (0) 2024.10.05
[ML] scikit-learn: FunctionTransformer  (0) 2024.10.03
[ML] scikit-learn: ColumnTransformer  (0) 2024.10.03
[ML] Minkowski Distance (L-p Norm)  (0) 2024.10.02
[ML] scikit-learn: Custom Transformer  (2) 2024.10.01
'Programming/ML' 카테고리의 다른 글
  • [ML] Imputation
  • [ML] scikit-learn: FunctionTransformer
  • [ML] scikit-learn: ColumnTransformer
  • [ML] Minkowski Distance (L-p Norm)
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (785)
      • Private Life (15)
      • Programming (55)
        • DIP (116)
        • ML (34)
      • Computer (119)
        • CE (53)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (368)
        • Signals and Systems (115)
        • Math (176)
        • Linear Algebra (33)
        • Physics (43)
        • 인성세미나 (1)
      • 정리필요. (61)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (7)
        • PET Study 2009 (1)
        • 방사선 장해방호 (5)
        • 방사선 생물학 (3)
        • 방사선 계측 (9)
        • 기타 방사능관련 (3)
        • 고시 (9)
        • 정리 (18)
      • RI (0)
      • 원자력,방사능 관련법 (2)
  • 블로그 메뉴

    • Math
    • Programming
    • SS
    • DIP
  • 링크

    • Convex Optimization For All
  • 공지사항

    • Test
    • PET Study 2009
    • 기타 방사능관련.
  • 인기 글

  • 태그

    cv2
    ML
    math
    linear algebra
    Probability
    numpy
    function
    Optimization
    SS
    Python
    opencv
    SIGNAL
    Programming
    random
    인허가제도
    Term
    signals_and_systems
    Vector
    fourier transform
    signal_and_system
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dsaint31x
[ML] scikit-learn: Pipeline 사용법
상단으로

티스토리툴바