Posts 파이프라인(Pipeline)
Post
Cancel

파이프라인(Pipeline)

1. 파이프라인(Pipeline)

1.1 Pipeline란

  • 데이터를 가지고 분류기를 실행시킬때 하이퍼파라미터나 스케일러 등의 적용을 하다보면 코드의 순서가 바뀌는 등의 어려운 점이 있다.
  • 해당 불편함을 해결해주는 Sklearn의 Pipeline이 있다.
  • 쉽게 생각하여 데이터가 내가 설정한 대로 Pipe를 통과하여 여러개의 분류기나 스케일러 등을 모두 적용하는 것이라 생각하면 된다.

2. 실습

2.1 wine data load

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd



red_wine = pd.read_csv(red_url, sep = ';')
white_wine = pd.read_csv(white_url, sep = ';')

red_wine['color'] = 1
white_wine['color'] = 0

wine = pd.concat([red_wine, white_wine])
1
2
X = wine.drop(['color'], axis = 1)
y = wine['color']

1.2 파이프라인 생성 (pipeline)

1
2
3
4
5
6
7
8
from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler

estimator = [('scaler', StandardScaler()),
             ('clf', DecisionTreeClassifier())]

pipe = Pipeline(estimator)
  • 실제로 의사결정나무에 스케일러를 적용한 모습이다.

1.3 생성된 파이프라인 확인해보기(Pipe.steps)

1
pipe.steps
1
[('scaler', StandardScaler()), ('clf', DecisionTreeClassifier())]
1
pipe.steps[0]
1
('scaler', StandardScaler())
1
pipe.steps[1]
1
('clf', DecisionTreeClassifier())
  • pipe.steps를 통해서 어떤 step으로 pipeline이 통과되는지 알수 있다

1.4 파라미터확인

1
pipe.get_params()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{'memory': None,
 'steps': [('scaler', StandardScaler()), ('clf', DecisionTreeClassifier())],
 'verbose': False,
 'scaler': StandardScaler(),
 'clf': DecisionTreeClassifier(),
 'scaler__copy': True,
 'scaler__with_mean': True,
 'scaler__with_std': True,
 'clf__ccp_alpha': 0.0,
 'clf__class_weight': None,
 'clf__criterion': 'gini',
 'clf__max_depth': None,
 'clf__max_features': None,
 'clf__max_leaf_nodes': None,
 'clf__min_impurity_decrease': 0.0,
 'clf__min_impurity_split': None,
 'clf__min_samples_leaf': 1,
 'clf__min_samples_split': 2,
 'clf__min_weight_fraction_leaf': 0.0,
 'clf__presort': 'deprecated',
 'clf__random_state': None,
 'clf__splitter': 'best'}
  • pipe.get_params()를 통해 설정한 파라미터를 볼수 있음

1.5 파라미터 셋팅 하기(set_params)

  • 스탭이름 “clf” + 언더바 두 개 “- -” + 속성 이름 으로
1
2
pipe.set_params(clf__max_depth = 2)
pipe.set_params(clf__random_state = 13)
1
2
Pipeline(steps=[('scaler', StandardScaler()),
                ('clf', DecisionTreeClassifier(max_depth=2, random_state=13))])

1.6 pipeline을 이용한 분류기 구성

1
2
3
4
5
6
7
8
from sklearn.model_selection import train_test_split

X_scaled = pipe['scaler'].fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.2, random_state=13, stratify=y)

pipe.fit(X_train, y_train)
1
2
Pipeline(steps=[('scaler', StandardScaler()),
                ('clf', DecisionTreeClassifier(max_depth=2, random_state=13))])
  • pipe 라인의 스케일러로 스케일링을 시킨 뒤 fit 하는 과정

1.7 성과

1
2
3
4
5
6
7
from sklearn.metrics import accuracy_score

y_pred_tr = pipe.predict(X_train)
y_pred_test = pipe.predict(X_test)

print('Train Acc : ', accuracy_score(y_train, y_pred_tr))
print('Test Acc : ', accuracy_score(y_test, y_pred_test))
1
2
Train Acc :  0.9657494708485664
Test Acc :  0.9576923076923077
This post is licensed under CC BY 4.0 by the author.