суббота, 3 декабря 2022 г.

Машинное обучение с библиотеками PyCaret и TROT : регрессия, часть вторая

 Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой PyCaret и рассмотрим с сайта библиотеки учебник по регрессии (REG101) — уровень для начинающих. 

Из этого учебника мы должны узнать :

Получение данных: как импортировать данные из репозитория PyCaret
Настройка среды: как настроить эксперимент в PyCaret и приступить к построению регрессионных моделей
Создать модель: как создать модель, выполнить перекрестную проверку и оценить показатели регрессии.
Настроить модель: как автоматически настроить гиперпараметры регрессионной модели
Модель графика: как анализировать производительность модели с помощью различных графиков
Завершить модель: как завершить лучшую модель в конце эксперимента
Модель прогнозирования: как прогнозировать новые/невидимые данные
Сохранить/Загрузить модель: Как сохранить/загрузить модель для будущего использования

Обзор модуля регрессии в PyCaret

Модуль регрессии PyCaret (pycaret.regression) — это модуль машинного обучения с учителем, который используется для прогнозирования непрерывных значений/результатов с использованием различных методов и алгоритмов. 

Модуль регрессии PyCaret имеет более 25 алгоритмов и 10 графиков для анализа производительности моделей. 

Учебный набор данных

Будем использовать набор данных, основанный на тематическом исследовании под названием «Сара получает бриллиант». Этот случай был представлен на первом курсе курса анализа решений в Дарденской школе бизнеса (Университет Вирджинии). Основой для данных послужил случай, когда безнадежно романтичный студент MBA выбрал правильный бриллиант для своей будущей невесты Сары. Данные содержат 6000 записей для обучения. Ниже приведены краткие описания каждого столбца:

  • ID: уникальный идентификатор наблюдения (бриллиант)
  • Carat Weight: вес бриллианта в метрических каратах. Один карат равен 0,2 грамма, что примерно равно весу скрепки
  • Cut: одно из пяти значений, указывающих огранку бриллианта в следующем порядке желательности (Signature-Ideal, Ideal, Very Good, Good, Fair)
  • Color: одно из шести значений, указывающих цвет бриллианта в следующем порядке желательности (D, E, F — бесцветный, G, H, I — почти бесцветный).
  • Clarity: одно из семи значений, указывающих на чистоту бриллианта в следующем порядке желательности (F — безупречный, IF — внутренне безупречный, VVS1 или VVS2 — очень, очень незначительное содержание, или VS1 или VS2 — очень незначительное содержание, SI1 — незначительное содержание).
  • Polish: одно из четырех значений, указывающих полировку бриллианта (ID — идеальная, EX — отличная, VG — очень хорошая, G — хорошая)
  • Symmetry: одно из четырех значений, указывающих на симметрию бриллианта (ID — идеальная, EX — отличная, VG — очень хорошая, G — хорошая)
  • Report: одно из двух значений «AGSL» или «GIA», указывающих, какое агентство по оценке сообщило о качествах бриллиантов.
  • Price: сумма в долларах США, на которую оценивается бриллиант, это целевой столбец

Получение данных

Для загрузки данных используем репозиторий данных PyCaret с помощью функции get_data()

from pycaret.datasets import get_data
dataset = get_data('diamond')

Carat WeightCutColorClarityPolishSymmetryReportPrice
01.10IdealHSI1VGEXGIA5169
10.83IdealHVS1IDIDAGSL3470
20.85IdealHSI1EXEXGIA3183
30.91IdealESI1VGVGGIA4370
40.83IdealGSI1EXEXGIA3171


Размер данных

dataset.shape

(6000, 8)

Сделаем случайную выборку из 600 записей и исключим ее из исходного набора. Используем ее для завершающего тестирования модели. 

Оставляем для дальнейшей работы 90% записей

data = dataset.sample(frac=0.9, random_state=786)

Оставшуюся часть будем использовать для завершающего тестирования

data_unseen = dataset.drop(data.index)

Сбрасываем индексы у обоих частей

data.reset_index(drop=True, inplace=True)
data_unseen.reset_index(drop=True, inplace=True)

print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))

Data for Modeling: (5400, 8)
Unseen Data For Predictions: (600, 8)

Настройка среды в PyCaret

Функция setup() инициализирует среду в pycaret и создает конвейер преобразования
для подготовки данных для моделирования и развертывания. setup() необходимо
вызывать перед выполнением любой другой функции в pycaret. Он принимает два
обязательных параметра: dataframe pandas и имя целевого столбца. Все остальные
параметры являются необязательными и используются для настройки конвейера
предварительной обработки

При выполнении setup() алгоритм вывода PyCaret автоматически определяет типы
данных для всех функций на основе определенных свойств. Тип данных должен быть
выведен правильно, но это не всегда так. Чтобы учесть это, PyCaret отображает
таблицу, предполагаемые типы данных после выполнения setup().
Если все типы данных идентифицированы правильно, можно нажать Enter,
чтобы продолжить, или выйти, чтобы завершить эксперимент. Обеспечение
правильности типов данных имеет фундаментальное значение в PyCaret, поскольку
он автоматически выполняет несколько задач предварительной обработки, которые
необходимы для любого эксперимента по машинному обучению. Эти задачи выполняются по-разному для каждого типа данных, поэтому очень важно правильно их настроить.

from pycaret.regression import *
exp_reg101 = setup(data = data, target = 'Price', transform_target = True,
fold_shuffle=True,session_id=123) 

Как и в первом примере в конце выскакивает ошибка : AttributeError: 'Simple_Imputer' object has no attribute 'fill_value_categorical'.

В stackoverflow.com советуют принудительно переустановить версию scikit-learn 0.23.2,

но я этого делать не стал (у меня стоит scikit-learn: 1.1.3) и продолжил работать, получая тот же самый результат, что и в примере. Из чего можно сделать вывод, что эта ошибка не фатальна.


Обратите внимание, как автоматически обрабатываются некоторые задачи, которые 

необходимы для выполнения моделирования, такие как вменение отсутствующих

значений , категориальное кодирование и т. д. Большинство параметры в setup() являются необязательными и используются для настройки конвейера предварительной обработки. Рассмотрим некоторые из них :


  • session_id : Псевдослучайное число, распространяемое как начальное значение во

    всех функциях для последующего воспроизведения. Если session_id не передан,

    автоматически генерируется случайное число, которое распространяется на все

    функции. Для идентификатора session_id установлено значени123


  • Original Data : отображает исходную форму набора данных. В этом эксперименте (5400, 8) означает 5400 образцов и 8 признаков, включая целевой столбец.

  • Missing Values : если в исходных данных отсутствуют значения, это будет отображаться как True. Для этого эксперимента в наборе данных нет пропущенных значений.

  • Numeric Features : количество признаков, предполагаемых числовыми. В этом наборе данных 1 из 8 функций выводится как числовые.

  • Categorical Features :  Количество признаков, которые считаются категориальными. В этом наборе данных 6 из 8 признаков считаются категориальными.

  • Transformed Train Set : отображает форму преобразованного тренировочного набора. Обратите внимание, что исходная форма (5400, 8) преобразуется в (3779, 28) для обучающего нобора. Количество признаков увеличилось с 8 до 28     за счет категориального кодирования

  • Transformed Test Set : Отображает форму преобразованного набора тестового набора. В нем 1621 строк. Это разделение основано на значении по умолчанию 70/30, которое можно изменить с помощью параметра train_size в настройках. 


Сравнение всех моделей


Сравнение всех моделей для оценки производительности является рекомендуемой отправной точкой для моделирования после завершения настройки (если вы точно не знаете, какая модель вам нужна, что часто бывает не так). Эта функция обучает все модели в библиотеке моделей и оценивает их, используя k-кратную перекрестную проверку для оценки метрик. На выходе выводится сетка оценок, которая показывает средние значения MAE, MSE, RMSE, R2, RMSLE и MAPE по каждой группе (по умолчанию 10) вместе со временем обучения.


best = compare_models(exclude = ['ransac'])

ModelMAEMSERMSER2RMSLEMAPETT (Sec)
catboostCatBoost Regressor571.30171372905.40661151.57330.98660.06320.04570.9030
lightgbmLight Gradient Boosting Machine625.72881660939.62601268.16070.98390.06780.04930.2330
xgboostExtreme Gradient Boosting662.76031797776.28751315.19260.98270.07240.05220.2970
etExtra Trees Regressor744.63802182852.12741445.35300.97910.08270.06080.6520
rfRandom Forest Regressor739.24242285684.18791470.02800.97830.08200.05930.5500
gbrGradient Boosting Regressor737.04602510168.02641534.99210.97560.07750.05700.1440
dtDecision Tree Regressor950.56493654221.08771880.56560.96440.10470.07650.0220
adaAdaBoost Regressor2006.250817107774.25594070.25150.83500.19250.15590.1310
knnK Neighbors Regressor3085.573334935867.17435892.66940.65320.36740.23810.0470
ompOrthogonal Matching Pursuit3368.640690494351.60009275.12390.09640.28450.22400.0130
llarLasso Least Angle Regression6502.2526113831824.000010640.1778-0.12620.71480.56190.0160
enElastic Net6502.2526113831824.000010640.1778-0.12620.71480.56190.0120
lassoLasso Regression6502.2526113831824.000010640.1778-0.12620.71480.56190.0120
larLeast Angle Regression2864.71631482201025.600020465.0470-11.00570.15630.12200.0170
ridgeRidge Regression4367.54402650042596.400033870.9313-20.68900.23730.18720.0140
brBayesian Ridge4543.48363040438843.200037038.8250-24.11010.23910.18920.0150
huberHuber Regressor4596.33722920088085.486637924.6917-24.87450.24130.18830.0740
lrLinear Regression5250.15206384525728.400050311.2001-54.91910.24380.19750.9330
parPassive Aggressive Regressor8800.309020735777545.993579948.2753-229.78840.35040.31490.0140

Две строки кода обучили и оценили более 20 моделей с использованием перекрестной проверки. Напечатанная выше сетка оценок выделяет самые эффективные показатели только для целей сравнения. Сетка по умолчанию сортируется с использованием R2 (от большего к меньшему), который можно изменить, передав параметр сортировки. Например, compare_models(sort = 'RMSLE') отсортирует сетку по RMSLE (от меньшего к большему, так как чем меньше, тем лучше). Если вы хотите изменить значение количеств групп со значения по умолчанию, равного 10, на другое значение, вы можете использовать этот параметр. Например, compare_models(fold = 5) будет сравнивать все модели с 5-кратной перекрестной проверкой. Сокращение количества групп улучшит время тренировки. По умолчанию compare_models возвращает наиболее эффективную модель на основе порядка сортировки по умолчанию, но может использоваться для возврата списка лучших N моделей с помощью параметра n_select.

Обратите внимание, как параметр exclude используется для блокировки определенных моделей (в данном случае RANSAC).

Создание модели

create_model —  эта функция обучает и оценивает модель с использованием перекрестной проверки, которую можно установить с помощью параметра fold. Выходные данные распечатывают сетку оценок, которая показывает MAE, MSE, RMSE, R2, RMSLE и MAPE по каждому фолду.

В оставшейся части этого руководства мы будем работать с приведенными ниже моделями в качестве моделей-кандидатов. Выборки приведены только для иллюстрации и не обязательно означают, что они являются наиболее эффективными или идеальными для этого типа данных.

  • AdaBoost Regressor ('ada')
  • Light Gradient Boosting Machine ('lightgbm')
  • Decision Tree ('dt')



В библиотеке моделей PyCaret доступно 25 регрессоров. Чтобы увидеть список всех регрессоров, либо проверьте строку документации, либо используйте функцию моделей, чтобы увидеть библиотеку.

models()

NameReferenceTurbo
ID
lrLinear Regressionsklearn.linear_model._base.LinearRegressionTrue
lassoLasso Regressionsklearn.linear_model._coordinate_descent.LassoTrue
ridgeRidge Regressionsklearn.linear_model._ridge.RidgeTrue
enElastic Netsklearn.linear_model._coordinate_descent.Elast...True
larLeast Angle Regressionsklearn.linear_model._least_angle.LarsTrue
llarLasso Least Angle Regressionsklearn.linear_model._least_angle.LassoLarsTrue
ompOrthogonal Matching Pursuitsklearn.linear_model._omp.OrthogonalMatchingPu...True
brBayesian Ridgesklearn.linear_model._bayes.BayesianRidgeTrue
ardAutomatic Relevance Determinationsklearn.linear_model._bayes.ARDRegressionFalse
parPassive Aggressive Regressorsklearn.linear_model._passive_aggressive.Passi...True
ransacRandom Sample Consensussklearn.linear_model._ransac.RANSACRegressorFalse
trTheilSen Regressorsklearn.linear_model._theil_sen.TheilSenRegressorFalse
huberHuber Regressorsklearn.linear_model._huber.HuberRegressorTrue
krKernel Ridgesklearn.kernel_ridge.KernelRidgeFalse
svmSupport Vector Regressionsklearn.svm._classes.SVRFalse
knnK Neighbors Regressorsklearn.neighbors._regression.KNeighborsRegressorTrue
dtDecision Tree Regressorsklearn.tree._classes.DecisionTreeRegressorTrue
rfRandom Forest Regressorsklearn.ensemble._forest.RandomForestRegressorTrue
etExtra Trees Regressorsklearn.ensemble._forest.ExtraTreesRegressorTrue
adaAdaBoost Regressorsklearn.ensemble._weight_boosting.AdaBoostRegr...True
gbrGradient Boosting Regressorsklearn.ensemble._gb.GradientBoostingRegressorTrue
mlpMLP Regressorpycaret.internal.tunable.TunableMLPRegressorFalse
xgboostExtreme Gradient Boostingxgboost.sklearn.XGBRegressorTrue
lightgbmLight Gradient Boosting Machinelightgbm.sklearn.LGBMRegressorTrue
catboostCatBoost Regressorcatboost.core.CatBoostRegressorTrue





AdaBoostRegressor

ada = create_model('ada')

MAEMSERMSER2RMSLEMAPE
01721.86689968037.85893157.22000.88950.18140.1479
11895.039412552908.69643543.00840.86030.19600.1659
21674.075410772706.07943282.18010.88780.17690.1487
31802.830014278806.94373778.73090.83730.17830.1482
41995.453717237485.22014151.80510.83540.19830.1547
52065.933919740769.25524443.05850.81640.19540.1592
62134.644716024867.93804003.10730.83630.19340.1600
72009.749115540511.20093942.14550.82300.19300.1527
82546.320334335227.12675859.62690.75110.21080.1651
92216.594220626422.23934541.63210.81240.20190.1563
Mean2006.250817107774.25594070.25150.83500.19250.1559
SD245.16496630258.5482735.40960.03800.01020.0063

Light Gradient Boosting Machine ('lightgbm')

lightgbm = create_model('lightgbm')

MAEMSERMSER2RMSLEMAPE
Fold      
0625.18131051762.95781025.55500.98850.07150.0526
1797.61855638866.17712374.62970.95680.07270.0537
2829.45863328375.43901824.38360.96950.08600.0619
3720.39231697211.38161302.77070.98130.07140.0554
4645.68001799949.11961341.62180.97750.07450.0534
5830.71766423604.01842534.48300.94520.08100.0567
6799.91363353992.26361831.39080.96850.07930.0585
7714.36071930222.64581389.32450.97560.07320.0556
8784.76482211933.15461487.25690.97830.07660.0582
9778.35903127561.35711768.49130.97020.08720.0609
Mean752.64463056347.85151687.99070.97110.07730.0567
Std69.38291661349.5128455.01120.01190.00550.0030

Decision Tree Regressor

dt = create_model('dt')

MAEMSERMSER2RMSLEMAPE
Fold      
0859.19072456840.05991567.43100.97300.10160.0727
11122.94099852564.20473138.87950.92450.11020.0758
2911.34522803662.68851674.41410.97430.09880.0729
31002.55753926739.37261981.60020.95670.10490.0772
41167.81549751516.19093122.74180.87840.12260.0876
51047.77787833770.70372798.88740.93310.11280.0791
61010.08163989282.48021997.31880.96250.11060.0803
7846.80852182534.90071477.34050.97240.09330.0709
81001.84514904945.08212214.71110.95180.10530.0734
91060.87425354347.69562313.94630.94900.12300.0847
Mean1003.12375305620.33792228.72710.94760.10830.0775
Std100.21652734194.7557581.71810.02800.00910.0052


Средняя оценка всех моделей совпадает с оценкой, напечатанной в compare_models(). Это связано с тем, что метрики, напечатанные в таблице результатов compare_models(), представляют собой средние баллы по всем фолдам CV. Как и в случае с
compare_models(), если вы хотите изменить значение параметра fold со значения
по умолчанию, равного 10, на другое значение, вы можете использовать параметр fold. Например: create_model('dt', fold = 5) для создания дерева решений с использованием
5-кратной перекрестной проверки.

Настройка модели

Когда модель создается с помощью функции create_model, она использует

гиперпараметры по умолчанию для обучения модели. Для настройки гиперпараметров

используется функция tune_model. Эта функция автоматически настраивает

гиперпараметры модели с помощью случайного поиска по сетке в предварительно

определенном пространстве поиска. Выходные данные распечатывают сетку оценок,

которая показывает MAE, MSE, RMSE, R2, RMSLE и MAPE . Чтобы использовать 

пользовательскую сетку поиска, можно передать параметр custom_grid в функцию

tune_model 


AdaBoostRegressor

tuned_ada = tune_model(ada)

MAEMSERMSER2RMSLEMAPE
01776.383510798641.68903286.12870.88030.18220.1508
11766.539611466276.85693386.18910.87240.18580.1534
21645.137711105558.65823332.50040.88440.17390.1438
31728.384914183257.47413766.06660.83840.17550.1409
41906.497116927411.64234114.29360.83840.18930.1460
52075.879521904604.49464680.23550.79630.19340.1539
62058.541516416996.82144051.78930.83230.19120.1546
71915.638515057950.01053880.45740.82850.18830.1455
82498.572433908077.65525823.06430.75420.20890.1598
92141.635821618413.39664649.56060.80340.19690.1486
Mean1951.321017338718.86994097.02850.83290.18850.1497
SD239.62336678284.2607743.69080.03870.00970.0055

print(tuned_ada)

AdaBoostRegressor(base_estimator=None, learning_rate=0.05, loss='linear',
                  n_estimators=90, random_state=123)

Light Gradient Boosting Machine

import numpy as np
lgbm_params = {'num_leaves': np.arange(10,200,10),
                        'max_depth': [int(x) for x in np.linspace(10, 110, num = 11)],
                        'learning_rate': np.arange(0.1,1,0.1)
                        }

tuned_lightgbm = tune_model(lightgbm, custom_grid = lgbm_params)

MAEMSERMSER2RMSLEMAPE
Fold      
0649.25411131046.48351063.50670.98760.07210.0544
1785.81585518411.78802349.13000.95770.07300.0522
2808.09773024520.40581739.11480.97230.08360.0597
3749.78811774260.27751332.01360.98040.07240.0556
4694.03511974576.41741405.19620.97540.08380.0585
5841.64626725524.06542593.36150.94260.08240.0582
6796.02403324498.62081823.32080.96880.07740.0564
7713.10061872493.11361368.39070.97630.07150.0551
8775.97602274682.34241508.20500.97770.07660.0579
9768.34513247098.54451801.97070.96910.08850.0594
Mean758.20833086711.20591698.42100.97080.07810.0567
Std54.91471678033.7774449.53010.01200.00580.0023

print(tuned_lightgbm)

LGBMRegressor(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
              importance_type='split', learning_rate=0.1, max_depth=60,
              min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
              n_estimators=100, n_jobs=-1, num_leaves=120, objective=None,
              random_state=123, reg_alpha=0.0, reg_lambda=0.0, silent='warn',
              subsample=1.0, subsample_for_bin=200000, subsample_freq=0)




Decision Tree Regressor

tuned_dt = tune_model(dt)



MAEMSERMSER2RMSLEMAPE
Fold      
01000.71222895159.13091701.51670.96820.10760.0828
11080.28416686388.04162585.80510.94880.10530.0814
21002.31633275429.63291809.81480.97000.10510.0812
31080.78504037154.59852009.26720.95550.11720.0870
41101.63337889520.53912808.82900.90160.11890.0842
51275.590111021312.19703319.83620.90590.12500.0895
61068.65344463866.30292112.78640.95810.10760.0809
7975.93643271028.51751808.59850.95860.10990.0807
81101.92074441966.36162107.59730.95640.11140.0873
91065.16625192339.27482278.67050.95060.12240.0873
Mean1075.29975317416.45972254.27220.94740.11300.0842
Std79.04632416581.2427485.46210.02270.00690.0031

По умолчанию tune_model оптимизирует R2, но это можно изменить с помощью

параметра оптимизации. Например: tune_model(dt, optimise = 'MAE') будет искать

гиперпараметры регрессора дерева решений, которые приводят к наименьшему MAE вместо самого высокого R2. В этом примере для простоты используется метрика по

умолчанию R2 только для простоты. 

Метрики сами по себе — не единственные критерии, которые необходимо учитывать при окончательной доработке лучшей модели. Другие факторы, которые следует учитывать, включают время обучения, стандартное отклонение k-fold и т. д. А пока давайте              перейдем к рассмотрению Tuned Light Gradient Boosting Machine, сохраненной в             переменной tuningd_lightgbm, как нашей лучшей модели для оставшейся части этого    руководства.


Графики модели

Перед завершением модели можно использовать функцию plot_model() для анализа

производительности по различным аспектам, таким как график остатков, ошибка

прогноза, важность функции и т. д. Эта функция берет обученный объект модели и

возвращает график на основе обучающей и тестовой выборок.

Доступно более 10 графиков, список доступных графиков см. в строке

 документации plot_model().



График остатков

plot_model(tuned_lightgbm,save=True)
'Residuals.png'


График ошибки прогноза

plot_model(tuned_lightgbm, plot = 'error',save=True)
'Prediction Error.png'


График важности функции

plot_model(tuned_lightgbm, plot='feature',save=True)
'Feature Importance.png'



Предсказание модели


Перед окончательной доработкой модели рекомендуется выполнить последнюю
проверку, предсказав тестовый набор и просмотрев метрики оценки. Если посмотреть
на информацию, выданную при запуске setup(), то станет ясно  что тестовая выборка
составляет 30% (1621 значений) данных. Все показатели оценки, которые мы видели 
выше, являются результатами перекрестной проверки, основанными только на
обучающем наборе (70%). Теперь, используя нашу окончательную обученную модель,
хранящуюся в переменной tuningd_lightgbm, мы сделаем предсказание по тестовой
выборке  и оценим показатели, чтобы увидеть, существенно ли они отличаются от
результатов CV.

predict_model(tuned_lightgbm)

ModelMAEMSERMSER2RMSLEMAPE
0Light Gradient Boosting Machine781.55723816757.27611953.65230.96520.07870.0558

R2 в тестовом наборе составляет 0,9652 по сравнению с 0,9708, полученным

по результатам CV tuningd_lightgbm полученном выше. Это не существенная разница.

Если существует большая разница между результатами теста и CV, то это, как правило, указывает на переобучение, но также может быть связано с несколькими другими

факторами и требует дальнейшего изучения. В этом случае мы продолжим работу над

завершением модели и прогнозированием невидимых данных (те 10%, которые мы

выделили в начале и никогда не подвергали PyCaret).

(СОВЕТ: всегда полезно посмотреть на стандартное отклонение результатов CV при
 использовании create_model.)


Завершение модели для развертывания


Завершение модели является последним шагом в эксперименте. Обычный рабочий

процесс машинного обучения в PyCaret начинается с setup(), за которым следует

сравнение всех моделей с помощью compare_models() и составление списка нескольких моделей-кандидатов (на основе интересующей метрики) для выполнения нескольких

методов моделирования, таких как настройка гиперпараметров, сборка, наложение

и т. д. Этот рабочий процесс в конечном итоге приведет вас к наилучшей модели для

прогнозирования новых и неизвестных данных. Функция finalize_model() подгоняет

модель к полному набору данных, включая тестовую и обучающую выборки. Цель этой функции — обучить модель на полном наборе данных, прежде чем она будет развернута в рабочей среде.


final_lightgbm = finalize_model(tuned_lightgbm
print(final_lightgbm)


LGBMRegressor(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
              importance_type='split', learning_rate=0.1, max_depth=60,
              min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
              n_estimators=100, n_jobs=-1, num_leaves=120, objective=None,
              random_state=123, reg_alpha=0.0, reg_lambda=0.0, silent='warn',
              subsample=1.0, subsample_for_bin=200000, subsample_freq=0)


predict_model(final_lightgbm)


ModelMAEMSERMSER2RMSLEMAPE
0Light Gradient Boosting Machine432.2939851645.0650922.84620.99220.04490.0332



R2 в final_lightgbm увеличился до 0,9922 с 0,9652, хотя модель та же. Это связано с тем, что переменная final_lightgbm обучается на полном наборе данных.



Предсказание на отложенных данных


Функция predict_model() также используется для прогнозирования невидимого набора

данных. На этот раз мы передадим параметр data_unseen. data_unseen — это

переменная, созданная в начале руководства и содержащая 10 % (600 образцов) исходного набора данных, который никогда не подвергался воздействию PyCaret


unseen_predictions = predict_model(final_lightgbm, data=data_unseen)

unseen_predictions.head()



ModelMAEMSERMSER2RMSLEMAPE
0Light Gradient Boosting Machine707.90332268889.54391506.28340.97790.06960.0513


Carat WeightCutColorClarityPolishSymmetryReportPriceLabel
01.53IdealESI1IDIDAGSL1279112262.949782
11.50FairFSI1VGVGGIA1045010122.442382
21.01GoodESI1GGGIA51615032.520456
32.51Very GoodGVS2VGVGGIA3436134840.379469
41.01GoodISI1VGVGGIA42384142.695964

Столбец Label добавляется в набор data_unseen. Метка — это прогнозируемое значение с использованием модели final_lightgbm. Если вы хотите, чтобы прогнозы были
округлены, вы можете использовать параметр округления внутри predict_model(). Вы 
также можете проверить метрики по этому вопросу, поскольку у вас есть фактическая целевая колонка Price. Для этого мы будем использовать модуль pycaret.utils.

from pycaret.utils import check_metric
check_metric(unseen_predictions.Price, unseen_predictions.Label, 'R2')

0.9826

Сохранение модели

Мы завершили эксперимент, доработав модель tuningd_lightgbm, которая теперь
хранится в переменной final_lightgbm. Мы также использовали модель, хранящуюся в
final_lightgbm, для прогнозирования data_unseen. Это подводит нас к концу нашего
эксперимента, но остается задать один вопрос: что происходит, когда у вас появляется
больше новых данных для прогнозирования? Нужно ли заново проходить весь
эксперимент? Ответ — нет, встроенная функция PyCaret save_model() позволяет
сохранить модель вместе со всем конвейером преобразования для последующего
использования.

save_model(final_lightgbm,'Final LightGBM Model')

При попытке выполнить сохранение у меня опять выскочила ошибка, что и при
запуске setup() и сохранение не произошло. Для меня это сейчас не так важно, поэтому оставлю решение этого вопроса на потом.















Комментариев нет:

Отправить комментарий