пятница, 9 декабря 2022 г.

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

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


В этом уроке мы будем использовать модуль pycaret.regression, чтобы узнать:

  • Нормализация : как нормализовать и масштабировать набор данных
  • Преобразования : как применять преобразования, которые делают данные линейными и приблизительно нормальными.
  • Целевое преобразование : как применить преобразования к целевой переменной
  • Комбинация редких уровней : как комбинировать редкие уровни в категориальных показателях
  • Бинарные числовые переменные : как группировать числовые переменные и преобразовывать числовые признаки в категориальные используя правила Стерджеса
  • Сборка и объединение моделей : как повысить производительность модели с помощью нескольких методов объединения, таких как бэггинг, бустинг, голосование и обобщенное суммирование

Краткий обзор методов

Нормализация : Нормализация/масштабирование (часто взаимозаменяемо со стандартизацией) используется для преобразования фактических значений числовых переменных таким образом, чтобы обеспечить полезные свойства для машинного обучения. Многие алгоритмы, такие как линейная регрессия, метод опорных векторов и k-ближайших соседей, предполагают, что все функции сосредоточены вокруг нуля и имеют дисперсии одного порядка. Если конкретная функция в наборе данных имеет дисперсию, которая на порядок больше, чем у других функций, модель может не правильно понимать все функции и работать плохо. 

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

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

Комбинация редких уровней: иногда категориальные признаки имеют уровни, которые несущественны в частотном распределении. Таким образом, они могут внести шум в набор данных из-за ограниченного размера выборки для обучения. Один из способов справиться с редкими уровнями в категориальных характеристиках — объединить их в новый класс.

Бинарные числовые переменные: бинирование или дискретизация — это процесс преобразования числовых переменных в категориальные признаки. Примером может быть вес в каратах в этом эксперименте. Это непрерывное распределение числовых значений, которые можно разбить на интервалы. Биннинг может повысить точность прогностической модели за счет уменьшения шума или нелинейности данных. PyCaret автоматически определяет количество и размер ячеек, используя правило Стерджеса. 

Сборка и объединение моделей : моделирование ансамблей — это процесс, в котором создается несколько разнообразных моделей для прогнозирования результата. Это достигается либо за счет использования множества различных алгоритмов моделирования, либо за счет использования разных выборок обучающих наборов данных. Затем ансамблевая модель объединяет прогнозы каждой базовой модели, в результате чего получается один окончательный прогноз для невидимых данных. Мотивация использования ансамблевых моделей заключается в уменьшении ошибки обобщения прогноза. Пока базовые модели разнообразны и независимы, ошибка предсказания модели уменьшается при использовании ансамблевого подхода. Двумя наиболее распространенными методами ансамблевого обучения являются бэггинг и бустинг. Стекирование также является типом ансамблевого обучения, при котором прогнозы из нескольких моделей используются в качестве входных признаков для метамодели, которая предсказывает окончательный результат. 


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

from pycaret.datasets import get_data
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 в настройке, чтобы применить линейное преобразование к целевой переменной. `

Биннинг цифровых признаков : вес в каратах — единственная числовая характеристика. Глядя на гистограмму, кажется, что распределение имеет естественные изломы. Биннинг преобразует его в категориальный признак и создаст несколько уровней, используя правило Стерджеса. Это поможет удалить шум для линейных алгоритмов.


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

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)


В предыдущем уроке «Регрессия» (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)

ModelMAEMSERMSER2RMSLEMAPETT (Sec)
catboostCatBoost Regressor714.03582515187.24891542.05710.97490.07530.05490.6900
xgboostExtreme Gradient Boosting765.33292852830.56251654.71920.97210.08000.05880.3340
lightgbmLight Gradient Boosting Machine769.21593003072.40281700.38810.97090.07920.05780.2160
rfRandom Forest Regressor843.89453213455.88821756.19100.96910.09130.06630.5380
huberHuber Regressor940.08053608210.83581880.75510.96410.09710.07090.1430
ridgeRidge Regression953.43153883628.00001951.29180.96140.09720.07160.0130
brBayesian Ridge958.32554036781.05001985.25860.95990.09730.07170.0190
lrLinear Regression965.09864112780.47502004.88050.95910.09750.07190.7730
etExtra Trees Regressor973.69044473669.63002089.26400.95600.10710.07680.6540
dtDecision Tree Regressor999.05044701711.63402137.20100.95390.10920.07860.0200
gbrGradient Boosting Regressor1120.04745322222.55842259.19300.94760.11050.08390.1440
parPassive Aggressive Regressor1480.138211778945.93793289.46020.88180.13050.10340.0140
knnK Neighbors Regressor3254.718642507434.16016494.20070.58030.38920.25270.0380
adaAdaBoost Regressor3818.458550589261.24217073.13590.50380.35540.27270.1360
ompOrthogonal Matching Pursuit4048.214555953389.60007416.91020.45260.48240.35090.0150
larLeast Angle Regression318.62401660080.3250699.08330.28140.03270.02420.0180
lassoLasso Regression6502.2526113831824.000010640.1778-0.12620.71480.56190.0130
enElastic Net6502.2526113831824.000010640.1778-0.12620.71480.56190.0130
llarLasso Least Angle Regression6502.2526113831824.000010640.1778-0.12620.71480.56190.0140



Обратите внимание, что мы использовали параметр n_select в compare_models. В 

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

эффективную модель (одна модель на основе порядка сортировки по умолчанию).

Однако вы можете использовать параметр n_select для возврата лучших N моделей. 

В этом примере функция compare_models вернула первые 3 модели.


type(top3)

list

print(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)

MAEMSERMSER2RMSLEMAPE
0947.33443101481.77111761.10240.96560.10510.0772
1916.21033395301.99611842.63450.96310.10560.0777
2961.86444177592.04252043.91590.96070.11350.0785
31041.62544795761.64822189.92270.94840.11030.0797
41077.31945820537.52662412.57900.95300.10960.0785
Mean988.87084258134.99692050.03090.95810.10880.0783
SD60.5646981728.9565235.60190.00640.00310.0008


Создать модель (метрики округлены до 2 знаков после запятой)

rf = create_model('rf', round = 2)

MAEMSERMSER2RMSLEMAPE
0851.932131516.551459.970.980.090.07
1727.491805631.011343.740.980.080.06
2828.423273059.721809.160.970.090.06
3714.281737884.471318.290.980.080.06
4865.632908401.511705.400.970.100.07
5845.594552152.912133.580.960.090.06
6878.242895391.201701.580.970.090.07
7833.882177191.781475.530.980.090.07
8906.995575294.322361.210.960.090.06
9986.495078035.412253.450.950.100.07
Mean843.893213455.891756.190.970.090.07
SD75.311320929.26359.510.010.010.00


Создать модель (KNN)

 MAEMSERMSER2RMSLEMAPE
03174.676339702489.29096300.99110.55990.38630.2370
13010.088132633486.64705712.57270.63690.36160.2520
22998.327137983757.75696163.09640.60450.39570.2645
32886.952933263139.54425767.42050.62100.37760.2692
43327.915445066712.13116713.17450.56980.39930.2672
53324.072442747311.67736538.14280.60250.39730.2440
63466.165743383275.85146586.59820.55700.39260.2506
73337.637041387844.49716433.33850.52860.40570.2623
83666.325461583709.76177847.52890.55350.38940.2436
93355.025547322614.44306879.14340.56960.38690.2368
Mean3254.718642507434.16016494.20070.58030.38920.2527
SD225.49367791029.8612576.88060.03240.01190.0117

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

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

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

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

определенном пространстве поиска. Параметр n_iter в tune_model() — количество

итераций в случайном поиске по сетке. Для каждой итерации модель случайным

образом выбирает одно значение из предварительно определенной сетки

гиперпараметров. По умолчанию для параметра установлено значение 10, что означает максимум 10 итераций для поиска наилучшего значения гиперпараметров. Увеличение

значения может улучшить производительность, но также увеличит время обучения.


tuned_knn = tune_model(knn)

MAEMSERMSER2RMSLEMAPE
02333.000332813292.09095728.28880.63620.30170.1523
12234.006626937543.40655190.13910.70030.29210.1759
22447.541633969869.34265828.36760.64630.32870.1854
32028.055625343311.78895034.21410.71120.30280.1691
42283.450332191412.33395673.74760.69270.31800.1821
52659.756838265463.58176185.90850.64420.34550.1841
62532.055633168759.41395759.23250.66130.32210.1756
72412.872929126112.74425396.86140.66830.33000.1791
82810.740946513804.49016820.10300.66280.33720.1753
92546.129939685819.97796299.66820.63910.32080.1651
Mean2428.761133801538.91715791.65310.66620.31990.1744
SD212.86096005552.5796508.22580.02540.01600.0095


tuned_knn2 = tune_model(knn, n_iter = 50)

MAEMSERMSER2RMSLEMAPE
02317.650831359504.15825599.95570.65230.32390.1705
12270.410724064073.91844905.51460.73230.31780.1965
22481.338733509155.30135788.70930.65110.35070.1909
32287.998727713971.12195264.40610.68420.35870.2203
42198.471629608228.96685441.34440.71730.30580.1790
52451.199330742924.22055544.63020.71410.36620.2021
62559.885730985151.93315566.43080.68360.33840.1991
72494.544728281768.00195318.06050.67790.34290.1941
82812.439144960071.61236705.22720.67400.36360.2076
92627.771635646154.71235970.44010.67580.35750.1965
Mean2450.171131687100.39475610.47190.68630.34250.1956
SD178.12555352303.8376457.93610.02570.01970.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
algorithmauto
leaf_size30
metricminkowski
metric_paramsNone
n_jobs-1
n_neighbors9
p2
weightsdistance
power_transformer_methodbox-cox
power_transformer_standardizeTrue
regressorKNeighborsRegressor(algorithm='auto', leaf_siz...

plot_model(tuned_knn2, plot = 'parameter')

Parameters
algorithmauto
leaf_size30
metricmanhattan
metric_paramsNone
n_jobs-1
n_neighbors3
p2
weightsdistance
power_transformer_methodbox-cox
power_transformer_standardizeTrue
regressorKNeighborsRegressor(algorithm='auto', leaf_siz...


Соборка модели

Ансамблирование — это распространенный метод машинного обучения, используемый для повышения производительности моделей (в основном на основе дерева). 
Существуют различные техники сборки, которые мы рассмотрим в этом разделе. К ним
относятся бэггинг и бустинг. Мы будем использовать функцию ensemble_model() в PyCaret, которая объединяет обученные базовые оценщики,
используя метод, определенный в параметре метода.

dt = create_model('dt')

MAEMSERMSER2RMSLEMAPE
01001.74483443714.80071855.72490.96180.10950.0804
1931.07555556376.75042357.19680.93820.10370.0761
21051.45695314816.64532305.38860.94470.11520.0822
3815.99832020114.82721421.30740.97700.10540.0773
41009.92483894994.15501973.57400.96280.11410.0820
5962.70594827085.60202197.06290.95510.10560.0731
61053.05366567322.48222562.67880.93290.11180.0797
7969.47863081530.58131755.42890.96490.10360.0780
81111.24747212039.07352685.52400.94770.11070.0775
91083.81865099121.42272258.12340.95360.11250.0795
Mean999.05044701711.63402137.20100.95390.10920.0786
SD81.17031520248.2784366.17430.01270.00410.0026


Бэггинг

bagged_dt = ensemble_model(dt)

MAEMSERMSER2RMSLEMAPE
0889.22452594154.31341610.63790.97120.09850.0719
1704.85811586995.49901259.76010.98230.08400.0622
2851.63003315498.02201820.85090.96550.08890.0647
3737.52221854389.78351361.75980.97890.08740.0653
4900.82503511421.54701873.87870.96650.09900.0692
5845.23863467374.92301862.08890.96780.09280.0644
6922.14444300854.76282073.85020.95610.09700.0709
7895.98172518119.12261586.85830.97130.09220.0701
8994.70377196189.02282682.57130.94780.09870.0681
91033.48525668102.90072380.77780.94840.10770.0749
Mean877.56133601309.98971851.30340.96560.09460.0682
SD96.01731645865.0063417.11600.01110.00660.0037

Обратите внимание, как сборка улучшила RMSLE с 0,1082 до 0,0938. В приведенном
выше примере мы использовали параметры по умолчанию для ensemble_model(), который использует метод Бэггинга. Давайте попробуем Бустинг,
изменив параметр метода в ensemble_model().

Бустинг

boosted_dt = ensemble_model(dt, method = 'Boosting')

MAEMSERMSER2RMSLEMAPE
0891.34292247979.99561499.32650.97510.10410.0753
1799.62872361091.97861536.58450.97370.09040.0665
2905.69234062457.17932015.55380.95770.09740.0675
3746.25521718333.50501310.85220.98040.09230.0689
4951.80463310772.98461819.55300.96840.10670.0779
5928.73914903899.85432214.47510.95440.10060.0694
61011.44425580404.83922362.28810.94300.10100.0753
7933.16662959364.40931720.28030.96630.10020.0739
81105.09408607267.18072933.81440.93760.11690.0767
91054.91134656119.06362157.80420.95770.10560.0764
Mean932.80794040769.09901957.05320.96140.10150.0728
SD103.02731935948.0652459.03360.01320.00720.0040

 Обратите внимание, что ensemble_model() по умолчанию создаст 10 оценок. Это можно изменить с помощью параметра n_estimators. Увеличение числа оценщиков иногда
может улучшить результаты


bagged_dt2 = ensemble_model(dt, n_estimators=50)

MAEMSERMSER2RMSLEMAPE
0881.39642447728.81611564.52190.97290.09620.0712
1723.41421825400.49101351.07380.97970.08480.0629
2830.78853250067.99691802.79450.96620.08710.0636
3727.20401833529.15861354.07870.97910.08580.0639
4876.20173056108.86521748.17300.97080.09550.0683
5838.99194347855.30472085.15110.95960.09140.0629
6891.40403224528.79901795.69730.96710.09380.0698
7845.06212301749.27671517.15170.97380.08820.0667
8924.67565837957.83032416.18660.95770.09240.0655
9973.72174477715.22752116.06130.95930.10080.0720
Mean851.28603260264.17661775.08900.96860.09160.0667
SD74.74691225804.9437330.64060.00760.00490.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])



MAEMSERMSER2RMSLEMAPE
0759.66832132218.61991460.21180.97640.08310.0603
1714.64171822381.89071349.95630.97970.07860.0585
2661.26541581394.64891257.53510.98350.07280.0556
3683.13031682595.17951297.14890.98080.08070.0591
4767.75432309319.51221519.64450.97800.08150.0603
5763.73092902995.46641703.81790.97300.08360.0584
6816.73073415365.49631848.07070.96510.08350.0623
7756.73781839285.84661356.20270.97910.07880.0603
8811.26723558615.44631886.42930.97420.07750.0565
9905.13623000885.86971732.30650.97270.08950.0654
Mean764.00632424505.79761541.13240.97620.08100.0597
SD66.7461699583.9498222.29880.00500.00430.0027

Смешать top3 модели из compare_models

blender_top3 = blend_models(top3)
MAEMSERMSER2RMSLEMAPE
0734.26692043695.98621429.57900.97730.07730.0565
1655.89041478725.09341216.02840.98350.07450.0554
2594.76921168516.20831080.97930.98780.06470.0495
3634.09271598891.35721264.47280.98180.07260.0537
4746.52192254298.82381501.43230.97850.07740.0574
5734.46144301027.35172073.89180.96000.08070.0534
6775.21733142146.76451772.61020.96790.07800.0589
7674.70231910831.35381382.32820.97820.07140.0533
8748.39043262498.63041806.23880.97630.07230.0527
9786.74172193914.39791481.18680.98000.08180.0599
Mean708.50542335454.59671500.87480.97720.07510.0551
SD61.0975911259.7364287.80130.00750.00480.0030

Стекинг

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

Давайте посмотрим на пример ниже, используя 3 лучшие модели, которые мы получили от compare_models:

stacker = stack_models(top3)
MAEMSERMSER2RMSLEMAPE
0749.27352477903.81191574.13590.97250.07730.0562
1672.01191519861.57851232.82670.98310.07380.0551
2544.4354901520.6786949.48440.99060.06210.0475
3627.95701567507.03351252.00120.98210.07330.0536
4697.09661855400.69501362.13090.98230.07510.0551
5790.55019040776.97653006.78850.91590.08110.0542
6792.52274078100.16262019.43070.95840.07810.0584
7692.08291814004.96741346.85000.97930.07180.0538
8751.32952529593.22681590.46950.98170.07080.0532
9792.96742120838.35121456.30980.98070.08140.0600
Mean711.02272790550.74821579.04280.97270.07450.0547
SD77.13322232589.1205545.13730.02060.00540.0032

По умолчанию метамодель (окончательная модель для создания прогнозов) — это
линейная регрессия. Метамодель можно изменить с помощью параметра meta_model

xgboost = create_model('xgboost')
stacker2 = stack_models(top3, meta_model = xgboost)


MAEMSERMSER2RMSLEMAPE
0784.24912638421.75001624.32190.97080.08050.0608
1696.57872029539.87501424.61930.97740.08000.0588
2674.77891903072.50001379.51890.98020.07050.0544
3704.54212075759.87501440.74980.97630.08180.0588
4808.84192507697.00001583.57090.97610.08570.0630
5755.64372677102.00001636.18520.97510.08280.0570
6848.23633646974.75001909.70540.96280.08540.0650
7744.34141740071.12501319.11760.98020.07810.0597
8846.43214877697.50002208.55100.96460.07960.0585
9827.15072557633.75001599.26040.97670.08310.0622
Mean769.07952665397.01251612.56000.97400.08080.0598
SD60.4477899136.7027255.04340.00580.00410.0029


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

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