PyCaret를 사용한 데이터 전처리 자동화

소개


  • PyCaret는 약간의 코딩으로 기계 학습을 할 수 있는 라이브러리입니다.
  • 매우 편리한 라이브러리이지만, TensorFlow나 PyTorch와 같은 신경망 모델에는 대응하고 있지 않습니다(scikit-learn의 MLP는 구현 가능).
  • 본 논문에서는 Pycaret을 전처리 도구로 사용하고 신경망 모델(TabNet)을 구축하는 방법을 소개한다.

  • 전처리 자동화



    PyCaret의 기본 사용법은 생략합니다.
    처음 사용하는 분은 아래의 기사를 참조하십시오.



    ※환경은 google colaboratory에서 실행하고 있습니다.

    이번에는 보스턴 부동산 가격 데이터를 사용합니다.
       from pycaret.datasets import get_data
       from pycaret.regression import *
       dataset = get_data('boston')       
    

    setup 함수를 사용하여 전처리를 수행합니다.
       exp = setup(dataset,
                   session_id=123, #ランダムシードの値
                   train_size = 0.7, #学習データとテストデータを7:3に分割
                   target = 'medv', #目的関数
                   categorical_features = ['chas'], #カテゴリー変数
                   numeric_features = ['rad'], #数値変数
                   normalize = True, #標準化の有無
                   normalize_method = 'zscore', #標準化の方法
                   )
    

    전처리의 세부 사항은 아래 그림입니다.



    전처리된 데이터를 확인합니다. get_config 로 모든 설명 변수의 데이터를 가져옵니다.
       X = get_config('X') #全ての説明変数
       X
    



    numeric_features(chas 이외)는 표준화되고,
    categorical_features인 chas는 더미 변수가 되었습니다(원래부터 더미 변수였지만).

    그런 다음 목적 변수 medv를 확인합니다.
       y = get_config('y') # 全ての目的変数
       y
    



    여기에서는 사용하지 않지만, 분할된 학습 데이터, 테스트 데이터의 확인도 가능합니다. 위의 "Transformed Train Set", "Transformed Test Set"에 해당합니다.
       X_train = get_config('X_train') # 分割後の学習用説明変数
       X_train.head()
    

    목적 변수는 다음과 같습니다.
       y_train = get_config('y_train') # 分割後の学習用目的変数
       y_train.head()
    

    유사하게 분할된 테스트 데이터 "Transformed Test Set"는 다음과 같습니다.
       X_test = get_config('X_test') # 分割後のテスト用説明変数
       X_test.head()
    

    목적 변수는 다음과 같습니다.
       y_test = get_config('y_test') # 分割後のテスト用目的変数
       y_test.head()
    

    사전 처리된 학습 데이터와 테스트 데이터를 결합하여 전처리 후 데이터 세트를 작성합니다.
       df=pd.merge(X, y,left_index=True,right_index=True)
       df
    



    실은 본고에서 중요한 것은 여기까지입니다.
    전처리된 데이터에 한층 더 수고를 더하는 것도 좋고, 좋아하는 모델에 짜넣는 것도 좋습니다.
    PyCaret를 데이터 전처리 도구로 사용해 보면 어떻게 될까라는 제안이었습니다.

    3. TabNet 구축



    이후는 거의 사족이 되지만 TabNet에서의 학습입니다.
       #ライブラリ
       import torch
       from torch import nn
       import torch.optim as optim
       import torch.nn.functional as F
       from torch.optim.lr_scheduler import ReduceLROnPlateau
       from sklearn.model_selection import StratifiedKFold
       from pytorch_tabnet.tab_model import TabNetRegressor
       import os
       import random
       import pandas as pd
       import numpy as np
       import seaborn as sns
       import matplotlib.pyplot as plt
       from sklearn.model_selection import train_test_split
       from sklearn.metrics import r2_score
       from sklearn.metrics import mean_absolute_error
       from sklearn.metrics import mean_squared_error
    
       %matplotlib inline
    
       def seed_everything(seed_value):
           random.seed(seed_value)
           np.random.seed(seed_value)
           torch.manual_seed(seed_value)
           os.environ["PYTHONHASHSEED"] = str(seed_value)
    
           if torch.cuda.is_available():
               torch.cuda.manual_seed(seed_value)
               torch.cuda.manual_seed_all(seed_value)
               torch.backends.cudnn.deterministic = True
               torch.backends.cudnn.benchmark = False
    
       seed_everything(10)
    
       # ランダムシード値
       RANDOM_STATE = 10
    
       # 学習データと評価データの割合
       TEST_SIZE = 0.3
    
       # 学習データと評価データを作成
       x_train, x_test, y_train, y_test = train_test_split(
           df.iloc[:, 0 : df.shape[1] - 1],
           df.iloc[:, df.shape[1] - 1],
           test_size=TEST_SIZE,
           random_state=RANDOM_STATE,
       )
    
       # trainのデータセットの3割をモデル学習時のバリデーションデータとして利用する
       x_train, x_valid, y_train, y_valid = train_test_split(
           x_train, y_train, test_size=TEST_SIZE, random_state=RANDOM_STATE
       )
       # モデルのパラメータ
       tabnet_params = dict(
           n_d=8,
           n_a=8,
           n_steps=8,
           gamma=0.2,
           seed=10,
           lambda_sparse=1e-3,
           optimizer_fn=torch.optim.Adam,
           optimizer_params=dict(lr=2e-2, weight_decay=1e-5),
           mask_type="entmax",
           scheduler_params=dict(
               max_lr=0.01,
               steps_per_epoch=int(x_train.shape[0] / 256),
               epochs=200,
               is_batch_level=True,
           ),
           verbose=5,
       )
    
       # model
       model = TabNetRegressor(**tabnet_params)
    
       model.fit(
           X_train=x_train.values,
           y_train=y_train.values.reshape(-1, 1),
           eval_set=[(x_valid.values, y_valid.values.reshape(-1, 1))],
           eval_metric=["rmse"],
           max_epochs=200,
           patience=30,
           batch_size=256,
           virtual_batch_size=128,
           num_workers=2,
           drop_last=False,
           loss_fn=torch.nn.functional.l1_loss,
       )
    

    특징량의 중요도를 표시합니다.
       # Feature Importance
    
       feat_imp = pd.DataFrame(model.feature_importances_, index=X.columns)
       feature_importance = feat_imp.copy()
    
       feature_importance["imp_mean"] = feature_importance.mean(axis=1)
       feature_importance = feature_importance.sort_values("imp_mean")
       plt.figure(figsize=(10,20))
       plt.tick_params(labelsize=15)
       plt.barh(feature_importance.index.values, feature_importance["imp_mean"])
       plt.title("feature_importance", fontsize=18)
    



    각 피쳐의 마스크를 표시합니다.
       # Mask(Local interpretability)
       explain_matrix, masks = model.explain(x_test.values)
    
       fig, axs = plt.subplots(1, 3, figsize=(10, 7))
    
       for i in range(3):
           axs[i].imshow(masks[i][:25])
           axs[i].set_title(f"mask {i}")
    



    평가 지표를 계산합니다. 별로 결과는 좋지 않습니다.
       # TabNet推論
       y_pred = model.predict(x_test.values)
    
       # 評価
       def calculate_scores(true, pred):
           scores = {}
           scores = pd.DataFrame(
               {
                   "R2": r2_score(true, pred),
                   "MAE": mean_absolute_error(true, pred),
                   "MSE": mean_squared_error(true, pred),
                   "RMSE": np.sqrt(mean_squared_error(true, pred)),
               },
               index=["scores"],
           )
           return scores
    
    
       scores = calculate_scores(y_test, y_pred)
       print(scores)
    



    테스트 데이터로 추론하는 방법



    테스트 데이터를 사용하여 추론을 하는 경우는 다음과 같이 합니다.
    여기서 중요한 것은 setup 함수의 설정을 학습 데이터와 정렬하는 것입니다.
       test = pd.read_csv("test.csv")
       exp2 = setup(test,
                   session_id=123, #ランダムシードの値
                   #train_sizeは無くてOK
                   target = 'medv', #目的関数
                   categorical_features = ['chas'], #カテゴリー変数
                   numeric_features = ['rad'], #数値変数
                   normalize = True, #標準化の有無
                   normalize_method = 'zscore', #標準化の方法
                   )
    

    테스트 데이터의 전처리가 끝나면 모든 설명 변수만을 꺼내 추론으로 돌립니다.
       # 全説明変数
       X = get_config('X')
    
       # TabNet推論
       y_pred = model.predict(X.values)
       y_pred=pd.DataFrame(y_pred)
    

    사이고에게



    어땠어?
    이하의 기사에서는 「PyCaret는 scikit-learn 모델 이외도 대응할 수 있어!」라고 있습니다만,
    신경망에의 적응은 할 수 없을 것 같기 때문에 이번 수법은 유효하다고 생각합니다.



    참고



    htps : // m / m s t1977 / ms / 5에서 6605806f8918d2283
    htps : // py t. 오 rg/p레 p 로세신 g/

    좋은 웹페이지 즐겨찾기