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))
이런 식으로 충분히 재사용할 수 있다는 것을 발견했다!!!
왜 저장하는 것을 만들어주지 않았을까?.. ㄷㄷㄷ
암튼 재사용할 수 있는 여지를 확인했으니 만족!
'분석 Python > Scikit Learn (싸이킷런)' 카테고리의 다른 글
[TIP / Sklearn ] Custom Estimator (Ex : Combined Regressor) (0) | 2020.10.27 |
---|---|
[sklearn] TSNE, MDS, SpectralEmbedding Estimator를 Pipeline 에 적용 시키는 방법 (0) | 2020.08.23 |
scikit-learn 0.23 이 되면서 변한 점 (0) | 2020.05.15 |
Scikit-learn Custom Pipeline Save & Reload (저장 및 재사용) (0) | 2020.02.28 |
sklearn을 활용한 Custom Outlier Transformer 만들어보기 (0) | 2020.02.24 |