scikit-learn 파이프라인 시각화 기능 사용 및 재사용 (pipeline visualization)

2020. 5. 15. 23:40분석 Python/Scikit Learn (싸이킷런)

scikit-learn이 0.23이 되면서 가장 와 닿은 것인 pipeline을 시각화해주는 것이었다.

이번 글에서는 파이프라인 시각화하는 것과 실제로 아직 저장하는 것을 제공하지 않지만 재사용할 수 있는 방법에 대해서 고민해봤다.

import pandas as pd
import numpy as np
import seaborn as sns

import sklearn
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.compose import make_column_transformer
from sklearn.utils._estimator_html_repr import *
from IPython.core.display import display, HTML

일단 set_config에서 display를 diagram으로 해야 한다.

sklearn.set_config(display="diagram")
sklearn.__version__

여기서는 diamonds 데이터를 통해서 파이프 라인을 만들어보자.

df_diamonds = sns.load_dataset('diamonds')
X = df_diamonds[['carat', 'depth','cut']]
y = df_diamonds['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 123)

make_columns transformer를 이용하면 변수별로 다양하게 적용이 가능하다.

ct = make_column_transformer(
    (StandardScaler(), ['carat', 'depth']),
    (OneHotEncoder(), ['cut']),
    remainder='passthrough'
)

그리고 이것과 로지스틱 회귀분석을 결합하면?!

pipe = make_pipeline(ct, LogisticRegression())
pipe.fit(X_train.head(1000), y_train.head(1000))

!!!!!

 

아주 깔끔하게 시각화해서 보여준다!!

 

이제 좀 더 이것에다가 복잡한 파이프라인을 적용한다면?

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, ['carat', 'depth']),
        ('cat', categorical_transformer, ["cut"])])
clf = Pipeline(steps=[('preprocessor', preprocessor),("logistic", LogisticRegression())])
clf.fit(X_train.head(1000), y_train.head(1000),)

각각의 어떤 변수를 사용하는지 알 수 있게 다음과 같이 시각화해줄 수 있다!!

 

근데 여기서 궁금한 점이 생겼다. 항상 fit을 해야 저 시각화된 그림을 얻을 수 있었다.

그래서 sklearn 코드를 열심히 뜯어보니 pipeline을 html 코드로 바꿔주는 것을 찾았다!

 

바로 sklearn.utils._estimator_html_repr 안에 있는 것을 사용하면 된다!

from sklearn.utils._estimator_html_repr import *
from IPython.core.display import display, HTML

 

estimator_html_repr(clf)

위에 estimator_html_repr를 사용하면 html을 만들어준 것을 알 수 있다. 이제 이것을 저장한다면 재사용할 수 있으니 저장해보자.

txt로 저장

html = estimator_html_repr(clf)
with open("pipeline.txt","w") as w :
    w.write(html)

저장하고 합치기

with open("pipeline.txt","r") as r :
    pipeline_html = r.readlines()
pipeline_html = "".join(pipeline_html)

2가지 함수를 이용해서 html로 시각화하기

from IPython.core.display import display, HTML
display(HTML(pipeline_html))

이런 식으로 충분히 재사용할 수 있다는 것을 발견했다!!! 

왜 저장하는 것을 만들어주지 않았을까?.. ㄷㄷㄷ

암튼 재사용할 수 있는 여지를 확인했으니 만족!

728x90