машинное обучение
June 17, 2022

Выборка оптимального алгоритма со Scikit-learn

Рассмотрим, как производить выборку алгоритмов машинного обучения с библиотекой Scikit-learn. Для работы используем поставляемый с библиотекой датасет:

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]

Создадим пайплайн машинного обучения и выведем метрики качества:

from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor

ct = make_column_transformer((OneHotEncoder(sparse=False, handle_unknown='ignore'), ['age']), 
                              (StandardScaler(), X_tr.drop(columns=['age']).columns),
                              remainder='passthrough')

model = Pipeline([('prep', ct), ('reg', DecisionTreeRegressor())])


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}')

Теперь с помощью RandomizedSearchCV или GridSearchCV можно попытаться найти оптимальный алгоритм и параметры к нему. Для этого разные алгоритмы следует заключать в отдельные словари списка (если перебираемые свойства отличаются), синтаксис обращения к свойствам - посредством указания имени шага, затем двойного подчеркивания и имени свойства (писал ранее):

from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor


params = [{'reg':[DecisionTreeRegressor()], 'reg__max_depth':[7,10,14]}, 
          {'reg':[RandomForestRegressor(), ExtraTreesRegressor()], 
           'reg__max_depth':[7,10,14], 'reg__n_estimators':np.arange(10,100,10), 
           'reg__min_samples_split':[2,3,4]},
         ]

gr_s = RandomizedSearchCV(model, params, n_iter=20, n_jobs=-1, 
                          scoring='neg_mean_absolute_percentage_error')
gr_s.fit(X_tr, y_tr)

Выведем полученные параметры (подробнее здесь) :

Полезные ссылки:

  1. Создание пайплайнов предобработки данных
  2. Подбор этапов предобработки данных
  3. Подбор гиперпараметров модели с GridSearchCV и RandomizedSearchCV

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Яндекс Дзен

Telegram