본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

25일차. AutoML & XAI & Pipeline

더보기

 

25일 차 회고.

 

내가 해야 할 일

1. ADsP 공부 - 2.22 시험

2. 데이터 분석 공부 - 데이터 분석 프로세스 정리

3. 블로그 정리 - 수정 및 추가(19, 20일 차)

4. 데이콘 참여 - 3.31 마감

 

 

 

 

1. AutoML

 

 

1-1. AutoML

 

AutoML은 기계 학습을 데이터에 적용하는 프로세스를 자동화한다. 데이터 세트가 있는 경우, AutoML을 실행하여 데이터 변환, 머신러닝 알고리즘, 하이퍼 파라미터에 대해 최상의 모델을 선택할 수 있다.

 

Machine Learning 과정

  • 데이터 전처리
    • 데이터 수집
    • 데이터 가공
    • 데이터 이해
    • 특징 추출
    • 결측값 및 누락값 처리
  • 모델 생성
    • 특징량 엔지니어링
    • 학습에 의한 모델 구축
    • 파라미터 튜닝 모델 평가
    • 모델 평가
  • 모델 활용
    • 시스템에 삽입 운용
    • 예측, 최적화 실행

 

Machine Learning 알고리즘

  • 지도학습(Supervised Learning)
    • 회귀(Regression)
    • 분류(Classification)
  • 비지도학습(Unsupervised Learning)
    • 차원 축소(Dimensionality Reduction) 
    • 클러스터링(Clustering)
  • 강화학습(Reinforcement Learning)

 

AutoML 작동 방식

  • 문제 정의
  • 데이터 수집
  • 데이터 전처리
  • 모델 학습
  • 모델평 

 

 

1-2. PyCaret

 

PyCaret 설치

!pip install --upgrade pandas==2.2.2 matplotlib==3.8.0
!pip install pycaret[full]

import pycaret

pycaret.__version__				# '3.3.2'

 

PyCaret Tutorial

# Load Dataset
from pycaret.datasets import get_data

dataset = get_data('credit')

train = dataset.sample(frac=0.95, random_state=786)
test = dataset.drop(train.index)

train.reset_index(inplace=True, drop=True)
test.reset_index(inplace=True, drop=True)
# Setup
from pycaret.classification import *

exp_clf = setup(data = train, target = 'default', session_id=123)	# session_id: seed 고정
# Compare Models
best_model = compare_models()

# Analyze Model - Confusion Matrix
plot_model(best_model, plot = 'confusion_matrix')

# Analyze Model - AUC
plot_model(best_model, plot = 'auc')

# Analyze Model - Feature Importance
plot_model(best_model, plot = 'feature')

# Analyze Model
evaluate_model(best_model)

 

 

 

 

2. XAI(Explainable Artificial Intelligence)

 

 

2-1. XAI

 

XAI는 인공지능의 행위와 도출한 결과를 사람이 이해할 수 있는 형태로 설명하는 방법론과 분야를 말한다. 이를 통해 인공지능의 불확실성을 해소하고 신뢰성을 높이는 역할을 한다.

 

 

2-2. SHAP vs. SAGE

 

 

SHAP

SHAP는 각 특성이 모델의 예측에 기여한 정도를 계산한다.

 

SAGE

SAGE는 각 특성이 모델 성능에 영향을 끼친 정도를 계산한다. 

 

 

2-3. 데이터 준비

 

# Load Dataset
import numpy as np
import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
cols = ["age", "sibsp", "parch", "fare"]
features = df[cols]
target = df["survived"]
# Data Encoding
from sklearn.preprocessing import OneHotEncoder

cols = ["pclass", "sex", "embarked"]

enc = OneHotEncoder(handle_unknown='ignore')
tmp = pd.DataFrame(
    enc.fit_transform(df[cols]).toarray(),
    columns = enc.get_feature_names_out()
)

features = pd.concat([features,tmp], axis=1)
# 
features.age = features.age.fillna(features.age.median())
# Data Scaling
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
features = pd.DataFrame(
    scaler.fit_transform(features),
    columns = features.columns
)
# Split Dataset
from sklearn.model_selection import KFold, cross_val_score
from sklearn.model_selection import train_test_split

random_state=42

X_tr, X_te, y_tr, y_te = train_test_split(
    features, target, test_size=0.20,
    random_state=random_state)

X_tr.shape, X_te.shape				# ((712, 13), (179, 13))

 

 

2-4 SAGE(Shapley Additive Global importancE)

 

# Learning
from lightgbm import LGBMClassifier, plot_importance

model = LGBMClassifier(random_state=random_state).fit(X_tr, y_tr)
# Evaluation
from sklearn.metrics import roc_auc_score

pred = model.predict_proba(X_te)[:,1]
roc_auc_score(y_te, pred)
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize = (15, 10))
plot_importance(model, ax=ax)			# 수치형 / 범주형 데이터 분리하여 판단
plt.show()

 

 

2-5. SHAP(SHapley Additive exPlanations)

 

!pip install shap
!pip install scikit-image

import shap
import skimage

explainer = shap.TreeExplainer(model)

shap_values = explainer.shap_values(X_te)	# shap_values: 각 특성의 중요도

 

force_plot

shap.initjs()
shap.force_plot(explainer.expected_value,shap_values[0,:],X_te.iloc[0,:])

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values, X_te)

 

summary_plot

  • 전체 데이터의 영향력을 간단하게 시각화하여 보여준다.
  • 색이 섞인 경우, 전처리가 필요하다.
shap.summary_plot(shap_values, X_te)		# 수치형 / 범주형 데이터 분리하여 판단

 

dependence_plot

  • 특정 변수에 대한 영향도를 파악한다.
shap.dependence_plot("age", shap_values, X_te, interaction_index="auto")

 

 

 

3. Pipeline

 

 

3-1. Load Dataset

 

!pip install --upgrade joblib==1.1.0
!pip install --upgrade scikit-learn==1.1.3
!pip install mglearn

import logging

logging.getLogger('matplotlib.font_manager').setLevel(logging.ERROR)

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

cancer = load_breast_cancer()

X_tr, X_te, y_tr, y_te = train_test_split(
    cancer.data, cancer.target, random_state=0
)

 

 

3-2. Without Pipeline

 

Scaling

scaler = MinMaxScaler().fit(X_tr)

X_tr_scaled = scaler.transform(X_tr)
X_te_scaled = scaler.transform(X_te)

 

SVC

svm = SVC()

svm.fit(X_tr_scaled, y_tr)

svm.score(X_te_scaled, y_te)			# 0.972027972027972

 

GridSearchCV

from sklearn.model_selection import GridSearchCV

param_grid = {
    'C': [0.001, 0.01, 0.1, 1, 10, 100],
    'gamma': [0.001, 0.01, 0.1, 1, 10, 100]
}

grid = GridSearchCV(SVC(), param_grid=param_grid, cv=5)

grid.fit(X_tr_scaled, y_tr)

grid.best_score_				# 0.9812311901504789
grid.best_params_				# {'C': 1, 'gamma': 1}
grid.score(X_te_scaled, y_te)			# 0.972027972027972

 

결과 분석

  • MinMaxScaler가 training dataset의 모든 데이터를 사용하였다.
import mglearn

mglearn.plots.plot_improper_processing()

 

 

3-3. With Pipeline

 

SVC with Scaling

from sklearn.pipeline import Pipeline

pipe = Pipeline([
    ('scaler', MinMaxScaler()),			# scaling model -> features 크기 조절
    ('svm', SVC())				# training model -> target 예측
])

pipe.fit(X_tr, y_tr)

pipe.score(X_te, y_te)				# 0.972027972027972

 

GridSearchCV

param_grid = {
    'svm__C': [0.001, 0.01, 0.1, 1, 10, 100],
    'svm__gamma': [0.001, 0.01, 0.1, 1, 10, 100]
}

grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)

grid.fit(X_tr, y_tr)

grid.best_score_				# 0.9812311901504789
grid.best_params_				# {'svm__C': 1, 'svm__gamma': 1}
grid.score(X_te, y_te)				# 0.972027972027972

 

결과 분석

mglearn.plots.plot_proper_processing()

 

 

3-4. Pipeline 심화

 

데이터 로드

import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

url = "http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data"
abalone = pd.read_csv(
    url,
    sep=",",
    names = ['sex', 'length', 'diameter', 'height',
             'whole_weight', 'shucked_weight', 'viscera_weight',
             'shell_weight', 'rings'],
    header = None)

abalone.head()

 

숫자형 변수 전처리 pipeline

num_features = ["length", "whole_weight"]
num_transformer = Pipeline(
    steps = [("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler())]
)

 

범주형 변수 전처리 pipeline

cat_features = ["sex"]
cat_transformer = OneHotEncoder(handle_unknown="ignore")

 

전처리 pipeline 합치기

preprocessor = ColumnTransformer(
    transformers = [
        ("num", num_transformer, num_features),
        ("cat", cat_transformer, cat_features)
    ]
)

 

전체 pipeline

pipe = Pipeline(
    steps = [("preporcessor", preprocessor), ("regressor", LinearRegression())]
)

pipe

 

데이터 분리

X = abalone[["length", "whole_weight", "sex"]]
y = abalone["rings"]

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)

 

학습

from sklearn import set_config
set_config(display='diagram')

pipe.fit(X_tr, y_tr)
from sklearn.metrics import mean_absolute_percentage_error

y_pred = pipe.predict(X_te)

mean_absolute_percentage_error(y_te, y_pred)		# 0.1853230655055772