ㅅㅇ

머신러닝 _ 06_2_파이프라인 본문

AI_STUDY/머신러닝

머신러닝 _ 06_2_파이프라인

SO__OS 2022. 7. 9. 23:09

플레이데이터 빅데이터캠프 공부 내용 _ 7/5

머신러닝 _ 06_2_파이프라인

1.파이프라인 (Pipeline) 개요

    : 여러 단계의 머신러닝 프로세스 (전처리의 각 단계, 모델생성, 학습) 처리 과정을 설정하여 한번에 처리되도록 한다.

    : 데이터에 포커스를 맞춰 따로 해줘야 하는 여러 개의 흐름을 묶어주는 것.

       데이터가 흘러가는 흐름에다가 여러 처리를 한 번에 하는데 이때, 각 단계의 결과를 제대로 넘겨주는 게 중요하다.  

 

- 파이프라인은 여러개의 변환기마지막에 변환기 또는 추정기를 넣을 수 있다.

          - 추정기-Estimator는 마지막에만 올 수 있다.


    1) 전처리 작업 파이프라인
         - 변환기들로만 구성


    2) 전체 프로세스 파이프 라인
         - 변환기와 마지막에 추정기를 넣는다.

 

2. Pipeline 생성

- from sklearn.pipeline import Pipeline

- (이름, 변환기) 를 리스트로 묶어서 전달한다.
- 마지막에는 추정기가 올 수있다.

 

3. Pipeline 을 이용한 학습


- pipeline.fit() 
    - 각 순서대로 각 변환기의 fit_transform()이 실행되고 결과가 다음 단계로 전달된다. 마지막 단계에서는 fit()만 호출한다.
    - 마지막이 추정기일때 사용


- pipeline.fit_transform()
    - fit()과 동일하나 마지막 단계에서도 fit_transform()이 실행된다.
    - 전처리 작업 파이프라인(모든 단계가 변환기)일 때  사용


- 추정기(모델)

    - 마지막이 추정기(모델) 일 경우
    - predict(X), predict_proba(X)
    - 추정기를 이용해서 X에 대한 결과를 추론
    - 모델 앞에 있는 변환기들을 이용해서 transform() 그 처리결과를 다음 단계로 전달

 

4. Pipeline 사용 예제

# from sklearn.datasets import load_breast_cancer 데이터 셋 사용

 

1) 데이터 셋 로드, 분리

 

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

from sklearn.pipeline import Pipeline

X, y = load_breast_cancer(return_X_y=True)

X_train,X_test,y_train,y_test = train_test_split(X, y, stratify=y, random_state=0)

 

 

2) Pipeline 생성

 

- 리스트에  변환기(, 추정기)  프로세스 들을 순서대로  넣어준다.

    - 프로세스 클래스 만 넣는 게 아니라 프로세스 이름을 지정해 함께 튜플로 묶어 넣는다.  (grid search 에서 쓰임.)

 

- scaler, svm 실행 순서대로 파이프라인으로 묶인다.

 

order = [
    ('scaler', StandardScaler()), # ('프로세스이름', '프로세스클래스')
    ('svm',SVC())
]
pipeline = Pipeline(order, verbose=True) # verbose가 있으면 함수 수행시 발생하는 상세한 정보들을 표준 출력으로 자세히 내보낼 것인가를 나타냅니다. 보통 0 은 출력하지 않고, 1은 자세히, 2는 함축적인 정보만 출력하는 형태

print(pipeline.steps)
[('scaler', StandardScaler()), ('svm', SVC())]

 

 

3) 학습

 

pipeline.fit(X_train, y_train)

 

  - 파이프라인에 의하여  

   학습할 때,  변환기 (scaler).fit_transform(X_train)   -- >  svm.fit(변환된 X_train, y_train)   가 내부적으로 이뤄진다.

 
Pipeline(steps=[('scaler', StandardScaler()), ('svm', SVC())], verbose=True)
[Pipeline] ............ (step 1 of 2) Processing scaler, total= 0.0s [Pipeline] ............... (step 2 of 2) Processing svm, total= 0.0s

 

 

4) 추론 및 평가

 

 - 파이프라인에 의하여

  추론할 때,  변환기(scaler).transform(X_train)  -- >  svm(추정기).predict(변환된 X_train)    가 내부적으로 이뤄진다.

 

pred_train = pipeline.predict(X_train)
pred_test = pipeline.predict(X_test)

 

accuracy_score(y_train, pred_train), accuracy_score(y_test, pred_test)
(0.9929577464788732, 0.958041958041958)
 

5) 새로운 데이터에 대한 추론

- 파이프라인에 의하여

 추론할 때 변환기(scaler).transform(new_data)  -- >  svm(추정기).predict(변환된 new_data) 가 내부적으로 이뤄진다.

# scaling 안 된 데이터
new_data = X_test[:3]

pipeline.predict(new_data)
array([1, 0, 0])
 
 

5. GridSearch에서 Pipeline 사용

- 하이퍼파라미터 지정시,   파이프라인   `프로세스이름__하이퍼파라미터` 형식으로 지정한다.


1) Pipeline 생성

 

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

order = [
    ('scaler', StandardScaler()),
    ('svc', SVC(random_state=0))]

pipeline = Pipeline(order)

 


2) GridSearchCV의 estimator에 pipeline 등록

 

 - model 에 Pipeline 을 설정한다.

 

 - 하이퍼 파라미터 지정 방법  (pipeline 객체 생성 시, 지정해준 프로세스 이름을 적는다. )

     = >   "svc_ _C"  : [  ]

              "svc _ _ gamma"  :  [  ]

 

param = {
    "svc__C":[0.001, 0.01, 0.1, 1, 10], # Pipeline 안의 프로세스 중 이름이 svc인 모델의 C 하이퍼파라미터의 후보
    "svc__gamma":[0.001, 0.01, 0.1, 1, 10] # Pipeline 안의 프로세스 중 이름이 svc인 모델의 gamma 하이퍼 파라미터의 후보
}
gs = GridSearchCV(pipeline,  # model에 Pipelin 설정
                  param, 
                  scoring='accuracy', 
                  cv=4, 
                  n_jobs=-1)

   

 

3) 학습, 결과 확인

 

gs.fit(X_train, y_train)
GridSearchCV(cv=4,
             estimator=Pipeline(steps=[('scaler', StandardScaler()),
                                       ('svc', SVC(random_state=0))]),
             n_jobs=-1,
             param_grid={'svc__C': [0.001, 0.01, 0.1, 1, 10],
                         'svc__gamma': [0.001, 0.01, 0.1, 1, 10]},
             scoring='accuracy')

 

print(gs.best_params_)
print(gs.best_score_)
{'svc__C': 10, 'svc__gamma': 0.01}
0.9812643272791395

 

6. make_ pipeline() 함수 를 이용한 파이프라인 생성을 편리하게 하기

 

- 방법 :  머신러닝 프로세스 객체(변환기, 추정기) 를 순서대로 argument 로 전달.

 

       = >  make_pipeline(변환기객체, 변환기객체, ....., 추정기객체)   : Pipeline 간편하게 생성 !! 


- 프로세스의 이름을 프로세스클래스이름(소문자로변환)으로 해서 Pipeline을 생성.


- grid search 을 안 할 거라면,

  우리가 프로세스 이름 설정할 필요없기에 이 방법하면 된다. (내부적으로 알아서 이름 소문자로 생성)

 

 

1) make_ pipeline() 함수 로 파이프라인 생성

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler

# 파이프라인 생성
pipeline2 = make_pipeline(MinMaxScaler(), SVC(C=100)) 

print(pipeline2.steps)  # 프로세스의 이름이 소문자로 변환된 프로세스 클래스 이름
print(type(pipeline2))
[('minmaxscaler', MinMaxScaler()), ('svc', SVC(C=100))]
<class 'sklearn.pipeline.Pipeline'>

 

 

2) 학습 및 평가

 

- 학습 시, (minmaxscaler).fit_transform(X_train) 과 svc.fit(변환된 X_train,  y_train) 

 

- 모델.socre(X_test, y_test)  함수 :  각 모델의 default 평가를 해서 결과를 반환
           - 기본 평가 지표 :  분류모델 :accuracy   회귀 : R square

 

pipeline2.fit(X_train, y_train).score(X_test, y_test)  # 회귀 : R square
0.951048951048951