ㅅㅇ
머신러닝 _ 06_2_파이프라인 본문
플레이데이터 빅데이터캠프 공부 내용 _ 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
'AI_STUDY > 머신러닝' 카테고리의 다른 글
머신러닝 _ 08_지도학습_SVM (0) | 2022.07.14 |
---|---|
머신러닝 _ 07_ 지도학습 _ 최근접이웃 (0) | 2022.07.10 |
머신러닝 _ 06_1_과적합 일반화와 그리드 서치 (0) | 2022.07.06 |
머신러닝 _ 04_데이터 전처리 (0) | 2022.07.01 |
머신러닝 _ 03_데이터셋 나누기와 교차검증 (0) | 2022.06.30 |