Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой PyCaret и рассмотрим учебник по регрессии (REG102) — средний уровень с сайта библиотеки.
В этом уроке мы будем использовать модуль pycaret.regression, чтобы узнать:
- Нормализация : как нормализовать и масштабировать набор данных
- Преобразования : как применять преобразования, которые делают данные линейными и приблизительно нормальными.
- Целевое преобразование : как применить преобразования к целевой переменной
- Комбинация редких уровней : как комбинировать редкие уровни в категориальных показателях
- Бинарные числовые переменные : как группировать числовые переменные и преобразовывать числовые признаки в категориальные используя правила Стерджеса
- Сборка и объединение моделей : как повысить производительность модели с помощью нескольких методов объединения, таких как бэггинг, бустинг, голосование и обобщенное суммирование
Нормализация : Нормализация/масштабирование (часто взаимозаменяемо со стандартизацией) используется для преобразования фактических значений числовых переменных таким образом, чтобы обеспечить полезные свойства для машинного обучения. Многие алгоритмы, такие как линейная регрессия, метод опорных векторов и k-ближайших соседей, предполагают, что все функции сосредоточены вокруг нуля и имеют дисперсии одного порядка. Если конкретная функция в наборе данных имеет дисперсию, которая на порядок больше, чем у других функций, модель может не правильно понимать все функции и работать плохо.
Преобразование: в то время как нормализация преобразует диапазон данных, чтобы устранить влияние дисперсии, преобразование является более радикальным методом, поскольку оно изменяет форму распределения, так что преобразованные данные могут быть представлены в виде нормального или приблизительно нормального распределения. В общем, вы должны преобразовывать данные, если используете алгоритмы, предполагающие нормальность данных. Примерами таких моделей являются линейная регрессия, лассо-регрессия и гребневая регрессия.
Целевое преобразование: это похоже на метод преобразования, описанный выше, за исключением того, что он применяется только к целевой переменной.
Комбинация редких уровней: иногда категориальные признаки имеют уровни, которые несущественны в частотном распределении. Таким образом, они могут внести шум в набор данных из-за ограниченного размера выборки для обучения. Один из способов справиться с редкими уровнями в категориальных характеристиках — объединить их в новый класс.
Бинарные числовые переменные: бинирование или дискретизация — это процесс преобразования числовых переменных в категориальные признаки. Примером может быть вес в каратах в этом эксперименте. Это непрерывное распределение числовых значений, которые можно разбить на интервалы. Биннинг может повысить точность прогностической модели за счет уменьшения шума или нелинейности данных. PyCaret автоматически определяет количество и размер ячеек, используя правило Стерджеса.
Сборка и объединение моделей : моделирование ансамблей — это процесс, в котором создается несколько разнообразных моделей для прогнозирования результата. Это достигается либо за счет использования множества различных алгоритмов моделирования, либо за счет использования разных выборок обучающих наборов данных. Затем ансамблевая модель объединяет прогнозы каждой базовой модели, в результате чего получается один окончательный прогноз для невидимых данных. Мотивация использования ансамблевых моделей заключается в уменьшении ошибки обобщения прогноза. Пока базовые модели разнообразны и независимы, ошибка предсказания модели уменьшается при использовании ансамблевого подхода. Двумя наиболее распространенными методами ансамблевого обучения являются бэггинг и бустинг. Стекирование также является типом ансамблевого обучения, при котором прогнозы из нескольких моделей используются в качестве входных признаков для метамодели, которая предсказывает окончательный результат.
В этом уроке мы будем использовать тот же набор данных, который использовался в учебнике по регрессии (REG101) — уровень для начинающих.
dataset = get_data('diamond', profile=True)
Обратите внимание, что когда параметр профиля имеет значение True, он отображает профиль данных для исследовательского анализа данных
Пропущенные значения: в данных нет пропущенных значений. Однако нам по-прежнему нужны импутеры (заменители или восстановители) в нашем конвейере на тот случай, если в новых невидимых данных будут отсутствовать значения. Когда вы выполняете функцию setup(), импутеры создаются и сохраняются в конвейере автоматически. По умолчанию используется средний импьютер для числовых значений и постоянный импьютер для категориальных. Это можно изменить с помощью параметров numeric_imputation и categorical_imputation в setup().
Объединить редкие уровни: обратите внимание на распределение показателя Clarity в наборе данных. Он имеет 7 различных классов, из которых FL появляется только 4 раза. Точно так же в функции Cut уровень Fair появляется только в 2,1% случаев в наборе обучающих данных. Мы будем использовать параметр comb_rare_categories в настройках, чтобы комбинировать редкие уровни.
Шкала/диапазон данных: Обратите внимание, как масштаб/диапазон Carat Weight значительно отличается от переменной Price. Вес в каратах колеблется от 0,75 до 2,91, а цена колеблется от 2184 до 101 561. Мы решим эту проблему, используя параметр normalize в настройках.
Целевое преобразование: Целевая переменная Price не имеет нормального распределения. Она перекошена вправо с высоким эксцессом. Мы будем использовать параметр transform_target в настройке, чтобы применить линейное преобразование к целевой переменной. `
Биннинг цифровых признаков : вес в каратах — единственная числовая характеристика. Глядя на гистограмму, кажется, что распределение имеет естественные изломы. Биннинг преобразует его в категориальный признак и создаст несколько уровней, используя правило Стерджеса. Это поможет удалить шум для линейных алгоритмов.
(6000, 8)
Data for Modeling: (5400, 8)
Unseen Data For Predictions: (600, 8)
В предыдущем уроке «Регрессия» (REG101) — уровень «Начинающий» мы узнали, как
инициализировать среду в pycaret с помощью setup().
from pycaret.regression import *
exp_reg102 = setup(data = data, target = 'Price', session_id=123,
normalize = True, transformation = True, transform_target = True,
combine_rare_levels = True, rare_level_threshold = 0.05,
remove_multicollinearity = True, multicollinearity_threshold = 0.95,
bin_numeric_features = ['Carat Weight'],
log_experiment = True, experiment_name = 'diamond1',fold_shuffle=True)
Обратите внимание, что это та же сетка настройки, которая была показана в Учебнике
по регрессии (REG101) — уровень для начинающих. Единственное отличие состоит в
том, что для параметров настройки, которые были переданы в setup(), теперь
установлено значение True. Также обратите внимание, что session_id такой же, как тот,
который использовался в руководстве для начинающих, а это означает, что эффект
рандомизации полностью изолирован. Любые улучшения, которые мы видим в этом
эксперименте, связаны исключительно с шагами предварительной обработки,
выполненными в setup().
Как и в учебнике по регрессии (REG101) — уровень для начинающих, мы также начнем этот урок с compare_models(). Затем мы сравним приведенные ниже результаты с
последним экспериментом.
top3 = compare_models(exclude = ['ransac'], n_select = 3)
Model | MAE | MSE | RMSE | R2 | RMSLE | MAPE | TT (Sec) | |
---|---|---|---|---|---|---|---|---|
catboost | CatBoost Regressor | 714.0358 | 2515187.2489 | 1542.0571 | 0.9749 | 0.0753 | 0.0549 | 0.6900 |
xgboost | Extreme Gradient Boosting | 765.3329 | 2852830.5625 | 1654.7192 | 0.9721 | 0.0800 | 0.0588 | 0.3340 |
lightgbm | Light Gradient Boosting Machine | 769.2159 | 3003072.4028 | 1700.3881 | 0.9709 | 0.0792 | 0.0578 | 0.2160 |
rf | Random Forest Regressor | 843.8945 | 3213455.8882 | 1756.1910 | 0.9691 | 0.0913 | 0.0663 | 0.5380 |
huber | Huber Regressor | 940.0805 | 3608210.8358 | 1880.7551 | 0.9641 | 0.0971 | 0.0709 | 0.1430 |
ridge | Ridge Regression | 953.4315 | 3883628.0000 | 1951.2918 | 0.9614 | 0.0972 | 0.0716 | 0.0130 |
br | Bayesian Ridge | 958.3255 | 4036781.0500 | 1985.2586 | 0.9599 | 0.0973 | 0.0717 | 0.0190 |
lr | Linear Regression | 965.0986 | 4112780.4750 | 2004.8805 | 0.9591 | 0.0975 | 0.0719 | 0.7730 |
et | Extra Trees Regressor | 973.6904 | 4473669.6300 | 2089.2640 | 0.9560 | 0.1071 | 0.0768 | 0.6540 |
dt | Decision Tree Regressor | 999.0504 | 4701711.6340 | 2137.2010 | 0.9539 | 0.1092 | 0.0786 | 0.0200 |
gbr | Gradient Boosting Regressor | 1120.0474 | 5322222.5584 | 2259.1930 | 0.9476 | 0.1105 | 0.0839 | 0.1440 |
par | Passive Aggressive Regressor | 1480.1382 | 11778945.9379 | 3289.4602 | 0.8818 | 0.1305 | 0.1034 | 0.0140 |
knn | K Neighbors Regressor | 3254.7186 | 42507434.1601 | 6494.2007 | 0.5803 | 0.3892 | 0.2527 | 0.0380 |
ada | AdaBoost Regressor | 3818.4585 | 50589261.2421 | 7073.1359 | 0.5038 | 0.3554 | 0.2727 | 0.1360 |
omp | Orthogonal Matching Pursuit | 4048.2145 | 55953389.6000 | 7416.9102 | 0.4526 | 0.4824 | 0.3509 | 0.0150 |
lar | Least Angle Regression | 318.6240 | 1660080.3250 | 699.0833 | 0.2814 | 0.0327 | 0.0242 | 0.0180 |
lasso | Lasso Regression | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0130 |
en | Elastic Net | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0130 |
llar | Lasso Least Angle Regression | 6502.2526 | 113831824.0000 | 10640.1778 | -0.1262 | 0.7148 | 0.5619 | 0.0140 |
Обратите внимание, что мы использовали параметр n_select в compare_models. В
последнем уроке вы видели, что compare_models по умолчанию возвращает наиболее
эффективную модель (одна модель на основе порядка сортировки по умолчанию).
Однако вы можете использовать параметр n_select для возврата лучших N моделей.
В этом примере функция compare_models вернула первые 3 модели.
type(top3)
listprint(top3)
[PowerTransformedTargetRegressor(border_count=254, loss_function='RMSE', power_transformer_method='box-cox', power_transformer_standardize=True, random_state=123, regressor=<catboost.core.CatBoostRegressor object at 0x00000170085DCCC0>, task_type='CPU', verbose=False), PowerTransformedTargetRegressor(base_score=None, booster='gbtree', colsample_bylevel=None, colsample_bynode=None, colsample_bytree=None, gamma=None, gpu_id=None, importance_type='gain', interaction_constraints=None, learning_rate=None, max_delta_step=None, max_depth=None, min_child_weight=None, missing=nan, monotone_constraints=None, n_estimators=100, n_jobs=-1, nu... missing=nan, monotone_constraints=None, n_estimators=100, n_jobs=-1, num_parallel_tree=None, objective='reg:squarederror', random_state=123, reg_alpha=None, reg_lambda=None, scale_pos_weight=None, subsample=None, tree_method='auto', validate_parameters=None, verbosity=0), scale_pos_weight=None, subsample=None, tree_method='auto', validate_parameters=None, verbosity=0), PowerTransformedTargetRegressor(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0, importance_type='split', learning_rate=0.1, max_depth=-1, min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0, n_estimators=100, n_jobs=-1, num_leaves=31, objective=None, power_transformer_method='box-cox', power_transformer_standardize=True, random_state=1... importance_type='split', learning_rate=0.1, max_depth=-1, min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0, n_estimators=100, n_jobs=-1, num_leaves=31, objective=None, random_state=123, reg_alpha=0.0, reg_lambda=0.0, silent=True, subsample=1.0, subsample_for_bin=200000, subsample_freq=0), silent=True, subsample=1.0, subsample_for_bin=200000, subsample_freq=0)]
Для сравнения мы будем использовать показатель RMSLE. Обратите внимание,
насколько значительно улучшились некоторые алгоритмы после того, как мы
выполнили несколько шагов предварительной обработки в setup().
Линейная регрессия RMSLE улучшена с 0,6690 до 0,0973
RMSLE гребневой регрессии улучшилось с 0,6689 до 0,0971.
RMSLE регрессии Хубера улучшилось с 0,4333 до 0,0972
Создать модель (с 5-кратная проверка)
Cоздадим все модели с использованием 5-кратной перекрестной проверки, для этого
внутри create_model() передается параметр fold.
dt = create_model('dt', fold = 5)
MAE MSE RMSE R2 RMSLE MAPE 0 947.3344 3101481.7711 1761.1024 0.9656 0.1051 0.0772 1 916.2103 3395301.9961 1842.6345 0.9631 0.1056 0.0777 2 961.8644 4177592.0425 2043.9159 0.9607 0.1135 0.0785 3 1041.6254 4795761.6482 2189.9227 0.9484 0.1103 0.0797 4 1077.3194 5820537.5266 2412.5790 0.9530 0.1096 0.0785 Mean 988.8708 4258134.9969 2050.0309 0.9581 0.1088 0.0783 SD 60.5646 981728.9565 235.6019 0.0064 0.0031 0.0008
Создать модель (метрики округлены до 2 знаков после запятой)
rf = create_model('rf', round = 2)
MAE MSE RMSE R2 RMSLE MAPE 0 851.93 2131516.55 1459.97 0.98 0.09 0.07 1 727.49 1805631.01 1343.74 0.98 0.08 0.06 2 828.42 3273059.72 1809.16 0.97 0.09 0.06 3 714.28 1737884.47 1318.29 0.98 0.08 0.06 4 865.63 2908401.51 1705.40 0.97 0.10 0.07 5 845.59 4552152.91 2133.58 0.96 0.09 0.06 6 878.24 2895391.20 1701.58 0.97 0.09 0.07 7 833.88 2177191.78 1475.53 0.98 0.09 0.07 8 906.99 5575294.32 2361.21 0.96 0.09 0.06 9 986.49 5078035.41 2253.45 0.95 0.10 0.07 Mean 843.89 3213455.89 1756.19 0.97 0.09 0.07 SD 75.31 1320929.26 359.51 0.01 0.01 0.00
Создать модель (KNN)
MAE MSE RMSE R2 RMSLE MAPE 0 3174.6763 39702489.2909 6300.9911 0.5599 0.3863 0.2370 1 3010.0881 32633486.6470 5712.5727 0.6369 0.3616 0.2520 2 2998.3271 37983757.7569 6163.0964 0.6045 0.3957 0.2645 3 2886.9529 33263139.5442 5767.4205 0.6210 0.3776 0.2692 4 3327.9154 45066712.1311 6713.1745 0.5698 0.3993 0.2672 5 3324.0724 42747311.6773 6538.1428 0.6025 0.3973 0.2440 6 3466.1657 43383275.8514 6586.5982 0.5570 0.3926 0.2506 7 3337.6370 41387844.4971 6433.3385 0.5286 0.4057 0.2623 8 3666.3254 61583709.7617 7847.5289 0.5535 0.3894 0.2436 9 3355.0255 47322614.4430 6879.1434 0.5696 0.3869 0.2368 Mean 3254.7186 42507434.1601 6494.2007 0.5803 0.3892 0.2527 SD 225.4936 7791029.8612 576.8806 0.0324 0.0119 0.0117
Когда модель создается с помощью функции create_model, она использует
гиперпараметры по умолчанию для обучения модели. Для настройки гиперпараметров
используется функция tune_model. Эта функция автоматически настраивает
гиперпараметры модели с помощью случайного поиска по сетке в предварительно
определенном пространстве поиска. Параметр n_iter в tune_model() — количество
итераций в случайном поиске по сетке. Для каждой итерации модель случайным
образом выбирает одно значение из предварительно определенной сетки
гиперпараметров. По умолчанию для параметра установлено значение 10, что означает максимум 10 итераций для поиска наилучшего значения гиперпараметров. Увеличение
значения может улучшить производительность, но также увеличит время обучения.
tuned_knn = tune_model(knn)
MAE MSE RMSE R2 RMSLE MAPE 0 2333.0003 32813292.0909 5728.2888 0.6362 0.3017 0.1523 1 2234.0066 26937543.4065 5190.1391 0.7003 0.2921 0.1759 2 2447.5416 33969869.3426 5828.3676 0.6463 0.3287 0.1854 3 2028.0556 25343311.7889 5034.2141 0.7112 0.3028 0.1691 4 2283.4503 32191412.3339 5673.7476 0.6927 0.3180 0.1821 5 2659.7568 38265463.5817 6185.9085 0.6442 0.3455 0.1841 6 2532.0556 33168759.4139 5759.2325 0.6613 0.3221 0.1756 7 2412.8729 29126112.7442 5396.8614 0.6683 0.3300 0.1791 8 2810.7409 46513804.4901 6820.1030 0.6628 0.3372 0.1753 9 2546.1299 39685819.9779 6299.6682 0.6391 0.3208 0.1651 Mean 2428.7611 33801538.9171 5791.6531 0.6662 0.3199 0.1744 SD 212.8609 6005552.5796 508.2258 0.0254 0.0160 0.0095
tuned_knn2 = tune_model(knn, n_iter = 50)
MAE MSE RMSE R2 RMSLE MAPE 0 2317.6508 31359504.1582 5599.9557 0.6523 0.3239 0.1705 1 2270.4107 24064073.9184 4905.5146 0.7323 0.3178 0.1965 2 2481.3387 33509155.3013 5788.7093 0.6511 0.3507 0.1909 3 2287.9987 27713971.1219 5264.4061 0.6842 0.3587 0.2203 4 2198.4716 29608228.9668 5441.3444 0.7173 0.3058 0.1790 5 2451.1993 30742924.2205 5544.6302 0.7141 0.3662 0.2021 6 2559.8857 30985151.9331 5566.4308 0.6836 0.3384 0.1991 7 2494.5447 28281768.0019 5318.0605 0.6779 0.3429 0.1941 8 2812.4391 44960071.6123 6705.2272 0.6740 0.3636 0.2076 9 2627.7716 35646154.7123 5970.4401 0.6758 0.3575 0.1965 Mean 2450.1711 31687100.3947 5610.4719 0.6863 0.3425 0.1956 SD 178.1255 5352303.8376 457.9361 0.0257 0.0197 0.0132
Обратите внимание, как были созданы два настроенных K ближайших соседей на
основе параметра n_iter. В tuningd_knn параметр n_iter оставлен со значением по
умолчанию, в результате чего R2 составляет 0,6662. В файле tuningd_knn2 параметр
n_iter был установлен на 50, а R2 улучшился до 0,6863. Обратите внимание на различия между гиперпараметрами tuningd_knn и tuningd_knn2 ниже:
plot_model(tuned_knn, plot = 'parameter')
Parameters algorithm auto leaf_size 30 metric minkowski metric_params None n_jobs -1 n_neighbors 9 p 2 weights distance power_transformer_method box-cox power_transformer_standardize True regressor KNeighborsRegressor(algorithm='auto', leaf_siz...
plot_model(tuned_knn2, plot = 'parameter')
Parameters algorithm auto leaf_size 30 metric manhattan metric_params None n_jobs -1 n_neighbors 3 p 2 weights distance power_transformer_method box-cox power_transformer_standardize True regressor KNeighborsRegressor(algorithm='auto', leaf_siz...
Соборка модели
Ансамблирование — это распространенный метод машинного обучения, используемый для повышения производительности моделей (в основном на основе дерева).
Существуют различные техники сборки, которые мы рассмотрим в этом разделе. К ним
относятся бэггинг и бустинг. Мы будем использовать функцию ensemble_model() в PyCaret, которая объединяет обученные базовые оценщики,
используя метод, определенный в параметре метода.
dt = create_model('dt')
MAE MSE RMSE R2 RMSLE MAPE 0 1001.7448 3443714.8007 1855.7249 0.9618 0.1095 0.0804 1 931.0755 5556376.7504 2357.1968 0.9382 0.1037 0.0761 2 1051.4569 5314816.6453 2305.3886 0.9447 0.1152 0.0822 3 815.9983 2020114.8272 1421.3074 0.9770 0.1054 0.0773 4 1009.9248 3894994.1550 1973.5740 0.9628 0.1141 0.0820 5 962.7059 4827085.6020 2197.0629 0.9551 0.1056 0.0731 6 1053.0536 6567322.4822 2562.6788 0.9329 0.1118 0.0797 7 969.4786 3081530.5813 1755.4289 0.9649 0.1036 0.0780 8 1111.2474 7212039.0735 2685.5240 0.9477 0.1107 0.0775 9 1083.8186 5099121.4227 2258.1234 0.9536 0.1125 0.0795 Mean 999.0504 4701711.6340 2137.2010 0.9539 0.1092 0.0786 SD 81.1703 1520248.2784 366.1743 0.0127 0.0041 0.0026
Бэггинг
bagged_dt = ensemble_model(dt)
MAE MSE RMSE R2 RMSLE MAPE 0 889.2245 2594154.3134 1610.6379 0.9712 0.0985 0.0719 1 704.8581 1586995.4990 1259.7601 0.9823 0.0840 0.0622 2 851.6300 3315498.0220 1820.8509 0.9655 0.0889 0.0647 3 737.5222 1854389.7835 1361.7598 0.9789 0.0874 0.0653 4 900.8250 3511421.5470 1873.8787 0.9665 0.0990 0.0692 5 845.2386 3467374.9230 1862.0889 0.9678 0.0928 0.0644 6 922.1444 4300854.7628 2073.8502 0.9561 0.0970 0.0709 7 895.9817 2518119.1226 1586.8583 0.9713 0.0922 0.0701 8 994.7037 7196189.0228 2682.5713 0.9478 0.0987 0.0681 9 1033.4852 5668102.9007 2380.7778 0.9484 0.1077 0.0749 Mean 877.5613 3601309.9897 1851.3034 0.9656 0.0946 0.0682 SD 96.0173 1645865.0063 417.1160 0.0111 0.0066 0.0037
Обратите внимание, как сборка улучшила RMSLE с 0,1082 до 0,0938. В приведенном
выше примере мы использовали параметры по умолчанию для ensemble_model(), который использует метод Бэггинга. Давайте попробуем Бустинг,
изменив параметр метода в ensemble_model().
Бустинг
boosted_dt = ensemble_model(dt, method = 'Boosting')
MAE MSE RMSE R2 RMSLE MAPE 0 891.3429 2247979.9956 1499.3265 0.9751 0.1041 0.0753 1 799.6287 2361091.9786 1536.5845 0.9737 0.0904 0.0665 2 905.6923 4062457.1793 2015.5538 0.9577 0.0974 0.0675 3 746.2552 1718333.5050 1310.8522 0.9804 0.0923 0.0689 4 951.8046 3310772.9846 1819.5530 0.9684 0.1067 0.0779 5 928.7391 4903899.8543 2214.4751 0.9544 0.1006 0.0694 6 1011.4442 5580404.8392 2362.2881 0.9430 0.1010 0.0753 7 933.1666 2959364.4093 1720.2803 0.9663 0.1002 0.0739 8 1105.0940 8607267.1807 2933.8144 0.9376 0.1169 0.0767 9 1054.9113 4656119.0636 2157.8042 0.9577 0.1056 0.0764 Mean 932.8079 4040769.0990 1957.0532 0.9614 0.1015 0.0728 SD 103.0273 1935948.0652 459.0336 0.0132 0.0072 0.0040
Обратите внимание, что ensemble_model() по умолчанию создаст 10 оценок. Это можно изменить с помощью параметра n_estimators. Увеличение числа оценщиков иногда
может улучшить результаты
bagged_dt2 = ensemble_model(dt, n_estimators=50)
MAE MSE RMSE R2 RMSLE MAPE 0 881.3964 2447728.8161 1564.5219 0.9729 0.0962 0.0712 1 723.4142 1825400.4910 1351.0738 0.9797 0.0848 0.0629 2 830.7885 3250067.9969 1802.7945 0.9662 0.0871 0.0636 3 727.2040 1833529.1586 1354.0787 0.9791 0.0858 0.0639 4 876.2017 3056108.8652 1748.1730 0.9708 0.0955 0.0683 5 838.9919 4347855.3047 2085.1511 0.9596 0.0914 0.0629 6 891.4040 3224528.7990 1795.6973 0.9671 0.0938 0.0698 7 845.0621 2301749.2767 1517.1517 0.9738 0.0882 0.0667 8 924.6756 5837957.8303 2416.1866 0.9577 0.0924 0.0655 9 973.7217 4477715.2275 2116.0613 0.9593 0.1008 0.0720 Mean 851.2860 3260264.1766 1775.0890 0.9686 0.0916 0.0667 SD 74.7469 1225804.9437 330.6406 0.0076 0.0049 0.0033
Обратите внимание, как увеличение параметра n_estimators улучшило результат.
Модель bagged_dt с 10 оценщиками по умолчанию привела к RMSLE 0,1015, тогда как в bagged_dt2, где n_estimators = 50, RMSLE улучшилось до 0,0986.
Блендинг
Блендинг — еще один распространенный метод объединения, который можно
использовать в PyCaret. Он создает несколько моделей, а затем усредняет отдельные
прогнозы, чтобы сформировать окончательный прогноз.
Перед смешиванием обучаем отдельные индивидуальные модели
lightgbm = create_model('lightgbm', verbose = False)
dt = create_model('dt', verbose = False)
lr = create_model('lr', verbose = False)
Смешиваем модели
blender = blend_models(estimator_list = [lightgbm, dt, lr])
MAE MSE RMSE R2 RMSLE MAPE 0 759.6683 2132218.6199 1460.2118 0.9764 0.0831 0.0603 1 714.6417 1822381.8907 1349.9563 0.9797 0.0786 0.0585 2 661.2654 1581394.6489 1257.5351 0.9835 0.0728 0.0556 3 683.1303 1682595.1795 1297.1489 0.9808 0.0807 0.0591 4 767.7543 2309319.5122 1519.6445 0.9780 0.0815 0.0603 5 763.7309 2902995.4664 1703.8179 0.9730 0.0836 0.0584 6 816.7307 3415365.4963 1848.0707 0.9651 0.0835 0.0623 7 756.7378 1839285.8466 1356.2027 0.9791 0.0788 0.0603 8 811.2672 3558615.4463 1886.4293 0.9742 0.0775 0.0565 9 905.1362 3000885.8697 1732.3065 0.9727 0.0895 0.0654 Mean 764.0063 2424505.7976 1541.1324 0.9762 0.0810 0.0597 SD 66.7461 699583.9498 222.2988 0.0050 0.0043 0.0027
Смешать top3 модели из compare_models
blender_top3 = blend_models(top3)
MAE MSE RMSE R2 RMSLE MAPE 0 734.2669 2043695.9862 1429.5790 0.9773 0.0773 0.0565 1 655.8904 1478725.0934 1216.0284 0.9835 0.0745 0.0554 2 594.7692 1168516.2083 1080.9793 0.9878 0.0647 0.0495 3 634.0927 1598891.3572 1264.4728 0.9818 0.0726 0.0537 4 746.5219 2254298.8238 1501.4323 0.9785 0.0774 0.0574 5 734.4614 4301027.3517 2073.8918 0.9600 0.0807 0.0534 6 775.2173 3142146.7645 1772.6102 0.9679 0.0780 0.0589 7 674.7023 1910831.3538 1382.3282 0.9782 0.0714 0.0533 8 748.3904 3262498.6304 1806.2388 0.9763 0.0723 0.0527 9 786.7417 2193914.3979 1481.1868 0.9800 0.0818 0.0599 Mean 708.5054 2335454.5967 1500.8748 0.9772 0.0751 0.0551 SD 61.0975 911259.7364 287.8013 0.0075 0.0048 0.0030
Стекинг
Стекинг - еще один популярный метод сборки, но он применяется реже из-за
практических трудностей. Стекирование — это метод ансамблевого обучения, который
объединяет несколько моделей с помощью метамодели. Другой способ представить
наложение друг на друга состоит в том, что несколько моделей обучаются
прогнозировать результат и создается метамодель, которая использует прогнозы этих
моделей в качестве входных данных вместе с исходными функциями
Давайте посмотрим на пример ниже, используя 3 лучшие модели, которые мы получили от compare_models:
stacker = stack_models(top3)
MAE MSE RMSE R2 RMSLE MAPE 0 749.2735 2477903.8119 1574.1359 0.9725 0.0773 0.0562 1 672.0119 1519861.5785 1232.8267 0.9831 0.0738 0.0551 2 544.4354 901520.6786 949.4844 0.9906 0.0621 0.0475 3 627.9570 1567507.0335 1252.0012 0.9821 0.0733 0.0536 4 697.0966 1855400.6950 1362.1309 0.9823 0.0751 0.0551 5 790.5501 9040776.9765 3006.7885 0.9159 0.0811 0.0542 6 792.5227 4078100.1626 2019.4307 0.9584 0.0781 0.0584 7 692.0829 1814004.9674 1346.8500 0.9793 0.0718 0.0538 8 751.3295 2529593.2268 1590.4695 0.9817 0.0708 0.0532 9 792.9674 2120838.3512 1456.3098 0.9807 0.0814 0.0600 Mean 711.0227 2790550.7482 1579.0428 0.9727 0.0745 0.0547 SD 77.1332 2232589.1205 545.1373 0.0206 0.0054 0.0032
По умолчанию метамодель (окончательная модель для создания прогнозов) — это
линейная регрессия. Метамодель можно изменить с помощью параметра meta_model
xgboost = create_model('xgboost')
stacker2 = stack_models(top3, meta_model = xgboost)
MAE MSE RMSE R2 RMSLE MAPE 0 784.2491 2638421.7500 1624.3219 0.9708 0.0805 0.0608 1 696.5787 2029539.8750 1424.6193 0.9774 0.0800 0.0588 2 674.7789 1903072.5000 1379.5189 0.9802 0.0705 0.0544 3 704.5421 2075759.8750 1440.7498 0.9763 0.0818 0.0588 4 808.8419 2507697.0000 1583.5709 0.9761 0.0857 0.0630 5 755.6437 2677102.0000 1636.1852 0.9751 0.0828 0.0570 6 848.2363 3646974.7500 1909.7054 0.9628 0.0854 0.0650 7 744.3414 1740071.1250 1319.1176 0.9802 0.0781 0.0597 8 846.4321 4877697.5000 2208.5510 0.9646 0.0796 0.0585 9 827.1507 2557633.7500 1599.2604 0.9767 0.0831 0.0622 Mean 769.0795 2665397.0125 1612.5600 0.9740 0.0808 0.0598 SD 60.4477 899136.7027 255.0434 0.0058 0.0041 0.0029
Комментариев нет:
Отправить комментарий