본문 바로가기
프로그래밍/Scikit-Learn

[Scikit-Learn] 12. 파이프라인(Pipeline) 사용하기 (feat. Pipeline, make_pipeline)

by 부자 꽁냥이 2022. 8. 7.

 

이번 포스팅에서는 Scikit-Learn(sklearn)에서 Pipeline의 개념과 이를 사용하는 방법에 대해서 알아보려고 한다.

 

- 목차 -

1. Pipeline 개념

2. Pipeline 사용법


   Pipeline 개념

Pipeline은 데이터 전처리에서 학습까지의 과정을 하나로 연결해주는 것이라고 보면 된다. Pipeline이라는 단어도 각 과정을 파이프로 연결된 모습을 묘사한 것 같다.

 

아래 그림은 변수 선택에서부터 학습까지의 과정을 Pipeline을 사용하지 않은 경우와 사용하는 경우를 나타낸 것이다.

 

Pipeline을 사용하지 않는 경우(왼쪽)과 Pipeline을 사용하는 경우(오른쪽) 모형 학습 과정

왼쪽 그림은 Pipeline을 사용하지 않는 경우 즉, 기존 방식의 모형 학습 과정이다. 기존 방식은 변수 선택 과정을 코딩하고 선택된 변수를 다시 표준화 한 다음 이를 가지고 모형을 학습하게 된다. 

 

하지만 오른쪽과같이 Pipeline을 사용하는 경우 Pipeline에 작업(변수 선택, 표준화, 모형 클래스)을 등록만 해주면 기존 과정을 한 번에 처리할 수 있다. Pipeline에 작업을 등록하는 것은 어렵지 않기 때문에 모형 학습에 있어서 여러가지 과정을 거쳐야 한다면 확실히 Pipeline을 사용하는 것이 유리하다.


   Pipeline 사용법

여기서는 변수 선택 → 표준화 → 모형 학습 3단계를 가정해보자.

 

1) Pipeline을 사용하지 않는 경우

먼저 기존 방식대로 해당 과정을 수행해보자. 변수 선택부터 모형 학습까지 하나하나 코딩해줘야한다.

 

from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris


## 붓꽃 데이터 준비
iris = load_iris()
 
X = iris.data
y = iris.target

## 변수 선택
feat_sel = SelectKBest(f_classif, k=2)
X_selected = feat_sel.fit_transform(X, y)
print('선택된 변수 :', feat_sel.get_feature_names_out())
print()
## 표준화
scaler = StandardScaler()
scaler.fit(X_selected)
X_transformed = scaler.transform(X_selected)
print(X_transformed[:5, :])
print()
## 모델 학습
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X_transformed, y)
print('예측 : ', clf.predict(X_transformed)[:3])
print('학습 정확도 : ', clf.score(X_transformed, y))

 


2) Pipeline 사용

이제 Pipeline을 사용해보자. Pipeline 사용법은 다음과 같이 작업명, 작업 클래스 두 개로 이루어진 튜플을 리스트로 담아서 Pipeline에 담아줘야 한다.


Pipeline( [ ('작업명 1',  작업 클래스 1), ('작업명 2', 작업 클래스 2), . . . ] )


이제 Pipeline을 이용하여 앞에서의 과정을 간단하게 만들어보자. 먼저 Pipeline에 작업을 등록해주고 fit을 통해 학습만 해주면 된다. 기존 작업이 단 몇 줄만으로 수행된다. 놀랍지 않은가?

 

## 작업 등록
pipeline = Pipeline([('Feature_Selection', SelectKBest(f_classif, k=2)), ## 변수 선택
 ('Standardization', StandardScaler()),  ## 표준화
 ('Decision_Tree', DecisionTreeClassifier(max_depth=3)) ## 학습 모델
])

pipeline.fit(X, y) ## 모형 학습
print(pipeline.predict(X)[:3]) ## 예측
print(pipeline.score(X, y)) ## 성능 평가

 

Pipeline을 이용한 모형 학습과 예측 결과

 

예측 결과와 성능 평가는 앞의 결과와 동일하다.


혹시라도...

Pipeline에 작업 등록이 귀찮은 분들은 make_pipeline을 이용하여 좀 더 편하게 작업을 등록할 수 있다. make_pipeline은 Pipeline과는 다르게 작업 클래스만 차례대로 넣어주면 되며 작업명을 자동으로 생성해준다.

 

pipeline = make_pipeline(SelectKBest(f_classif, k=2), 
              StandardScaler(), 
              DecisionTreeClassifier(max_depth=3))
pipeline

 



3) Pipeline 중간 결과 확인하기

Pipeline을 이용하여 학습하고 최종 예측 결과는 확인이 되었다. 이때 중간 결과 즉, 변수 선택법으로 선택된 변수는 무엇인지 표준화는 기존과 같이 잘되었는지 확인하고 싶을 때가 있다. 이때 인덱스, named_steps 2가지 방법으로 중간 결과를 확인할 수 있다.

 

a. 인덱스를 이용한 중간 결과 확인

Pipeline은 모형을 학습하고 나서 각 과정을 인덱스로 접근할 수 있다. 이를 이용하여 변수 선택 결과, 표준화 결과를 확인해보자.

 

## 중간 결과 보기 - 인덱스를 이용한 방법
## 선택된 변수 보기
print('선택된 변수 :', pipeline[0].get_feature_names_out())
print()
## 표준화가 잘되었는지 확인하기
var_selected = pipeline[0].get_feature_names_out()
X_selected = X[:,[int(x.replace('x','')) for x in var_selected]]
X_transformed = pipeline[1].transform(X_selected)
print(X_transformed[:5, :])

 

 

앞의 결과와 동일한 것을 알 수 있다.

 

b. named_steps을 이용한 중간 결과 확인

Pipeline에서는 naed_steps를 이용하여 각 작업 과정을 딕셔너리로 접근할 수 있다. 

 

named_steps에 담겨진 작업과정 딕셔너리

 

이를 이용하면 위에서 본 것과 동일한 과정으로 중간 결과를 확인할 수 있다.

 

## 중간 결과 보기 - named_steps 이용한 방법
## 선택된 변수 보기
print('선택된 변수 :', pipeline.named_steps['Feature_Selection'].get_feature_names_out())
print()
## 표준화가 잘되었는지 확인하기
var_selected = pipeline.named_steps['Feature_Selection'].get_feature_names_out()
X_selected = X[:,[int(x.replace('x','')) for x in var_selected]]
X_transformed = pipeline.named_steps['Standardization'].transform(X_selected)
print(X_transformed[:5, :])

 


 

 

댓글


맨 위로