Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой PyCaret и рассмотрим с сайта библиотеки учебник по регрессии (REG101) — уровень для начинающих.
Из этого учебника мы должны узнать :
Настройка среды: как настроить эксперимент в PyCaret и приступить к построению регрессионных моделей
Создать модель: как создать модель, выполнить перекрестную проверку и оценить показатели регрессии.
Настроить модель: как автоматически настроить гиперпараметры регрессионной модели
Модель графика: как анализировать производительность модели с помощью различных графиков
Завершить модель: как завершить лучшую модель в конце эксперимента
Модель прогнозирования: как прогнозировать новые/невидимые данные
Сохранить/Загрузить модель: Как сохранить/загрузить модель для будущего использования
- 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: сумма в долларах США, на которую оценивается бриллиант, это целевой столбец
| Carat Weight | Cut | Color | Clarity | Polish | Symmetry | Report | Price | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1.10 | Ideal | H | SI1 | VG | EX | GIA | 5169 |
| 1 | 0.83 | Ideal | H | VS1 | ID | ID | AGSL | 3470 |
| 2 | 0.85 | Ideal | H | SI1 | EX | EX | GIA | 3183 |
| 3 | 0.91 | Ideal | E | SI1 | VG | VG | GIA | 4370 |
| 4 | 0.83 | Ideal | G | SI1 | EX | EX | GIA | 3171 |
(6000, 8)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 в настройках.
| Model | MAE | MSE | RMSE | R2 | RMSLE | MAPE | TT (Sec) | |
|---|---|---|---|---|---|---|---|---|
| catboost | CatBoost Regressor | 571.3017 | 1372905.4066 | 1151.5733 | 0.9866 | 0.0632 | 0.0457 | 0.9030 |
| lightgbm | Light Gradient Boosting Machine | 625.7288 | 1660939.6260 | 1268.1607 | 0.9839 | 0.0678 | 0.0493 | 0.2330 |
| xgboost | Extreme Gradient Boosting | 662.7603 | 1797776.2875 | 1315.1926 | 0.9827 | 0.0724 | 0.0522 | 0.2970 |
| et | Extra Trees Regressor | 744.6380 | 2182852.1274 | 1445.3530 | 0.9791 | 0.0827 | 0.0608 | 0.6520 |
| rf | Random Forest Regressor | 739.2424 | 2285684.1879 | 1470.0280 | 0.9783 | 0.0820 | 0.0593 | 0.5500 |
| gbr | Gradient Boosting Regressor | 737.0460 | 2510168.0264 | 1534.9921 | 0.9756 | 0.0775 | 0.0570 | 0.1440 |
| dt | Decision Tree Regressor | 950.5649 | 3654221.0877 | 1880.5656 | 0.9644 | 0.1047 | 0.0765 | 0.0220 |
| ada | AdaBoost Regressor | 2006.2508 | 17107774.2559 | 4070.2515 | 0.8350 | 0.1925 | 0.1559 | 0.1310 |
| knn | K Neighbors Regressor | 3085.5733 | 34935867.1743 | 5892.6694 | 0.6532 | 0.3674 | 0.2381 | 0.0470 |
| omp | Orthogonal Matching Pursuit | 3368.6406 | 90494351.6000 | 9275.1239 | 0.0964 | 0.2845 | 0.2240 | 0.0130 |
| llar | Lasso Least Angle Regression | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0160 |
| en | Elastic Net | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0120 |
| lasso | Lasso Regression | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0120 |
| lar | Least Angle Regression | 2864.7163 | 1482201025.6000 | 20465.0470 | -11.0057 | 0.1563 | 0.1220 | 0.0170 |
| ridge | Ridge Regression | 4367.5440 | 2650042596.4000 | 33870.9313 | -20.6890 | 0.2373 | 0.1872 | 0.0140 |
| br | Bayesian Ridge | 4543.4836 | 3040438843.2000 | 37038.8250 | -24.1101 | 0.2391 | 0.1892 | 0.0150 |
| huber | Huber Regressor | 4596.3372 | 2920088085.4866 | 37924.6917 | -24.8745 | 0.2413 | 0.1883 | 0.0740 |
| lr | Linear Regression | 5250.1520 | 6384525728.4000 | 50311.2001 | -54.9191 | 0.2438 | 0.1975 | 0.9330 |
| par | Passive Aggressive Regressor | 8800.3090 | 20735777545.9935 | 79948.2753 | -229.7884 | 0.3504 | 0.3149 | 0.0140 |
- AdaBoost Regressor ('ada')
- Light Gradient Boosting Machine ('lightgbm')
- Decision Tree ('dt')
| Name | Reference | Turbo | |
|---|---|---|---|
| ID | |||
| lr | Linear Regression | sklearn.linear_model._base.LinearRegression | True |
| lasso | Lasso Regression | sklearn.linear_model._coordinate_descent.Lasso | True |
| ridge | Ridge Regression | sklearn.linear_model._ridge.Ridge | True |
| en | Elastic Net | sklearn.linear_model._coordinate_descent.Elast... | True |
| lar | Least Angle Regression | sklearn.linear_model._least_angle.Lars | True |
| llar | Lasso Least Angle Regression | sklearn.linear_model._least_angle.LassoLars | True |
| omp | Orthogonal Matching Pursuit | sklearn.linear_model._omp.OrthogonalMatchingPu... | True |
| br | Bayesian Ridge | sklearn.linear_model._bayes.BayesianRidge | True |
| ard | Automatic Relevance Determination | sklearn.linear_model._bayes.ARDRegression | False |
| par | Passive Aggressive Regressor | sklearn.linear_model._passive_aggressive.Passi... | True |
| ransac | Random Sample Consensus | sklearn.linear_model._ransac.RANSACRegressor | False |
| tr | TheilSen Regressor | sklearn.linear_model._theil_sen.TheilSenRegressor | False |
| huber | Huber Regressor | sklearn.linear_model._huber.HuberRegressor | True |
| kr | Kernel Ridge | sklearn.kernel_ridge.KernelRidge | False |
| svm | Support Vector Regression | sklearn.svm._classes.SVR | False |
| knn | K Neighbors Regressor | sklearn.neighbors._regression.KNeighborsRegressor | True |
| dt | Decision Tree Regressor | sklearn.tree._classes.DecisionTreeRegressor | True |
| rf | Random Forest Regressor | sklearn.ensemble._forest.RandomForestRegressor | True |
| et | Extra Trees Regressor | sklearn.ensemble._forest.ExtraTreesRegressor | True |
| ada | AdaBoost Regressor | sklearn.ensemble._weight_boosting.AdaBoostRegr... | True |
| gbr | Gradient Boosting Regressor | sklearn.ensemble._gb.GradientBoostingRegressor | True |
| mlp | MLP Regressor | pycaret.internal.tunable.TunableMLPRegressor | False |
| xgboost | Extreme Gradient Boosting | xgboost.sklearn.XGBRegressor | True |
| lightgbm | Light Gradient Boosting Machine | lightgbm.sklearn.LGBMRegressor | True |
| catboost | CatBoost Regressor | catboost.core.CatBoostRegressor | True |
| MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|
| 0 | 1721.8668 | 9968037.8589 | 3157.2200 | 0.8895 | 0.1814 | 0.1479 |
| 1 | 1895.0394 | 12552908.6964 | 3543.0084 | 0.8603 | 0.1960 | 0.1659 |
| 2 | 1674.0754 | 10772706.0794 | 3282.1801 | 0.8878 | 0.1769 | 0.1487 |
| 3 | 1802.8300 | 14278806.9437 | 3778.7309 | 0.8373 | 0.1783 | 0.1482 |
| 4 | 1995.4537 | 17237485.2201 | 4151.8051 | 0.8354 | 0.1983 | 0.1547 |
| 5 | 2065.9339 | 19740769.2552 | 4443.0585 | 0.8164 | 0.1954 | 0.1592 |
| 6 | 2134.6447 | 16024867.9380 | 4003.1073 | 0.8363 | 0.1934 | 0.1600 |
| 7 | 2009.7491 | 15540511.2009 | 3942.1455 | 0.8230 | 0.1930 | 0.1527 |
| 8 | 2546.3203 | 34335227.1267 | 5859.6269 | 0.7511 | 0.2108 | 0.1651 |
| 9 | 2216.5942 | 20626422.2393 | 4541.6321 | 0.8124 | 0.2019 | 0.1563 |
| Mean | 2006.2508 | 17107774.2559 | 4070.2515 | 0.8350 | 0.1925 | 0.1559 |
| SD | 245.1649 | 6630258.5482 | 735.4096 | 0.0380 | 0.0102 | 0.0063 |
| MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|
| Fold | ||||||
| 0 | 625.1813 | 1051762.9578 | 1025.5550 | 0.9885 | 0.0715 | 0.0526 |
| 1 | 797.6185 | 5638866.1771 | 2374.6297 | 0.9568 | 0.0727 | 0.0537 |
| 2 | 829.4586 | 3328375.4390 | 1824.3836 | 0.9695 | 0.0860 | 0.0619 |
| 3 | 720.3923 | 1697211.3816 | 1302.7707 | 0.9813 | 0.0714 | 0.0554 |
| 4 | 645.6800 | 1799949.1196 | 1341.6218 | 0.9775 | 0.0745 | 0.0534 |
| 5 | 830.7176 | 6423604.0184 | 2534.4830 | 0.9452 | 0.0810 | 0.0567 |
| 6 | 799.9136 | 3353992.2636 | 1831.3908 | 0.9685 | 0.0793 | 0.0585 |
| 7 | 714.3607 | 1930222.6458 | 1389.3245 | 0.9756 | 0.0732 | 0.0556 |
| 8 | 784.7648 | 2211933.1546 | 1487.2569 | 0.9783 | 0.0766 | 0.0582 |
| 9 | 778.3590 | 3127561.3571 | 1768.4913 | 0.9702 | 0.0872 | 0.0609 |
| Mean | 752.6446 | 3056347.8515 | 1687.9907 | 0.9711 | 0.0773 | 0.0567 |
| Std | 69.3829 | 1661349.5128 | 455.0112 | 0.0119 | 0.0055 | 0.0030 |
MAE MSE RMSE R2 RMSLE MAPE Fold 0 859.1907 2456840.0599 1567.4310 0.9730 0.1016 0.0727 1 1122.9409 9852564.2047 3138.8795 0.9245 0.1102 0.0758 2 911.3452 2803662.6885 1674.4141 0.9743 0.0988 0.0729 3 1002.5575 3926739.3726 1981.6002 0.9567 0.1049 0.0772 4 1167.8154 9751516.1909 3122.7418 0.8784 0.1226 0.0876 5 1047.7778 7833770.7037 2798.8874 0.9331 0.1128 0.0791 6 1010.0816 3989282.4802 1997.3188 0.9625 0.1106 0.0803 7 846.8085 2182534.9007 1477.3405 0.9724 0.0933 0.0709 8 1001.8451 4904945.0821 2214.7111 0.9518 0.1053 0.0734 9 1060.8742 5354347.6956 2313.9463 0.9490 0.1230 0.0847 Mean 1003.1237 5305620.3379 2228.7271 0.9476 0.1083 0.0775 Std 100.2165 2734194.7557 581.7181 0.0280 0.0091 0.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)
| MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|
| 0 | 1776.3835 | 10798641.6890 | 3286.1287 | 0.8803 | 0.1822 | 0.1508 |
| 1 | 1766.5396 | 11466276.8569 | 3386.1891 | 0.8724 | 0.1858 | 0.1534 |
| 2 | 1645.1377 | 11105558.6582 | 3332.5004 | 0.8844 | 0.1739 | 0.1438 |
| 3 | 1728.3849 | 14183257.4741 | 3766.0666 | 0.8384 | 0.1755 | 0.1409 |
| 4 | 1906.4971 | 16927411.6423 | 4114.2936 | 0.8384 | 0.1893 | 0.1460 |
| 5 | 2075.8795 | 21904604.4946 | 4680.2355 | 0.7963 | 0.1934 | 0.1539 |
| 6 | 2058.5415 | 16416996.8214 | 4051.7893 | 0.8323 | 0.1912 | 0.1546 |
| 7 | 1915.6385 | 15057950.0105 | 3880.4574 | 0.8285 | 0.1883 | 0.1455 |
| 8 | 2498.5724 | 33908077.6552 | 5823.0643 | 0.7542 | 0.2089 | 0.1598 |
| 9 | 2141.6358 | 21618413.3966 | 4649.5606 | 0.8034 | 0.1969 | 0.1486 |
| Mean | 1951.3210 | 17338718.8699 | 4097.0285 | 0.8329 | 0.1885 | 0.1497 |
| SD | 239.6233 | 6678284.2607 | 743.6908 | 0.0387 | 0.0097 | 0.0055 |
print(tuned_ada)
AdaBoostRegressor(base_estimator=None, learning_rate=0.05, loss='linear', n_estimators=90, random_state=123)Light Gradient Boosting Machineimport numpy as nplgbm_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)
| MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|
| Fold | ||||||
| 0 | 649.2541 | 1131046.4835 | 1063.5067 | 0.9876 | 0.0721 | 0.0544 |
| 1 | 785.8158 | 5518411.7880 | 2349.1300 | 0.9577 | 0.0730 | 0.0522 |
| 2 | 808.0977 | 3024520.4058 | 1739.1148 | 0.9723 | 0.0836 | 0.0597 |
| 3 | 749.7881 | 1774260.2775 | 1332.0136 | 0.9804 | 0.0724 | 0.0556 |
| 4 | 694.0351 | 1974576.4174 | 1405.1962 | 0.9754 | 0.0838 | 0.0585 |
| 5 | 841.6462 | 6725524.0654 | 2593.3615 | 0.9426 | 0.0824 | 0.0582 |
| 6 | 796.0240 | 3324498.6208 | 1823.3208 | 0.9688 | 0.0774 | 0.0564 |
| 7 | 713.1006 | 1872493.1136 | 1368.3907 | 0.9763 | 0.0715 | 0.0551 |
| 8 | 775.9760 | 2274682.3424 | 1508.2050 | 0.9777 | 0.0766 | 0.0579 |
| 9 | 768.3451 | 3247098.5445 | 1801.9707 | 0.9691 | 0.0885 | 0.0594 |
| Mean | 758.2083 | 3086711.2059 | 1698.4210 | 0.9708 | 0.0781 | 0.0567 |
| Std | 54.9147 | 1678033.7774 | 449.5301 | 0.0120 | 0.0058 | 0.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)
| MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|
| Fold | ||||||
| 0 | 1000.7122 | 2895159.1309 | 1701.5167 | 0.9682 | 0.1076 | 0.0828 |
| 1 | 1080.2841 | 6686388.0416 | 2585.8051 | 0.9488 | 0.1053 | 0.0814 |
| 2 | 1002.3163 | 3275429.6329 | 1809.8148 | 0.9700 | 0.1051 | 0.0812 |
| 3 | 1080.7850 | 4037154.5985 | 2009.2672 | 0.9555 | 0.1172 | 0.0870 |
| 4 | 1101.6333 | 7889520.5391 | 2808.8290 | 0.9016 | 0.1189 | 0.0842 |
| 5 | 1275.5901 | 11021312.1970 | 3319.8362 | 0.9059 | 0.1250 | 0.0895 |
| 6 | 1068.6534 | 4463866.3029 | 2112.7864 | 0.9581 | 0.1076 | 0.0809 |
| 7 | 975.9364 | 3271028.5175 | 1808.5985 | 0.9586 | 0.1099 | 0.0807 |
| 8 | 1101.9207 | 4441966.3616 | 2107.5973 | 0.9564 | 0.1114 | 0.0873 |
| 9 | 1065.1662 | 5192339.2748 | 2278.6705 | 0.9506 | 0.1224 | 0.0873 |
| Mean | 1075.2997 | 5317416.4597 | 2254.2722 | 0.9474 | 0.1130 | 0.0842 |
| Std | 79.0463 | 2416581.2427 | 485.4621 | 0.0227 | 0.0069 | 0.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)
| Model | MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|---|
| 0 | Light Gradient Boosting Machine | 781.5572 | 3816757.2761 | 1953.6523 | 0.9652 | 0.0787 | 0.0558 |
R2 в тестовом наборе составляет 0,9652 по сравнению с 0,9708, полученным
по результатам CV tuningd_lightgbm полученном выше. Это не существенная разница.
Если существует большая разница между результатами теста и CV, то это, как правило, указывает на переобучение, но также может быть связано с несколькими другими
факторами и требует дальнейшего изучения. В этом случае мы продолжим работу над
завершением модели и прогнозированием невидимых данных (те 10%, которые мы
выделили в начале и никогда не подвергали PyCaret).
(СОВЕТ: всегда полезно посмотреть на стандартное отклонение результатов CV при
использовании create_model.)
Завершение модели для развертывания
Завершение модели является последним шагом в эксперименте. Обычный рабочий
процесс машинного обучения в PyCaret начинается с setup(), за которым следует
сравнение всех моделей с помощью compare_models() и составление списка нескольких моделей-кандидатов (на основе интересующей метрики) для выполнения нескольких
методов моделирования, таких как настройка гиперпараметров, сборка, наложение
и т. д. Этот рабочий процесс в конечном итоге приведет вас к наилучшей модели для
прогнозирования новых и неизвестных данных. Функция finalize_model() подгоняет
модель к полному набору данных, включая тестовую и обучающую выборки. Цель этой функции — обучить модель на полном наборе данных, прежде чем она будет развернута в рабочей среде.
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)
| Model | MAE | MSE | RMSE | R2 | RMSLE | MAPE | |
|---|---|---|---|---|---|---|---|
| 0 | Light Gradient Boosting Machine | 432.2939 | 851645.0650 | 922.8462 | 0.9922 | 0.0449 | 0.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()
Model MAE MSE RMSE R2 RMSLE MAPE 0 Light Gradient Boosting Machine 707.9033 2268889.5439 1506.2834 0.9779 0.0696 0.0513
Carat Weight Cut Color Clarity Polish Symmetry Report Price Label 0 1.53 Ideal E SI1 ID ID AGSL 12791 12262.949782 1 1.50 Fair F SI1 VG VG GIA 10450 10122.442382 2 1.01 Good E SI1 G G GIA 5161 5032.520456 3 2.51 Very Good G VS2 VG VG GIA 34361 34840.379469 4 1.01 Good I SI1 VG VG GIA 4238 4142.695964
Столбец Label добавляется в набор data_unseen. Метка — это прогнозируемое значение с использованием модели final_lightgbm. Если вы хотите, чтобы прогнозы былиокруглены, вы можете использовать параметр округления внутри predict_model(). Вы также можете проверить метрики по этому вопросу, поскольку у вас есть фактическая целевая колонка Price. Для этого мы будем использовать модуль pycaret.utils.
from pycaret.utils import check_metriccheck_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() и сохранение не произошло. Для меня это сейчас не так важно, поэтому оставлю решение этого вопроса на потом.



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