PyCaret를 사용한 데이터 전처리 자동화
소개
전처리 자동화
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/
Reference
이 문제에 관하여(PyCaret를 사용한 데이터 전처리 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/okm_6880/items/c5a99b9165d31ae05d5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from pycaret.datasets import get_data
from pycaret.regression import *
dataset = get_data('boston')
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', #標準化の方法
)
X = get_config('X') #全ての説明変数
X
y = get_config('y') # 全ての目的変数
y
X_train = get_config('X_train') # 分割後の学習用説明変数
X_train.head()
y_train = get_config('y_train') # 分割後の学習用目的変数
y_train.head()
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
이후는 거의 사족이 되지만 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/
Reference
이 문제에 관하여(PyCaret를 사용한 데이터 전처리 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/okm_6880/items/c5a99b9165d31ae05d5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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/
Reference
이 문제에 관하여(PyCaret를 사용한 데이터 전처리 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/okm_6880/items/c5a99b9165d31ae05d5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(PyCaret를 사용한 데이터 전처리 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/okm_6880/items/c5a99b9165d31ae05d5f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)