728x90
Scikit-learn의 Pipeline은
여러 데이터 처리 과정을 하나로 묶어
효율적으로 실행할 수 있게 해주는 Class.
(일반적인) Pipeline 이란?
Pipeline은 일반적으로 (데이터) 처리 과정 또는 기계학습 등에서
“여러 단계(step or component)를 순차적으로 연결한 시스템” 을 가리킴.
일반적인 (데이터) Pipeline:
- 여러 데이터 처리 컴포넌트(=step)의 연속된 sequence로 구성됨.
- 각 component는 대량의 데이터를 가져와 처리하고 결과를 다음 단계로 전달.
- Pipeline을 구성하는 components는 주로 비동기적으로 실행되며, 각 단계는 독립적으로 작동하는 게 일반적임.
Scikit-Learn의 Pipeline:
- 여러 데이터 전처리 단계(step, component)와 최종 예측 모델을 하나의 estimator로 encapsulation.
- 데이터 변환과 모델 학습을 일관된 interface로 제공.
- step 은 transformer 들이고, 마지막 step 은 estimator, predictor 등의 어느 것도 가능함.
- 각 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 사용법 단계별 설명
- 단계 정의: transformer 와 model 정의.
Pipeline
객체 생성: 정의된 단계를Pipeline
객체로 묶음.- fit (데이터 학습):
fit
메서드를 호출하여 파이프라인 내 components(=steps)가 데이터를 처리. - predict: 학습된 파이프라인을 사용하여 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와 같은 도구를 사용해 파이프라인에 포함된 각 단계의 하이퍼파라미터를 함께 최적화할 수 음.
파이프라인은 복잡한 데이터 처리 작업을 체계적이고 효율적으로 수행할 수 있게 해주며, 특히 대규모 데이터셋을 다룰 때 유용함.
반응형
'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 |