GIL's LAB

머신러닝 파이프라인 (Machine Learning Pipeline) 본문

데이터사이언스/머신러닝

머신러닝 파이프라인 (Machine Learning Pipeline)

GIL~ 2022. 3. 17. 17:25

머신러닝 파이프라인

넓은 의미에서 머신러닝 파이프라인(pipeline)은 데이터 수집, 전처리, 모델 학습, 학습 모델 배포, 예측 등 머신러닝의 전체 과정을 순차적으로 처리하는 일련의 프로세스입니다. 좁은 의미에서 파이프라인은 새로운 데이터가 들어왔을 때 이 데이터의 라벨을 예측하기까지 필요한 프로세스입니다.

일반적으로 모델을 학습할 때 사용한 데이터는 전처리된 데이터이므로, 새로 입력된 데이터도 같은 방식으로 전처리해서 모델에 입력해줘야 합니다. 머신러닝 자동화 시스템에서 주로 사용되는 파이프라인 구조는 아래 그림과 같습니다.

머신러닝 파이프라인 예시

 

사이킷런: Pipeline 클래스

사이킷런에는 Pipeline이라는 클래스를 사용하여 파이프라인을 설계, 학습, 활용할 수 있습니다. 이 클래스를 이용하여 만든 파이프라인 인스턴스는 전처리 및 예측 모델 인스턴스를 각 요소가 튜플인 리스트로 입력받습니다. 이 튜플은 인스턴스의 이름과 인스턴스로 구성됩니다.
간단한 예제를 통해 파이프라인을 만드는 방법을 알아보겠습니다. 먼저 데이터를 불러오고 분리하겠습니다.
예제 데이터는 아래에서 다운로드 받을 수 있습니다.

bands.csv
0.05MB

1 import pandas as pd
2 from sklearn.model_selection import train_test_split
3 
4 df = pd.read_csv("bands.csv")
5 X = df.drop('y', axis = 1)
6 y = df['y']
7 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 2022)

이제 파이프라인에 들어갈 임퓨터, 스케일러, 분류 모델 인스턴스를 정의하겠습니다.

1 from sklearn.impute import SimpleImputer
2 from sklearn.preprocessing import MinMaxScaler
3 from sklearn.svm import SVC
4 
5 imputer = SimpleImputer(strategy = "mean")
6 scaler = MinMaxScaler()
7 model = SVC(kernel = "rbf")

위 코드에서 imputer, scaler, model 모두 학습하지 않았음에 주의해야 합니다.

이제 파이프라인을 생성하고 학습해보겠습니다.

1 from sklearn.pipeline import Pipeline
2 P = Pipeline([("imputer", imputer), ("scaler", scaler), ("model", model)])
3 P.fit(X_train, y_train)
  • 라인 2: imputer, scaler, model 순서대로 구성된 파이프라인 인스턴스 P를 생성했습니다. 각각의 이름은 "imputer", "scaler", "model"이라 정했습니다.
  • 라인 3: P를 X_train과 y_train을 이용하여 학습합니다.

이제 학습한 파이프라인을 이용하여 X_test의 라벨을 예측해보겠습니다.

1 display(P.predict(X_test))

[실행 결과]

array([0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1,
       1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1,
       1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1,
       1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1,
       1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1,
       1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1,
       1, 1, 1], dtype=int64)

위 결과는 결측이 제거되고 스케일링이 된 X_test가 SVC 모델에 입력되어 나온 결과입니다. 즉, predict 메서드는 파이프라인의 마지막 요소인 SVC 모델의 메서드를 사용한 것입니다.
만약 전처리 인스턴스로만 구성된 파이프라인이라면, transform 메서드를 이용하여 파이프라인을 구성하는 요소 순서대로 전처리를 할 수 있습니다.

1 P = Pipeline([("imputer", imputer), ("scaler", scaler)])
2 P.fit(X_train, y_train)
3 display(P.transform(X_test)[0])

[실행 결과]

array([0.31578947, 0.13513514, 0.4175    , 0.39090909, 0.375     ,
       0.52919021, 0.16666667, 0.15794469, 0.43137255, 0.40924376,
       0.5298976 , 0.10813766, 0.00585399, 0.83333333, 0.35714286,
       0.3036564 , 0.66666667, 0.57058481, 1.        ])

 

파이프라인 커스터마이징하기

Pipeline 클래스는 분명 편리한 클래스이지만 다음과 같은 문제가 있습니다. 첫째, 사이킷런의 인스턴스가 아닌 다른 인스턴스가 파이프라인에 포함되면 정상적으로 작동하지 않을 수 있습니다. 둘째, 하이퍼 파라미터 튜닝 등을 할 때 전체 파이프라인을 계속해서 수정해가야 하는 번거로움이 있습니다. 특히 한 번 학습된 전처리 모델을 불필요하게 여러 번 재학습해야할 수 있습니다.
그래서 이 책에서 다루는 모든 파이프라인은 커스터마이징을 위해 직접 함수 형태로 작성하겠습니다. 위에서 구현했던 파이프라인을 함수화해보겠습니다. 먼저 imputer, scaler, model을 각각 학습해주겠습니다.

1 imputer.fit(X_train, y_train)
2 scaler.fit(X_train, y_train)
3 model.fit(X_train, y_train)

다음으로 my_pipeline이라는 함수를 작성하겠습니다.

1 def my_pipeline(X, imputer, scaler, model):
2     X = imputer.transform(X)
3     X = scaler.transform(X)
4     pred_Y = model.predict(X)
5     return pred_Y

이 함수는 결측을 제거하고 스케일링한 X를 model에 투입한 결과를 반환합니다. 이 함수는 아래와 같이 사용할 수 있습니다.

1 pred_Y = my_pipeline(X_test, imputer, scaler, model)
2 display(pred_Y[:5])

[실행 결과]

array([0, 1, 0, 1, 0], dtype=int64)

 


데이터 분석 서비스가 필요한 분은 아래 링크로! 

https://kmong.com/gig/374194 

 

데이터사이언스 박사의 데이터 분석 서비스 드립니다. | 150000원부터 시작 가능한 총 평점 5점의 I

78개 총 작업 개수 완료한 총 평점 5점인 데이터사이언스박사의 IT·프로그래밍, 데이터 분석·시각화 서비스를 68개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터 분석·시각화 제공 등 150

kmong.com

 

Comments