Новое соревновании на Kaggle, на этот раз регрессия : Regression with an Insurance Dataset (Регрессия с набором страховых данных) . Цель этого набора данных — облегчить разработку и тестирование регрессионных моделей для прогнозирования страховых премий на основе различных характеристик клиентов и деталей полиса. Страховые компании часто полагаются на основанные на данных подходы для оценки премий, принимая во внимание такие факторы, как возраст, доход, состояние здоровья и история претензий. Этот синтетический набор данных имитирует реальные сценарии, чтобы помочь практикующим специалистам практиковать проектирование признаков, очистку данных и обучение моделей. Решение будем сопровождать материалами, взятыми из курса на платформе Stepik DS Глеба Михайлова.
Используемые библиотеки :
pd.DataFrame.iteritems = pd.DataFrame.items
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
from sklearn.metrics import root_mean_squared_log_error
from sklearn.model_selection import KFold,cross_val_score, RepeatedStratifiedKFold,StratifiedKFold
from catboost import Pool
from catboost import cv
from catboost import CatBoostRegressor
import seaborn as sns
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
id | 0 | 1 | 2 | 3 | 4 |
Age | 19.0 | 39.0 | 23.0 | 21.0 | 21.0 |
Gender | Female | Female | Male | Male | Male |
Annual Income | 10049.0 | 31678.0 | 25602.0 | 141855.0 | 39651.0 |
Marital Status | Married | Divorced | Divorced | Married | Single |
Number of Dependents | 1.0 | 3.0 | 3.0 | 2.0 | 1.0 |
Education Level | Bachelor's | Master's | High School | Bachelor's | Bachelor's |
Occupation | Self-Employed | NaN | Self-Employed | NaN | Self-Employed |
Health Score | 22.598761 | 15.569731 | 47.177549 | 10.938144 | 20.376094 |
Location | Urban | Rural | Suburban | Rural | Rural |
Policy Type | Premium | Comprehensive | Premium | Basic | Premium |
Previous Claims | 2.0 | 1.0 | 1.0 | 1.0 | 0.0 |
Vehicle Age | 17.0 | 12.0 | 14.0 | 0.0 | 8.0 |
Credit Score | 372.0 | 694.0 | NaN | 367.0 | 598.0 |
Insurance Duration | 5.0 | 2.0 | 3.0 | 1.0 | 4.0 |
Policy Start Date | 2023-12-23 15:21:39.134960 | 2023-06-12 15:21:39.111551 | 2023-09-30 15:21:39.221386 | 2024-06-12 15:21:39.226954 | 2021-12-01 15:21:39.252145 |
Customer Feedback | Poor | Average | Good | Poor | Poor |
Smoking Status | No | Yes | Yes | Yes | Yes |
Exercise Frequency | Weekly | Monthly | Weekly | Daily | Weekly |
Property Type | House | House | House | Apartment | House |
Premium Amount | 2869.0 | 1483.0 | 567.0 | 765.0 | 2022.0 |
features : ['Age', 'Gender', 'Annual Income', 'Marital Status', 'Number of Dependents', 'Education Level', 'Occupation', 'Health Score', 'Location', 'Policy Type', 'Previous Claims', 'Vehicle Age', 'Credit Score', 'Insurance Duration', 'Policy Start Date', 'Customer Feedback', 'Smoking Status', 'Exercise Frequency', 'Property Type'] cat_features : ['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location', 'Policy Type', 'Customer Feedback', 'Smoking Status', 'Exercise Frequency', 'Property Type'] num_features : ['Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Previous Claims', 'Vehicle Age', 'Credit Score', 'Insurance Duration', 'Policy Start Date'] targets : ['Premium Amount']
Анализ начнем с вывода основных показателей по признакам для обучающих
данных
unique_info(df[X_col])
Column | Type | Unique Values | Total Unique Values | Total Null Values | |
---|---|---|---|---|---|
15 | Customer Feedback | object | [Poor, Average, Good, nan] | 4 | 77824 |
5 | Education Level | object | [Bachelor's, Master's, High School, PhD] | 4 | 0 |
17 | Exercise Frequency | object | [Weekly, Monthly, Daily, Rarely] | 4 | 0 |
1 | Gender | object | [Female, Male] | 2 | 0 |
8 | Location | object | [Urban, Rural, Suburban] | 3 | 0 |
3 | Marital Status | object | [Married, Divorced, Single, nan] | 4 | 18529 |
6 | Occupation | object | [Self-Employed, nan, Employed, Unemployed] | 4 | 358075 |
9 | Policy Type | object | [Premium, Comprehensive, Basic] | 3 | 0 |
18 | Property Type | object | [House, Apartment, Condo] | 3 | 0 |
16 | Smoking Status | object | [No, Yes] | 2 | 0 |
14 | Policy Start Date | datetime64[ns] | [2023-12-23 00:00:00, 2023-12-06 00:00:00, 202... | 1826 | 0 |
0 | Age | float64 | [19.0, 39.0, 23.0, 21.0, 29.0, 41.0, 48.0, 44.... | 48 | 18705 |
2 | Annual Income | float64 | [10049.0, 31678.0, 25602.0, 141855.0, 39651.0,... | 88594 | 44949 |
12 | Credit Score | float64 | [372.0, 694.0, nan, 367.0, 598.0, 614.0, 807.0... | 551 | 137882 |
7 | Health Score | float64 | [22.59876067181393, 15.569730989408043, 47.177... | 532658 | 74076 |
13 | Insurance Duration | float64 | [5.0, 2.0, 3.0, 1.0, 4.0, 6.0, 8.0, 9.0, ...] | 10 | 1 |
4 | Number of Dependents | float64 | [1.0, 3.0, 2.0, 0.0, 4.0, nan] | 6 | 109672 |
10 | Previous Claims | float64 | [2.0, 1.0, 0.0, nan, 3.0, 4.0, 5.0, 6.0, ...] | 11 | 364029 |
11 | Vehicle Age | float64 | [17.0, 12.0, 14.0, 0.0, 8.0, 4.0, 11.0, 10.0, ... | 21 | 6 |
l2_leaf_reg
– коэффициент при члене регуляризации L2 функции потерь. Значение по умолчанию – 3.0.0: learn: 6.5065386 test: 6.5045289 best: 6.5045289 (0) total: 3.3s remaining: 54m 55s
100: learn: 1.1314390 test: 1.1320231 best: 1.1320231 (100) total: 2m 52s remaining: 25m 36s
200: learn: 1.0561386 test: 1.0575642 best: 1.0575642 (200) total: 5m 47s remaining: 23m
300: learn: 1.0511825 test: 1.0527305 best: 1.0527305 (300) total: 9m 8s remaining: 21m 13s
400: learn: 1.0498835 test: 1.0514877 best: 1.0514877 (400) total: 12m 23s remaining: 18m 30s
500: learn: 1.0489920 test: 1.0506551 best: 1.0506551 (500) total: 15m 40s remaining: 15m 36s
600: learn: 1.0483485 test: 1.0500931 best: 1.0500931 (600) total: 18m 58s remaining: 12m 35s
700: learn: 1.0480250 test: 1.0498568 best: 1.0498568 (700) total: 22m 3s remaining: 9m 24s
800: learn: 1.0478400 test: 1.0497555 best: 1.0497554 (799) total: 25m 14s remaining: 6m 16s
900: learn: 1.0477276 test: 1.0497101 best: 1.0497101 (900) total: 28m 27s remaining: 3m 7s
999: learn: 1.0476207 test: 1.0496546 best: 1.0496545 (997) total: 31m 36s remaining: 0us
bestTest = 1.049654503
bestIteration = 997
Shrink model to first 998 iterations
Лучшая итерация была 997 и модель была сокращена до первых 998 итераций. Это не
очень хорошо, похоже если бы она сделала больше итераций, то результат был лучше, так как по умолчанию установлено 1000 итераций. Разработчики catboost рекомендуют, чтоб точка переобучения была ближе к концу 1000 итераций, здесь это условие
выполнено, но все же есть предположение, что за 1000 итераций модель не раскрыла
своих возможностей.
MAE : 622.321
MAPE : 1.84804
RMSLE : 1.04768
Делаем предсказание на тестовом файле соревнования и отправляем решение
df_test['Premium Amount'] = model.predict(df_test[X_col])
df_subm=df_test[['id','Premium Amount']]
0: learn: 6.5060477 total: 3.73s remaining: 1h 2m 4s 50: learn: 1.8686363 total: 1m 46s remaining: 32m 58s 100: learn: 1.1306477 total: 3m 33s remaining: 31m 42s 150: learn: 1.0645019 total: 5m 13s remaining: 29m 23s 200: learn: 1.0554422 total: 6m 51s remaining: 27m 15s 250: learn: 1.0523733 total: 8m 31s remaining: 25m 26s 300: learn: 1.0509933 total: 10m 22s remaining: 24m 5s 350: learn: 1.0503251 total: 12m 17s remaining: 22m 42s 400: learn: 1.0497968 total: 14m 9s remaining: 21m 9s 450: learn: 1.0494200 total: 16m 8s remaining: 19m 39s 500: learn: 1.0490556 total: 17m 57s remaining: 17m 53s 550: learn: 1.0487775 total: 19m 57s remaining: 16m 16s 600: learn: 1.0485508 total: 22m 4s remaining: 14m 39s 650: learn: 1.0484500 total: 23m 46s remaining: 12m 44s 700: learn: 1.0483725 total: 25m 18s remaining: 10m 47s 750: learn: 1.0482868 total: 26m 50s remaining: 8m 53s 800: learn: 1.0482302 total: 28m 24s remaining: 7m 3s 850: learn: 1.0481883 total: 29m 51s remaining: 5m 13s 900: learn: 1.0481479 total: 31m 19s remaining: 3m 26s 950: learn: 1.0481167 total: 32m 46s remaining: 1m 41s 999: learn: 1.0480925 total: 34m 10s remaining: 0us
Смотри ошибку на тестовой части, результат немного лучше
error(test['Premium Amount'],model.predict(test[X_col]))
MAE : 622.336
MAPE : 1.84817
RMSLE : 1.04761Посмотрим на три важных параметра полученной модели :
keys = ['learning_rate', 'l2_leaf_reg', 'depth']
{key:value for key, value in model.get_all_params().items() if key in keys}
{'l2_leaf_reg': 3, 'depth': 6, 'learning_rate': 0.029999999329447743}learning_rate является критическим гиперпараметром в алгоритмах градиентного
бустинга, включая CatBoost, поскольку он контролирует размер шага, принимаемого во
время каждой итерации процесса обучения. Этот размер шага влияет на то, насколько
быстро или медленно модель сходится к оптимальному решению, минимизируя при
этом функцию потерь. Более низкая скорость обучения подразумевает меньшие шаги,
что может привести к более точной сходимости и лучшей производительности. Однако
это также замедляет процесс обучения, поскольку алгоритм делает меньшие шаги для
поиска оптимального решения. Выбор подходящей скорости обучения имеет важное
значение, поскольку слишком высокая скорость обучения может привести к тому, что
модель превысит минимум функции потерь и не сможет сойтись, в то время как
слишком низкая скорость обучения может привести к чрезвычайно медленному
обучению или застреванию в неоптимальных решениях. Обычной практикой является
экспериментирование с различными скоростями обучения и мониторинг процесса
обучения с использованием таких методов, как графики скорости обучения или ранняя
остановка, чтобы найти правильный баланс между скоростью обучения и качеством
сходимости.
Параметр l2_leaf_reg в CatBoost отвечает за управление регуляризацией L2,
применяемой специально к значениям листьев деревьев решений в ансамбле.
Регуляризация — это важнейший метод, используемый в машинном обучении для
предотвращения переобучения, которое происходит, когда модель слишком точно
соответствует обучающим данным и улавливает шум, а не общие закономерности. В контексте CatBoost регуляризация L2 для значений листьев добавляет штрафной
член к функции потерь во время обучения. Этот штрафной член пропорционален
сложности отдельных деревьев. Увеличивая значение l2_leaf_reg, вы применяете
более сильную регуляризацию к значениям листьев, эффективно препятствуя тому,
чтобы деревья становились слишком сложными. При установке более высокого
значения l2_leaf_reg вы вводите более сильный эффект регуляризации, который может помочь предотвратить слишком точную подгонку модели к обучающим данным. Это
может быть особенно полезно при работе с шумными или небольшими наборами
данных, поскольку снижает риск того, что модель запомнит шум и выдаст плохое
обобщение для новых, невиданных данных. Однако при настройке этого параметра
важно соблюдать баланс. Хотя более сильная регуляризация может предотвратить
переобучение, слишком высокая настройка может привести к недообучению, когда
модель становится слишком простой для захвата важных закономерностей в данных.
Поэтому рекомендуется экспериментировать с различными значениями l2_leaf_reg и
использовать такие методы, как перекрестная проверка, чтобы найти оптимальную
силу регуляризации для вашего конкретного набора данных и проблемы. Параметр depth в алгоритмах градиентного бустинга , включая CatBoost, играет
решающую роль в управлении сложностью отдельных деревьев решений в ансамбле.
Он определяет максимальную глубину, до которой может вырасти каждое дерево в
процессе обучения. Более глубокое дерево может захватывать более сложные и
подробные закономерности в обучающих данных, что потенциально приводит к
лучшему соответствию. Однако это также увеличивает риск переобучения , когда
модель становится слишком специализированной для обучающих данных и плохо
работает на невидимых данных. При установке параметра depth необходимо найти
баланс между сложностью модели и обобщением. Если установить его слишком
высоким, модель может подгонять шум в данных, что делает ее менее эффективной для прогнозирования новых данных. И наоборот, если установить его слишком низким,
модель может не улавливать существенные закономерности, что приведет к
недообучению. Поэтому важно экспериментировать с различными значениями depth в
зависимости от сложности вашего набора данных и использовать такие методы, как
перекрестная проверка, чтобы найти оптимальную глубину, которая обеспечивает
наилучший компромисс между сложностью модели и производительностью обобщения.
Для подбора наилучших параметров у catboost есть метод grid_search(), которыйпроводит подбор параметров по сетке. На вход он принимает словарь имен параметров и список значений, которые можно попробовать для этих параметров. Зададим сетку нарассмотренные выше три параметра :grid = {'learning_rate': [0.02,0.06,0.1,0.15,0.2],'l2_leaf_reg' : [0.5,0.7,1.0,2.0,3.0],'depth': [4,6,8]}Словарь для остальных параметров, которые мы хотим определить :
{'depth': 8, 'learning_rate': 0.15, 'l2_leaf_reg': 0.7}
Посмотрим, что получится с этими параметрами
params = {'early_stopping_rounds':100,
'cat_features': cat_col,
'depth':8,
'learning_rate':0.15,
'l2_leaf_reg' : 0.7,
'verbose':50,
'random_seed':42,
}
model =
CatBoostRegressor(**params,loss_function=RMSLE(),eval_metric=RMSLE_val())
model.fit(train_full_data)
0: learn: 6.0067798 total: 3.53s remaining: 58m 49s 50: learn: 1.0502394 total: 2m 7s remaining: 39m 24s 100: learn: 1.0479063 total: 4m 6s remaining: 36m 29s 150: learn: 1.0471068 total: 6m 26s remaining: 36m 14s 200: learn: 1.0467471 total: 8m 27s remaining: 33m 37s 250: learn: 1.0464866 total: 10m 48s remaining: 32m 15s 300: learn: 1.0462733 total: 12m 56s remaining: 30m 2s 350: learn: 1.0460835 total: 15m 5s remaining: 27m 53s 400: learn: 1.0459466 total: 17m 17s remaining: 25m 49s 450: learn: 1.0457939 total: 19m 22s remaining: 23m 35s 500: learn: 1.0456488 total: 21m 39s remaining: 21m 34s 550: learn: 1.0455704 total: 23m 39s remaining: 19m 16s 600: learn: 1.0454906 total: 25m 41s remaining: 17m 3s 650: learn: 1.0454199 total: 27m 38s remaining: 14m 49s 700: learn: 1.0453671 total: 29m 29s remaining: 12m 34s 750: learn: 1.0453110 total: 31m 22s remaining: 10m 24s 800: learn: 1.0452567 total: 33m 16s remaining: 8m 15s 850: learn: 1.0451560 total: 35m 11s remaining: 6m 9s 900: learn: 1.0450988 total: 37m 6s remaining: 4m 4s 950: learn: 1.0450609 total: 38m 55s remaining: 2m 999: learn: 1.0450187 total: 40m 42s remaining: 0userror(test['Premium Amount'],model.predict(test[X_col]))
MAE : 621.405
MAPE : 1.84741
RMSLE : 1.04633Делаем предсказание на тестовом файле соревнования и отправляем решение
df_test['Premium Amount'] = model.predict(df_test[X_col]) df_subm=df_test[['id','Premium Amount']]
В результате получаем оценку 1.04621 и 249 место из 1113 или78-й процентиль.CatBoost также позволяет нам выполнять рандомизированный поиск, которыйвыполняется быстрее по сравнению с поиском по сетке, при котором проверяетсятолько несколько настроек параметров, а не все возможные комбинации. Мы можемвыполнить рандомизированный поиск, используя randomized_search() оценщикаCatBoost. Метод randomized_search() имеет тот же API, что и методgrid_search(), с одним дополнительным параметром с именем n_iter, который принимает целочисленныезначения, указывающие, сколько случайных комбинаций параметров нужнопопробовать. Значение этого параметра по умолчанию — 10.Зададим параметры для поиска и запустим его
grid = {'learning_rate': [0.2,0.25,0.3], 'l2_leaf_reg' : [0.3,0.7,1.0], 'depth': [6,10,12]}
params = {'cat_features': cat_col, 'verbose':10, 'iterations':100, 'random_seed':42, }
model = CatBoostRegressor(**params,loss_function=RMSLE(),eval_metric=RMSLE_val())
result = model.randomized_search(grid, train_full_data)
Смотрим на результат
print("\nBest Params : ", result['params'])
Best Params : {'depth': 10, 'learning_rate': 0.25, 'l2_leaf_reg': 0.3}Запускаем модель с этими параметрами в надежде на улучшения качества решения и
рейтинга в соревновании
params = {'early_stopping_rounds':50, 'cat_features': cat_col, 'depth':10, 'iterations':500, 'learning_rate':0.25, 'l2_leaf_reg' : 0.3, 'verbose':10, 'random_seed':42, }
model = CatBoostRegressor(**params,loss_function=RMSLE(),eval_metric=RMSLE_val())
model.fit(train_data,eval_set=valid_data)
0: learn: 5.7259544 test: 5.7240037 best: 5.7240037 (0) total: 3.47s remaining: 28m 50s 10: learn: 1.2628374 test: 1.2630776 best: 1.2630776 (10) total: 33s remaining: 24m 24s 20: learn: 1.0532680 test: 1.0554178 best: 1.0554178 (20) total: 1m remaining: 22m 52s 30: learn: 1.0485469 test: 1.0510100 best: 1.0510100 (30) total: 1m 27s remaining: 22m 9s 40: learn: 1.0474204 test: 1.0503480 best: 1.0503433 (39) total: 1m 58s remaining: 22m 1s 50: learn: 1.0468751 test: 1.0500678 best: 1.0500678 (50) total: 2m 27s remaining: 21m 37s 60: learn: 1.0460021 test: 1.0496293 best: 1.0496293 (60) total: 2m 55s remaining: 21m 4s 70: learn: 1.0453013 test: 1.0493935 best: 1.0493935 (70) total: 3m 23s remaining: 20m 32s 80: learn: 1.0447310 test: 1.0492524 best: 1.0492494 (79) total: 3m 52s remaining: 20m 2s 90: learn: 1.0443149 test: 1.0492188 best: 1.0492188 (90) total: 4m 23s remaining: 19m 43s 100: learn: 1.0439379 test: 1.0491947 best: 1.0491947 (100) total: 4m 51s remaining: 19m 13s 110: learn: 1.0435994 test: 1.0491889 best: 1.0491769 (105) total: 5m 25s remaining: 19m 120: learn: 1.0434328 test: 1.0491914 best: 1.0491769 (105) total: 5m 57s remaining: 18m 39s 130: learn: 1.0432775 test: 1.0491671 best: 1.0491539 (125) total: 6m 30s remaining: 18m 18s 140: learn: 1.0430363 test: 1.0491940 best: 1.0491539 (125) total: 7m 4s remaining: 18m 150: learn: 1.0428301 test: 1.0491976 best: 1.0491539 (125) total: 7m 39s remaining: 17m 41s 160: learn: 1.0426873 test: 1.0492232 best: 1.0491539 (125) total: 8m 13s remaining: 17m 18s 170: learn: 1.0425263 test: 1.0492235 best: 1.0491539 (125) total: 8m 46s remaining: 16m 52s 180: learn: 1.0422626 test: 1.0491364 best: 1.0491355 (179) total: 9m 20s remaining: 16m 28s 190: learn: 1.0421010 test: 1.0491389 best: 1.0491355 (179) total: 9m 55s remaining: 16m 3s 200: learn: 1.0419586 test: 1.0491536 best: 1.0491332 (194) total: 10m 33s remaining: 15m 41s 210: learn: 1.0417650 test: 1.0491869 best: 1.0491332 (194) total: 11m 7s remaining: 15m 14s 220: learn: 1.0415442 test: 1.0491838 best: 1.0491332 (194) total: 11m 42s remaining: 14m 47s 230: learn: 1.0414296 test: 1.0491898 best: 1.0491332 (194) total: 12m 13s remaining: 14m 14s 240: learn: 1.0412738 test: 1.0492099 best: 1.0491332 (194) total: 12m 46s remaining: 13m 44s Stopped by overfitting detector (50 iterations wait) bestTest = 1.049133227 bestIteration = 194 Shrink model to first 195 iterations.
Смотрим на ошибку
error(test['Premium Amount'],model.predict(test[X_col]))
MAE : 621.644 MAPE : 1.85157 RMSLE : 1.04696Как видим, ожидаемого чуда не произошло, полученное RMSLE хуже, чем в
предыдущем варианте и рассчитывать на более высокий рейтинг не приходиться.Теперь попробуем кросс-валидацию.
Параметры
params = {'early_stopping_rounds':100, 'cat_features': cat_col, 'depth':8, 'loss_function':RMSLE(), 'eval_metric':RMSLE_val(), 'learning_rate':0.15, 'l2_leaf_reg' : 0.7, 'verbose':50, 'random_seed':42, }
Кросс-валидация от catboost
cv_data = cv( params = params, pool = train_full_data, fold_count=5, shuffle=True, partition_random_seed=0, stratified=False, verbose=False )
Training on fold [0/5] bestTest = 1.046859711 bestIteration = 455 Training on fold [1/5] bestTest = 1.044641777 bestIteration = 626 Training on fold [2/5] bestTest = 1.050165155 bestIteration = 844 Training on fold [3/5] bestTest = 1.047578411 bestIteration = 579 Training on fold [4/5] bestTest = 1.047993662 bestIteration = 995
Будем обучать пять моделей, потому что в настройках выбрали пять фолдов. Качество
будет хранится в cv_data, это датафрейм, в котором хранится информация по каждой
итерации и рассчитываются средние метрики на трейне и тесте со стандартным
отклонением. И мы можем найти итерацию на которой получилось максимальное
качество.
cv_data
iterations | test-RMSLE_val-mean | test-RMSLE_val-std | train-RMSLE_val-mean | train-RMSLE_val-std | |
---|---|---|---|---|---|
0 | 0 | 6.006636 | 0.002291 | 6.006635 | 0.000512 |
1 | 1 | 5.384294 | 0.002297 | 5.384282 | 0.000459 |
2 | 2 | 4.815481 | 0.002294 | 4.815472 | 0.000406 |
3 | 3 | 4.298630 | 0.002280 | 4.298624 | 0.000352 |
4 | 4 | 3.831932 | 0.002252 | 3.831925 | 0.000303 |
... | ... | ... | ... | ... | ... |
995 | 995 | 1.047459 | 0.001991 | 1.044665 | 0.000760 |
996 | 996 | 1.047459 | 0.001991 | 1.044665 | 0.000760 |
997 | 997 | 1.047459 | 0.001991 | 1.044665 | 0.000760 |
998 | 998 | 1.047459 | 0.001991 | 1.044664 | 0.000760 |
999 | 999 | 1.047459 | 0.001991 | 1.044664 | 0.000760 |
1000 rows × 5 columns
n_iters =
cv_data[cv_data['test-RMSLE_val-mean'] ==
cv_data['test-RMSLE_val-mean'].min()]['iterations'].values[0]
n_iters
995Теперь запустим нашу модель задав найденное количество итераций
params = {'iterations':n_iters,
'cat_features': cat_col,
'depth':8,
'learning_rate':0.15,
'l2_leaf_reg' : 0.7,
'verbose':50,
'random_seed':42,
}
model
= CatBoostRegressor(**params,loss_function=RMSLE(),eval_metric=RMSLE_val())
model.fit(train_full_data)
0: learn: 6.0067798 total: 3.67s remaining: 1h 52s
50: learn: 1.0502394 total: 2m 25s remaining: 45m 2s
100: learn: 1.0479063 total: 4m 53s remaining: 43m 21s
150: learn: 1.0471068 total: 7m 13s remaining: 40m 22s
200: learn: 1.0467471 total: 9m 28s remaining: 37m 24s
250: learn: 1.0464866 total: 11m 43s remaining: 34m 45s
300: learn: 1.0462733 total: 14m 3s remaining: 32m 24s
350: learn: 1.0460835 total: 16m 8s remaining: 29m 37s
400: learn: 1.0459466 total: 18m 16s remaining: 27m 3s
450: learn: 1.0457939 total: 20m 30s remaining: 24m 44s
500: learn: 1.0456488 total: 22m 37s remaining: 22m 18s
550: learn: 1.0455704 total: 24m 33s remaining: 19m 47s
600: learn: 1.0454906 total: 26m 29s remaining: 17m 22s
650: learn: 1.0454199 total: 28m 30s remaining: 15m 3s
700: learn: 1.0453671 total: 30m 27s remaining: 12m 46s
750: learn: 1.0453110 total: 32m 20s remaining: 10m 30s
800: learn: 1.0452567 total: 34m 12s remaining: 8m 17s
850: learn: 1.0451560 total: 36m 6s remaining: 6m 6s
900: learn: 1.0450988 total: 37m 57s remaining: 3m 57s
950: learn: 1.0450609 total: 39m 43s remaining: 1m 50s
994: learn: 1.0450269 total: 41m 16s remaining: 0us
error(test['Premium Amount'],model.predict(test[X_col]))
MAE : 621.407 MAPE : 1.84738 RMSLE : 1.04633Ничего удивительного не произошло, получили тот же самый результат, который
до сих пор остается лучшим. Но мы получили его не просто так, а используя
кросс-валидацию на пяти моделях и потому более уверенны в его неслучайности.
Комментариев нет:
Отправить комментарий