рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдБ

Python рдореЗрдВ XGBoost рдХрд╛ рдЙрдкрдпреЛрдЧ: рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓

Python рдореЗрдВ рдЗрд╕ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде XGBoost рдХреА рд╢рдХреНрддрд┐ рдЬрд╛рдиреЗрдВтАФрдЬреЛ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
┬╖ 12 рдорд┐ре░ рдкрдврд╝реЗрдВ

AI рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ

XGBoost рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред Kaggle рдХреА State of Data Science Survey 2021 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд▓рдЧрднрдЧ 50% рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╡реЗ XGBoost рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВтАФрдЬреЛ рдХреЗрд╡рд▓ TensorFlow рдФрд░ Sklearn рдХреЗ рдмрд╛рдж рдЖрддрд╛ рд╣реИред

State of Data Science Survey Kaggle

https://www.kaggle.com/kaggle-survey-2021

рдпрд╣ XGBoost рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЗрд╕ рд▓реЛрдХрдкреНрд░рд┐рдп Python рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдЧрд╛ рдФрд░ рдпрд╣ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдХреЛрд░реНрд╕ рдХреЗ рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ Python рдореЗрдВ XGBoost рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рд╡ рд╕реАрдЦреЗрдВред

рдЗрд╕ Python XGBoost рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реАрдЦреЗрдВрдЧреЗ

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо XGBoost рдХреЗ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди
  • XGBoost DMatrix рдХреНрд▓рд╛рд╕
  • XGBoost рд░рд┐рдЧреНрд░реЗрд╢рди
  • XGBoost рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдФрд░ рд▓реЙрд╕ рдлрдВрдХреНрд╢рдВрд╕
  • рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рд▓реВрдкреНрд╕ рдмрдирд╛рдирд╛
  • XGBoost рдореЗрдВ рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди
  • XGBoost рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдмрдирд╛рдирд╛
  • XGBoost рдХреЗ Sklearn рдФрд░ рдиреЗрдЯрд┐рд╡ APIs рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдХреЛрдб рдСрдирд▓рд╛рдЗрди рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдХреЛрдб рдЪрд▓рд╛рдПрдВ

XGBoost рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди

рдЖрдк XGBoost рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд░рд╣ pip рдХреЗ рдЬрд░рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╡рд┐рдзрд┐ рдЖрдкрдХреА рдорд╢реАрди рдХреЗ NVIDIA GPU рдХреЗ рд▓рд┐рдП рднреА рд╕рдкреЛрд░реНрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧреАред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ CPU рд╕рдВрд╕реНрдХрд░рдг рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк conda-forge рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ pip install --user xgboost

# CPU only

$ conda install -c conda-forge py-xgboost-cpu

# Use NVIDIA GPU

$ conda install -c conda-forge py-xgboost-gpu

рдЕрдкрдиреЗ рдмреЗрд╕ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП XGBoost рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред

рд╣рдо рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ GPU-рд╕рдХреНрд╖рдо рдорд╢реАрди рдкрд░ рдЪрд▓рд╛рдПрдБред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк DataLab рдпрд╛ Google Colab рдЬреИрд╕реЗ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк Colab рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдореЗрдВ XGBoost рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ pip install --upgrade xgboost рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛

рд╣рдо рдкреВрд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ Diamonds рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрд╣ Seaborn рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рд╣реИ, рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдк рдЗрд╕реЗ Kaggle рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдФрд░ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдлреАрдЪрд░реНрд╕ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ рдФрд░ 50k рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬрд░реНрд╡реЗрд╢рдВрд╕ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рд╣рдо XGBoost рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

import seaborn as sns

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import warnings


warnings.filterwarnings("ignore")


diamonds = sns.load_dataset("diamonds")

diamonds.head()

Diamonds рдбреЗрдЯрд╛рд╕реЗрдЯ: 9 рдлреАрдЪрд░реНрд╕ рдФрд░ рдПрдХ рдЯрд╛рд░рдЧреЗрдЯ

>>> diamonds.shape
(53940, 10)

рдХрд┐рд╕реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЖрдк рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдлреАрдЪрд░реНрд╕ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рджреЗрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ Seaborn рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдЖрддрд╛ рд╣реИ, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╛рдл рд╣реИред

рддреЛ, рд╣рдо рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдФрд░ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдлреАрдЪрд░реНрд╕ рдХреЗ 5-рд╕рдВрдЦреНрдпрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдЖрдк рдХреБрдЫ рд╕рдордп рдирд┐рдХрд╛рд▓рдХрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

diamonds.describe()

5-рд╕рдВрдЦреНрдпрд╛ рд╕рд╛рд░рд╛рдВрд╢

diamonds.describe(exclude=np.number)

5-рд╕рдВрдЦреНрдпрд╛ рд╕рд╛рд░рд╛рдВрд╢ 2

XGBoost DMatrix рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рдПрдХреНрд╕рдкреНрд▓реЛрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлреНрд░реЗрдо рдХрд░рдирд╛ рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлреАрдЪрд░ рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдПрд░реЗрдЬрд╝ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдЙрдирдХреЗ рднреМрддрд┐рдХ рдорд╛рдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд╛рдпрдордВрдб рдХреА рдХреАрдорддреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЯрд╛рд░рдЧреЗрдЯ price рдХреЙрд▓рдо рд╣реЛрдЧрд╛ред

рддреЛ, рд╣рдо рдлреАрдЪрд░реНрд╕ рдХреЛ X рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдХреЛ y рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

from sklearn.model_selection import train_test_split

# Extract feature and target arrays
X, y = diamonds.drop('price', axis=1), diamonds[['price']]

рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рддреАрди рд╢реНрд░реЗрдгреАрдмрджреНрдз рдХреЙрд▓рдо рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдСрд░реНрдбрд┐рдирд▓ рдпрд╛ рд╡рди-рд╣реЙрдЯ рдПрдирдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдПрдирдХреЛрдб рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди XGBoost рдореЗрдВ рдХреИрдЯреЗрдЧреЙрд░рд┐рдХрд▓реНрд╕ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рдлреАрдЪрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрдЯреЗрдЧреЙрд░рд┐рдХрд▓ рдХреЙрд▓рдореНрд╕ рдХреЛ Pandas рдХреЗ category рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк рдореЗрдВ рдХрд╛рд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ):

# Extract text features
cats = X.select_dtypes(exclude=np.number).columns.tolist()

# Convert to Pandas category
for col in cats:
   X[col] = X[col].astype('category')

рдЕрдм, рдЬрдм рдЖрдк dtypes рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди category рдлреАрдЪрд░реНрд╕ рд╣реИрдВ:

>>> X.dtypes
carat       float64
cut        category
color      category
clarity    category
depth       float64
table       float64
x           float64
y           float64
z           float64
dtype: object

рдЖрдЗрдП рдбреЗрдЯрд╛ рдХреЛ train рдФрд░ test рд╕реЗрдЯреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (0.25 рдЯреЗрд╕реНрдЯ рд╕рд╛рдЗрдЬ):

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

рдЕрдм, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛: XGBoost рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DMatrix рдирд╛рдордХ рдПрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рдпрд╣ рдореЗрдореЛрд░реА рдФрд░ рд╕реНрдкреАрдб рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХреНрд▓рд╛рд╕ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдиреЗрдЯрд┐рд╡ XGBoost API рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рд╕реЗрдЯреНрд╕ рдХреЛ рдЗрд╕ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

import xgboost as xgb

# Create regression matrices
dtrain_reg = xgb.DMatrix(X_train, y_train, enable_categorical=True)
dtest_reg = xgb.DMatrix(X_test, y_test, enable_categorical=True)

рдпрд╣ рдХреНрд▓рд╛рд╕ рдЯреНрд░реЗрдирд┐рдВрдЧ рдлреАрдЪрд░реНрд╕ рдФрд░ рд▓реЗрдмрд▓реНрд╕ рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред Pandas рдХреА category рдХреЙрд▓рдореНрд╕ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдирдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо enable_categorical рдХреЛ True рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдиреЛрдЯ:

рд╣рдо XGBoost рдХреЗ Scikit-learn API рдХреА рдмрдЬрд╛рдп рдиреЗрдЯрд┐рд╡ API рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рд╢реБрд░реБрдЖрдд рдореЗрдВ Sklearn API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдЪрд▓рдХрд░ рдЖрдкрдХреЛ рдЕрд╣рд╕рд╛рд╕ рд╣реЛрдЧрд╛ рдХрд┐ XGBoost рдХреЗ рдиреЗрдЯрд┐рд╡ API рдореЗрдВ рдХреБрдЫ рдмреЗрд╣рддрд░реАрди рдлреАрдЪрд░реНрд╕ рд╣реИрдВ рдЬреЛ Sklearn API рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рд▓рд┐рдП рд╢реБрд░реВ рд╕реЗ рд╣реА рдЗрд╕рдХреА рдЖрджрдд рдбрд╛рд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕реЗрдХреНрд╢рди рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдореЙрдбрд▓ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдПрдХ рд╣реА рд▓рд╛рдЗрди рдХреЗ рдХреЛрдб рд╕реЗ APIs рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Python XGBoost рд░рд┐рдЧреНрд░реЗрд╢рди

DMatrices рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ objective рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ XGBoost рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреМрди рд╕реА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рд▓реЙрд╕ рдлрдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдпрдордВрдб рдХреА рдХреАрдорддреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдПрдХ рд░рд┐рдЧреНрд░реЗрд╢рди рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдЖрдо reg:squarederror рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдХреЗ рдирд╛рдо рдореЗрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рднреА рд╣реЛрддрд╛ рд╣реИред рд░рд┐рдЧреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, Root Mean Squared Error рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рддрд╛ рд╣реИред NumPy рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧреА:

import numpy as np

mse = np.mean((actual - predicted) ** 2)
rmse = np.sqrt(mse)

рд╣рдо рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡реНрд╕ рдХреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЖрдЧреЗ рд╕реАрдЦреЗрдВрдЧреЗред

рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдФрд░ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдореЗрдЯреНрд░рд┐рдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА: рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рдЧреНрд░рд╛рдЙрдВрдб рдЯреНрд░реБрде) рдорд╛рдиреЛрдВ рдФрд░ рдореЙрдбрд▓ рдкреНрд░реЗрдбрд┐рдХреНрд╢рдВрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЗрдВрдЬреАрдирд┐рдпрд░ рдореЗрдЯреНрд░рд┐рдХ (рдпрд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕) рдХрд╛ рдЪрдпрди рдЧреНрд░рд╛рдЙрдВрдб рдЯреНрд░реБрде рдФрд░ рдореЙрдбрд▓ рдкреНрд░реЗрдбрд┐рдХреНрд╢рдВрд╕ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдмрдХрд┐ рдореЗрдЯреНрд░рд┐рдХ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд▓реЙрд╕ рдлрдВрдХреНрд╢рди рдореЙрдбрд▓ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдБ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдХреЗ рджреМрд░рд╛рди рдореЗрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдордЧреНрд░ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЯреНрд░реЗрдирд┐рдВрдЧ

рдЪреБрдирд╛ рдЧрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдлрдВрдХреНрд╢рди рдФрд░ XGBoost рдХреЗ рдЕрдиреНрдп рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ params рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

# Define hyperparameters
params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}

рдЗрд╕ рд╢реБрд░реБрдЖрддреА params рдореЗрдВ, рд╣рдо tree_method рдХреЛ gpu_hist рдкрд░ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ GPU рддреНрд╡рд░рдХрддрд╛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ GPU рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ hist рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм, рд╣рдо num_boost_round рдирд╛рдордХ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, XGBoost рд▓реЙрд╕ рдлрдВрдХреНрд╢рди RMSE рдХреЛ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдЗрдиреНрдХреНрд░реАрдореЗрдВрдЯрд▓ рд░рд╛рдЙрдВрдбреНрд╕ рдореЗрдВ рдиреНрдпреВрдирддрдо рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рдкрд░ рдЖрдЧреЗ рдФрд░)ред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрди рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЖрджрд░реНрд╢ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдЬрд░рд┐рдП рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдЗрд╕реЗ 100 рдкрд░ рд╕реЗрдЯ рдХрд░ рджреЗрдВрдЧреЗ:

# Define hyperparameters
params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}

n = 100
model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
)

рдЬрдм XGBoost GPU рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмреЗрд╣рдж рддреЗрдЬрд╝ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реА, рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕рдлрд▓ рд░рд╣реА!

рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди

рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреЗ рджреМрд░рд╛рди, рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдиреЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕реЗрдЯ рдХреЗ рд╕рднреА рдкреИрдЯрд░реНрди рд╕реАрдЦ рд▓рд┐рдП рд╣реИрдВ рдЬреЛ рд╡рд╣ рд╕реАрдЦ рд╕рдХрддрд╛ рдерд╛ред рдЕрдм, рд╣рдореЗрдВ рдЕрдирджреЗрдЦреЗ рдбреЗрдЯрд╛ рдкрд░ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдкрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реАрдВ рдкрд░ рд╣рдорд╛рд░рд╛ dtest_reg DMatrix рдХрд╛рдо рдЖрддрд╛ рд╣реИ:

from sklearn.metrics import mean_squared_error

preds = model.predict(dtest_reg)

рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдореЙрдбрд▓ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди (рдпрд╛ рдЗрдиреНрдлреНрд░реЗрдВрд╕) рдХрд╣рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк predict рд╕реЗ рдкреНрд░реЗрдбрд┐рдХреНрд╢рдВрд╕ рдЬрдирд░реЗрдЯ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ Sklearn рдХреЗ mean_squared_error рдлрдВрдХреНрд╢рди рдореЗрдВ y_test рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

rmse = mean_squared_error(y_test, preds, squared=False)

print(f"RMSE of the base model: {rmse:.3f}")
RMSE of the base model: 543.203

рд╣рдореЗрдВ ~543$ рдХрд╛ рдмреЗрд╕ рд╕реНрдХреЛрд░ рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рд╡рд╛рд▓реЗ рдмреЗрд╕ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдерд╛ред рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВтАФрдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдФрд░ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ, XGBoost рдореЙрдбрд▓реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рджреЗрдЦрддреЗ рд╣реИрдВред

рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╡реИрд▓рд┐рдбреЗрд╢рди рд╕реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдирд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд░реЙрдХреЗрдЯ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдЖрдк рд▓реЙрдиреНрдЪ рддрдХ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░ рдПрдХ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЗрд╡рд▓ рдЦрдбрд╝реЗ рд╣реЛрдХрд░ рдЙрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рдореМрдЬреВрджрд╛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рдХрд┐ рдореЙрдбрд▓ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдПрд░реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреЗ рджреМрд░рд╛рди рдХреНрд░рдорд┐рдХ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рдиреЗ рджреЗрддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ, рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдлрд┐рд░ рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 100

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рдПрдХ рд▓рд┐рд╕реНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рджреЛ-рджреЛ рдПрд▓рд┐рдореЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдПрд▓рд┐рдореЗрдВрдЯ рд╡рд╣ рдПрд░реЗ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдЗрд╡реИрд▓реНрдпреБрдПрдЯ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрд▓рд┐рдореЗрдВрдЯ рдЙрд╕ рдПрд░реЗ рдХрд╛ рдирд╛рдо рд╣реИред

evals = [(dtrain_reg, "train"), (dtest_reg, "validation")]

рдЬрдм рд╣рдо рдЗрд╕ рдПрд░реЗ рдХреЛ xgb.train рдХреЗ evals рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╣рд░ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдб рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

evals = [(dtrain_reg, "train"), (dtest_reg, "validation")]

model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
)

рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ рдЬреИрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣рд╛рдБ 10 рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд)ред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рд╕реНрдХреЛрд░ рдХреЛ ~3931$ рд╕реЗ рдШрдЯрд╛рдХрд░ рдорд╛рддреНрд░ 543$ рддрдХ рд▓рд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рд╡реИрд▓рд┐рдбреЗрд╢рди рд╕реЗрдЯреНрд╕тАФрджреЛрдиреЛрдВ рдкрд░ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реЙрд╕ рд╡реИрд▓рд┐рдбреЗрд╢рди рд╕реЗ рдХрдо рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓ рдиреЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рд▓рд┐рдпрд╛ рд╣реИред

[0] train-rmse:3985.18329 validation-rmse:3930.52457

[1] train-rmse:2849.72257 validation-rmse:2813.20828
[2] train-rmse:2059.86648 validation-rmse:2036.66330
[3] train-rmse:1519.32314 validation-rmse:1510.02762
[4] train-rmse:1153.68171 validation-rmse:1153.91223
...
[95] train-rmse:381.93902 validation-rmse:543.56526
[96] train-rmse:380.97024 validation-rmse:543.51413
[97] train-rmse:380.75330 validation-rmse:543.36855
[98] train-rmse:379.65918 validation-rmse:543.42558
[99] train-rmse:378.30590 validation-rmse:543.20278

рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ, рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдЙрддрдиреА рд╣реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред рдЗрдиреНрд╣реЗрдВ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк verbose_eval рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ XGBoost рдХреЛ рд╣рд░ vebose_eval рд░рд╛рдЙрдВрдбреНрд╕ рдкрд░ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдЕрдкрдбреЗрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИ:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 100

evals = [(dtest_reg, "validation"), (dtrain_reg, "train")]


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=10 # Every ten rounds
)

[OUT]: 

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[10] train-rmse:550.08330 validation-rmse:590.15023
[20] train-rmse:488.51248 validation-rmse:551.73431
[30] train-rmse:463.13288 validation-rmse:547.87843
[40] train-rmse:447.69788 validation-rmse:546.57096
[50] train-rmse:432.91655 validation-rmse:546.22557
[60] train-rmse:421.24046 validation-rmse:546.28601
[70] train-rmse:408.64125 validation-rmse:546.78238
[80] train-rmse:396.41125 validation-rmse:544.69846
[90] train-rmse:386.87996 validation-rmse:543.82192
[99] train-rmse:378.30590 validation-rmse:543.20278

XGBoost рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ

рдЕрдм рддрдХ, рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рдЖ рдЧрдпрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХрд┐рддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рд░рд╛рдЙрдВрдбреНрд╕ рд╣реЛрдВрдЧреЗ, XGBoost рд▓реЙрд╕ рдХреЛ рдЙрддрдирд╛ рд╣реА рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдХрд┐ рд▓реЙрд╕ рд╣рдореЗрд╢рд╛ рдиреАрдЪреЗ рд╣реА рдЬрд╛рдПрдЧрд╛ред рдЖрдЗрдП 5000 рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреЗ рд╕рд╛рде 500 рдХреА рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдкрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 5000

evals = [(dtest_reg, "validation"), (dtrain_reg, "train")]


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=250
)

[OUT]:

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[500] train-rmse:195.89184 validation-rmse:555.90367
[1000] train-rmse:122.10746 validation-rmse:563.44888
[1500] train-rmse:84.18238 validation-rmse:567.16974
[2000] train-rmse:61.66682 validation-rmse:569.52584
[2500] train-rmse:46.34923 validation-rmse:571.07632
[3000] train-rmse:37.04591 validation-rmse:571.76912
[3500] train-rmse:29.43356 validation-rmse:572.43196
[4000] train-rmse:24.00607 validation-rmse:572.81287
[4500] train-rmse:20.45021 validation-rmse:572.89062
[4999] train-rmse:17.44305 validation-rmse:573.13200

рд╣рдореЗрдВ рд░рд╛рдЙрдВрдб 500 рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдмрд╕реЗ рдХрдо рд▓реЙрд╕ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рднрд▓реЗ рд╣реА рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реЙрд╕ рдиреАрдЪреЗ рдЬрд╛рддрд╛ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд▓рд┐рдбреЗрд╢рди рд▓реЙрд╕ (рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ) рдмрдврд╝рддрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ XGBoost рдУрд╡рд░рдлрд┐рдЯ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╡реИрд▓рд┐рдбреЗрд╢рди рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдЧрд┐рд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓ рдЬрдирд░рд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╛рдж рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдореЗрдВ рд╕реБрдирд╣рд░рд╛ рдордзреНрдп рдЪрд╛рд╣рд┐рдП: рдРрд╕рд╛ рдореЙрдбрд▓ рдЬрд┐рд╕рдиреЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рдореЗрдВ рдмрд╕ рдЙрддрдиреЗ рдкреИрдЯрд░реНрди рд╕реАрдЦреЗ рд╣реЛрдВ рдХрд┐ рд╡рд╣ рд╡реИрд▓рд┐рдбреЗрд╢рди рд╕реЗрдЯ рдкрд░ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рджреЗред рддреЛ рдлрд┐рд░ рдкрд░рдлреЗрдХреНрдЯ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ?

рд╣рдо рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ рдирд╛рдордХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ XGBoost рдХреЛ рд╡реИрд▓рд┐рдбреЗрд╢рди рд▓реЙрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рддрдХ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛, рддреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдЕрдкрдиреЗ рдЖрдк рд░реБрдХ рдЬрд╛рддреА рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рддрдХ рд╣рдо рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рдПрдХ рдЙрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╣рдо рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП 10000 рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ early_stopping_rounds рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ 50 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рдпрджрд┐ 50 рд▓рдЧрд╛рддрд╛рд░ рд░рд╛рдЙрдВрдбреНрд╕ рддрдХ рд╡реИрд▓рд┐рдбреЗрд╢рди рд▓реЙрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛, рддреЛ XGBoost рдЯреНрд░реЗрдирд┐рдВрдЧ рдЕрдкрдиреЗ рдЖрдк рд░реЛрдХ рджреЗрдЧрд╛ред

n = 10000


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=50,
   # Activate early stopping
   early_stopping_rounds=50
)

[OUT]: 

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[50] train-rmse:432.91655 validation-rmse:546.22557
[100] train-rmse:377.66173 validation-rmse:542.92457
[150] train-rmse:334.27548 validation-rmse:542.79733
[167] train-rmse:321.04059 validation-rmse:543.35679

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, 167рд╡реЗрдВ рд░рд╛рдЙрдВрдб рдХреЗ рдмрд╛рдж рдЯреНрд░реЗрдирд┐рдВрдЧ рд░реБрдХ рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ 50 рд░рд╛рдЙрдВрдбреНрд╕ рддрдХ рд▓реЙрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖред

XGBoost рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдордиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ 25% рд╣рд┐рд╕реНрд╕рд╛ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд░рдЦрд╛ рдерд╛ред рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рд╣рдореЗрдВ рдкреНрд░реЛрдбрдХреНрд╢рди рдореЗрдВ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЙрд╕реЗ рдЕрдирджреЗрдЦреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрдбрд┐рдХреНрд╢рдВрд╕ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рд╣реЛрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдкреНрд░реЛрдбрдХреНрд╢рди рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рдЯреАрдХрддрд╛ рд╕реЗ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдПрдХ рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдлрд┐рд░ рднреА тАЬрд▓реАрдХтАЭ рд╣реЛ рдЬрд╛рдПрдЧреАред рдХреИрд╕реЗ?

рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЗ рд╡реИрд▓рд┐рдбреЗрд╢рди рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдРрд╕реЗ рдореЙрдбрд▓ рдкрд░ рдкрд╣реБрдБрдЪреЗрдВрдЧреЗ рдЬреЛ рдХреЗрд╡рд▓ рдЙрд╕реА рд╡рд┐рд╢реЗрд╖ рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдкрд░ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдРрд╕рд╛ рдореЙрдбрд▓ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗтАФрдХрд┐рд╕реА рднреА рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдкрд░ рдЬреЛ рд╣рдо рдЙрд╕реЗ рджреЗрдВред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрд╛рдп рдбреЗрдЯрд╛ рдХреЛ рддреАрди рд╕реЗрдЯреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред рдореЙрдбрд▓ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдкрд░ рдЯреНрд░реЗрди рд╣реЛрддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╡реИрд▓реНрдпреБрдПрд╢рди рдФрд░ рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрд░ рдкреНрд░реЛрдбрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдЯреЗрд╕реНрдЯ рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЬрдм рдбреЗрдЯрд╛ рд╕реАрдорд┐рдд рд╣реЛ, рддреЛ рддреАрди рд╕реЗрдЯреНрд╕ рдореЗрдВ рдмрд╛рдБрдЯрдиреЗ рд╕реЗ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕реЗрдЯ рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рд╣реИред рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рджреЛ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ: рдЯреНрд░реЗрдирд┐рдВрдЧ рдФрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧред

рдЬрдмрдХрд┐ рдЯреЗрд╕реНрдЯ рд╕реЗрдЯ рдЕрд▓рдЧ рд░рд╣рддрд╛ рд╣реИ, рд╣рдо рдЯреНрд░реЗрдирд┐рдВрдЧ рд╕реЗрдЯ рдХреЛ 3, 5, 7, рдпрд╛ k рд╣рд┐рд╕реНрд╕реЛрдВ/рдлреЛрд▓реНрдбреНрд╕ рдореЗрдВ рдмрд╛рдБрдЯрддреЗ рд╣реИрдВред рдлрд┐рд░, рд╣рдо рдореЙрдбрд▓ рдХреЛ k рдмрд╛рд░ рдЯреНрд░реЗрди рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░, рд╣рдо k-1 рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЯреНрд░реЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдВрддрд┐рдо kрд╡реЗрдВ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╡реИрд▓рд┐рдбреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ k-fold рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди

Source: https://scikit-learn.org/stable/modules/cross_validation.html

рдКрдкрд░ 5-рдлреЛрд▓реНрдб рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдХрд╛ рджреГрд╢реНрдп рдЪрд┐рддреНрд░рдг рд╣реИред рд╕рднреА рдлреЛрд▓реНрдбреНрд╕ рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрдХреЛрд░ рдХрд╛ рдФрд╕рдд рд▓реЗрдХрд░ рдореЙрдбрд▓ рдХрд╛ рдЕрдВрддрд┐рдо, рд╕рдмрд╕реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдкреНрд░рджрд░реНрд╢рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ XGB рдХреА cv рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рдХрд░реЗрдВ:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 1000

results = xgb.cv(
   params, dtrain_reg,
   num_boost_round=n,
   nfold=5,
   early_stopping_rounds=20
)

train рдлрдВрдХреНрд╢рди рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ nfold рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реНрдкреНрд▓рд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреА рд╣реИред results рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдлреЛрд▓реНрдб рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ DataFrame рд╣реИ:

results.head()

CV рдкрд░рд┐рдгрд╛рдо

рдЗрд╕рдореЗрдВ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдЙрд╕ рд░рд╛рдЙрдВрдб рдХреЗ рд╕рднреА рд╕реНрдкреНрд▓рд┐рдЯреНрд╕ рдХрд╛ рдФрд╕рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╕реНрдХреЛрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо test-rmse-mean рдХреЙрд▓рдо рдХрд╛ рдиреНрдпреВрдирддрдо рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ:

best_rmse = results['test-rmse-mean'].min()

best_rmse
550.8959336674216

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рдореЙрдбрд▓ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдЗрд╕рдХреЗ рд╕реНрдХреЛрд░ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкрд░ рдкреБрдирдГ рдЯреНрд░реЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

XGBoost рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди

XGBoost рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдмрдирд╛рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдлрдВрдХреНрд╢рди рдмрджрд▓рдирд╛; рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд░рд╣ рд╕рдХрддрд╛ рд╣реИред

рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡реНрд╕ рд╣реИрдВ:

  • binary:logistic - рдмрд╛рдЗрдирд░реА рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди (рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдХреНрд▓рд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдмрд┐рд▓реНрд▓реА рдпрд╛ рдХреБрддреНрддрд╛)
  • multi:softprob - рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди (рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд▓рд╛рд╕, рдЬреИрд╕реЗ рд╕реЗрдм/рд╕рдВрддрд░рд╛/рдХреЗрд▓рд╛)

XGBoost рдореЗрдВ рдмрд╛рдЗрдирд░реА рдФрд░ рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдПрдХ рдЬреИрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдЪрд▓реЗрдВрдЧреЗред рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдХреАрдордд рдФрд░ рднреМрддрд┐рдХ рдорд╛рдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд╛рдпрдордВрдб рдХреА рдХрдЯ рдХреНрд╡рд╛рд▓рд┐рдЯреА рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдлреАрдЪрд░/рдЯрд╛рд░рдЧреЗрдЯ рдПрд░реЗрдЬрд╝ рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдПрдБрдЧреЗ:

from sklearn.preprocessing import OrdinalEncoder

X, y = diamonds.drop("cut", axis=1), diamonds[['cut']]

# Encode y to numeric
y_encoded = OrdinalEncoder().fit_transform(y)

# Extract text features
cats = X.select_dtypes(exclude=np.number).columns.tolist()

# Convert to pd.Categorical
for col in cats:
   X[col] = X[col].astype('category')

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, random_state=1, stratify=y_encoded)

рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ XGBoost рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо Sklearn рдХреЗ OrdinalEncoder рд╕реЗ рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рдПрдирдХреЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрдм, рд╣рдо DMatrices рдмрдирд╛рддреЗ рд╣реИрдВтАж

# Create classification matrices
dtrain_clf = xgb.DMatrix(X_train, y_train, enable_categorical=True)
dtest_clf = xgb.DMatrix(X_test, y_test, enable_categorical=True)

тАжрдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдХреЛ multi:softprob рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рдореЗрдВ рд╣рдореЗрдВ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рд╕реЗрдЯ рдХрд░рдиреА рд╣реЛрддреА рд╣реИ:

params = {"objective": "multi:softprob", "tree_method": "gpu_hist", "num_class": 5}
n = 1000

results = xgb.cv(
   params, dtrain_clf,
   num_boost_round=n,
   nfold=5,
   metrics=["mlogloss", "auc", "merror"],
)

рдХреНрд░реЙрд╕-рд╡реИрд▓рд┐рдбреЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╣рдо XGBoost рд╕реЗ рддреАрди рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рд╕реЗ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

results.keys()

Index(['train-mlogloss-mean', 'train-mlogloss-std', 'train-auc-mean',

      'train-auc-std', 'train-merror-mean', 'train-merror-std',

      'test-mlogloss-mean', 'test-mlogloss-std', 'test-auc-mean',

      'test-auc-std', 'test-merror-mean', 'test-merror-std'],

     dtype='object')

рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда AUC рд╕реНрдХреЛрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо test-auc-mean рдХреЙрд▓рдо рдХрд╛ рдЕрдзрд┐рдХрддрдо рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ:

>>> results['test-auc-mean'].max()
0.9402233623451636

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдиреЗ рднреА рд╣рдореЗрдВ 94% рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдпрд╛, рдЬреЛ рд╢рд╛рдирджрд╛рд░ рд╣реИред

XGBoost рдиреЗрдЯрд┐рд╡ рдмрдирд╛рдо XGBoost Sklearn

рдЕрдм рддрдХ рд╣рдо рдиреЗрдЯрд┐рд╡ XGBoost API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ Sklearn API рднреА рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред

Sklearn рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ API рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдкрд╕рдВрдж рд╣реИред рдЗрд╕рд▓рд┐рдП, XGBoost рднреА XGBClassifier рдФрд░ XGBRegressor рдХреНрд▓рд╛рд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ Sklearn рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛ рд╕рдХреЗрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдХреАрдордд рдкрд░)ред

рдпрджрд┐ рдЖрдк рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдХреЗрд╡рд▓ Scikit-learn API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рд╣реА рдиреЗрдЯрд┐рд╡ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

XGBoost рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдпрд╛ рд░рд┐рдЧреНрд░реЗрд╕рд░ рдХреЛ рдЯреНрд░реЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ get_booster рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреНрд╡рд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import xgboost as xgb

# Train a model using the scikit-learn API
xgb_classifier = xgb.XGBClassifier(n_estimators=100, objective='binary:logistic', tree_method='hist', eta=0.1, max_depth=3, enable_categorical=True)
xgb_classifier.fit(X_train, y_train)

# Convert the model to a native API model
model = xgb_classifier.get_booster()

рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рд╣рдордиреЗ рдкреВрд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рджреЗрдЦрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖

рд╣рдордиреЗ рдЗрд╕ XGBoost рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рдмрд╛рдХреА рд╣реИред

рдЖрдк XGBoost рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдкреЗрдЬ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рдореЙрдбрд▓реЛрдВ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рдкрдХ, рдСрд▓-рдЗрди-рд╡рди рд╕рдВрд╕рд╛рдзрди рдвреВрдБрдв рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ Extreme Gradient Boosting With XGBoost рдХреЛрд░реНрд╕ рджреЗрдЦреЗрдВред

рд╡рд┐рд╖рдп