일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 데이터사이언스학과
- 퀀트 투자 책
- 사이킷런
- 하이퍼 파라미터
- 주요 파라미터
- 머신러닝
- 판다스
- 랜덤포레스트
- 주가데이터
- 데이터사이언티스트
- 베이지안 최적화
- sklearn
- 데이터사이언스
- 하이퍼 파라미터 튜닝
- 대학원
- 파라미터 튜닝
- 경력 기술서
- 자기소개서
- 데이터분석
- 경력기술서 첨삭
- 주식데이터
- 이력서 첨삭
- AutoML
- 퀀트
- 데이터 사이언스
- 커리어전환
- 코딩테스트
- pandas
- 데이터 사이언티스트
- 파이썬
- Today
- Total
GIL's LAB
머신러닝 파이프라인 (Machine Learning Pipeline) 본문
머신러닝 파이프라인
넓은 의미에서 머신러닝 파이프라인(pipeline)은 데이터 수집, 전처리, 모델 학습, 학습 모델 배포, 예측 등 머신러닝의 전체 과정을 순차적으로 처리하는 일련의 프로세스입니다. 좁은 의미에서 파이프라인은 새로운 데이터가 들어왔을 때 이 데이터의 라벨을 예측하기까지 필요한 프로세스입니다.
일반적으로 모델을 학습할 때 사용한 데이터는 전처리된 데이터이므로, 새로 입력된 데이터도 같은 방식으로 전처리해서 모델에 입력해줘야 합니다. 머신러닝 자동화 시스템에서 주로 사용되는 파이프라인 구조는 아래 그림과 같습니다.
사이킷런: Pipeline 클래스
사이킷런에는 Pipeline이라는 클래스를 사용하여 파이프라인을 설계, 학습, 활용할 수 있습니다. 이 클래스를 이용하여 만든 파이프라인 인스턴스는 전처리 및 예측 모델 인스턴스를 각 요소가 튜플인 리스트로 입력받습니다. 이 튜플은 인스턴스의 이름과 인스턴스로 구성됩니다.
간단한 예제를 통해 파이프라인을 만드는 방법을 알아보겠습니다. 먼저 데이터를 불러오고 분리하겠습니다.
예제 데이터는 아래에서 다운로드 받을 수 있습니다.
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)
데이터 분석 서비스가 필요한 분은 아래 링크로!
'데이터사이언스 > 머신러닝' 카테고리의 다른 글
모델별 하이퍼 파라미터 튜닝 가이드라인 (0) | 2022.07.25 |
---|---|
랜덤포레스트와 다중공선성 (0) | 2022.07.24 |
지도학습에서의 데이터 분할과 k겹 교차 검증 (0) | 2022.03.02 |
[AutoML] 채용 동향 (0) | 2022.03.01 |
[AutoML] 머신러닝 자동화가 필요한 이유 (0) | 2022.02.27 |