Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой 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 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)
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_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() и сохранение не произошло. Для меня это сейчас не так важно, поэтому оставлю решение этого вопроса на потом.
Комментариев нет:
Отправить комментарий