Подбор этапов предобработки данных
Рассмотрим, как оптимизировать выбранную модель, подбирая не только ее гиперпараметры, но и разные стадии ее предобработки. Это можно осуществить все в тех же классах GridSearchCV и RandomizedSearchCV из библиотеки Scikit-learn. Фактически нам понадобится создать pipeline и научиться передавать его свойства в объект-переборщик. Сначала создадим демонстрационный датафрейм:
from sklearn.datasets import load_diabetes from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error import pandas as pd import numpy as np np.random.seed(0) df, y = load_diabetes(return_X_y=True, as_frame=True) df['age'] = pd.cut(df['age'], bins=5, labels=False) df['target'] = y df = df.sample(frac=1).reset_index(drop=True) display(df.head()) display(df.shape)
Разделим данные на тренировочную и валидационную выборки:
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(df.drop(columns='target').copy(),
df['target'], test_size=0.2)
y_tr.shape[0], y_val.shape[0]Теперь будем двигаться поэтапно, чтобы отслеживать прирост качества модели. Сначала создадим экземпляр класса ElasticNet, затем встроим его в пайплайн, после чего подберем оптимальные настройки последнего:
from sklearn.linear_model import ElasticNet
model = ElasticNet()
model.fit(X_tr, y_tr)
y_p = model.predict(X_val)
print(f'{mean_absolute_error(y_val, y_p):.2f}',
f'{mean_absolute_percentage_error(y_val, y_p):.3f}')Как можно заметить, для повышения качества модели следует провести масштабирование и кодировку переменных. Сделаем это с помощью пайплайна, как рассказывал ранее:
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, RobustScaler
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
from category_encoders import TargetEncoder, CountEncoder
ct = ColumnTransformer([('age_enc', OneHotEncoder(sparse=False, handle_unknown='ignore'), ['age'])],
remainder='passthrough')
model = Pipeline([('enc', ct), ('sc', RobustScaler()), ('reg', ElasticNet())])
model.fit(X_tr, y_tr)
y_p = model.predict(X_val)
print(f'{mean_absolute_error(y_val, y_p):.2f}',
f'{mean_absolute_percentage_error(y_val, y_p):.3f}')Качество возросло. А теперь попытаемся с помощью GridSearchCV оптимизировать одновременно и гиперпараметры ElasticNet, и подходящие этапы предобработки. Для этого нужно передать в переборщик словарь параметров, соблюдая некоторые правила. В частности, обращаться к свойствам входящих в pipeline классов посредством указания имени шага, затем двойного подчеркивания и имени свойства, ниже пример:
from sklearn.model_selection import GridSearchCV
params = {'reg__alpha':[0.01,0.1, 1, 10], 'reg__l1_ratio':np.linspace(0,1, 10),
'enc__age_enc':[TargetEncoder(), CountEncoder(),
OneHotEncoder(sparse=False, handle_unknown='ignore'),
OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)],
'sc':[StandardScaler(), RobustScaler()]}
gr = GridSearchCV(model, params, cv=5, n_jobs=-1, scoring='neg_mean_absolute_percentage_error')
gr.fit(X_tr, y_tr)
y_p = gr.predict(X_val)
print(f'{mean_absolute_error(y_val, y_p):.2f}',
f'{mean_absolute_percentage_error(y_val, y_p):.3f}')Теперь из свойств best_score_, best_params_, best_estimator_ и cv_results_ можно получить лучшую оценку на кросс-валидации, оптимальные параметры, оценщика и результаты кросс валидации для всех итераций:
- Создание пайплайнов предобработки данных
- Подбор гиперпараметров модели с GridSearchCV и RandomizedSearchCV
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: