рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рдкреЗрдбрд╝ рд╣реИ рдФрд░ рдЙрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдирддрд╛рдПрдВ рд╣реИрдВред рдкреЗрдбрд╝реЛрдВ рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ: рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдирдореВрдиреЗ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд░рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред рдкреЗрдбрд╝реЛрдВ рдХрд╛ рднреА рдПрдХ рдкреНрд░рдореБрдЦ рджреЛрд╖ рд╣реИ - рдкреАрдЫреЗ рд╣рдЯрдиреЗ рдХреА рдкреНрд░рд╡реГрддреНрддрд┐ред рдЗрд╕рд▓рд┐рдП, рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдкреЗрдбрд╝реЛрдВ рдХреЛ рдЯреБрдХрдбрд╝рд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рди, рдврд╛рд▓ рдмрдврд╝рд╛рдиреЗ рдЖрджрд┐, рдЬрдЯрд┐рд▓ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рдкреЗрдбрд╝реЛрдВ рдХреЛ рд░рдЪрдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯреБрдХрдбрд╝рд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред
рдПрдХ рд╣реА рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдкреЗрдбрд╝ рдкрд╣рдирд╛рд╡рд╛ рдореЙрдбрд▓ рд╕реЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд▓реЛрдХрдкреНрд░рд┐рдп рдЧреНрд░реЗрдбрд┐рдВрдЧ рдмреВрд╕реНрдЯрд┐рдВрдЧ
XGBoost
рдФрд░
LightGBM
рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╡рд┐рдзрд╛рдПрдБред рдФрд░ рдкрд╛рдардХ рдХреЛ рдЧреЛ рдХреЗ рд▓рд┐рдП
leaves
рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рднреА рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЗрдбрд╝ рдЯреБрдХрдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреЗрдбрд╝ рдХрд╣рд╛рдБ рд╕реЗ рдЙрдЧрддреЗ рд╣реИрдВ?
рдкрд╣рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд╡рдзрд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ:
- рдиреЛрдб рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ
- рдмрд╛рдЗрдирд░реА рдЯреНрд░реА - рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдПрдХ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рд╡рдВрд╢рдЬ рд╣реИрдВ
- рдПрдХ рднреМрддрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрдгрдп рдирд┐рдпрдо рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреА рд╕реАрдорд╛ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
рдореИрдВрдиреЗ рдЗрд╕ рдЪрд┐рддреНрд░рдг рдХреЛ
XGBoost рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рд╣реИ

рдЗрд╕ рдкреЗрдбрд╝ рдореЗрдВ рд╣рдорд╛рд░реЗ 2 рдиреЛрдбреНрд╕, 2 рдирд┐рд░реНрдгрдп рдирд┐рдпрдо рдФрд░ 3 рд╢реАрдЯ рд╣реИрдВред рдордВрдбрд▓рд┐рдпреЛрдВ рдХреЗ рддрд╣рдд, рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкреЗрдбрд╝ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдоред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреЗрдбрд╝ рдпрд╛ рдкреЗрдбрд╝ рдХреА рдЯреБрдХрдбрд╝реА рдХреА рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕рд┐рдЧреНрдореЙрдЗрдб ред
рдзреАрд░реЗ-рдзреАрд░реЗ рдмреВрд╕реНрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдкреЗрдбрд╝реЛрдВ рдХреА рдЯреБрдХрдбрд╝реА рд╕реЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдкреЗрдбрд╝реЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
double pred = 0.0; for (auto& tree: trees) pred += tree->Predict(feature_values);
рдЗрд╕рдХреЗ рдмрд╛рдж,
C++
, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИ рдХрд┐
XGBoost
рдФрд░
LightGBM
рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдЕрдЧрд▓рд╛, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐
Predict
рдореЗрдВ рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реИ рдФрд░ рдкреЗрдбрд╝ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИред
XGBoost рдкреЗрдбрд╝
XGBoost
рдореЗрдВ
XGBoost
рдХреА рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ (OOP рдХреЗ рдЕрд░реНрде рдореЗрдВ) рд╣реИрдВред рд╣рдо
RegTree
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ (рджреЗрдЦреЗрдВ
include/xgboost/tree_model.h
), рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЦреНрдп рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдп рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рджрд┐рдЦрддреЗ рд╣реИрдВ:
class RegTree {
GetNext
рдирд┐рдпрдо
GetNext
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛
GetNext
рд╣реИред рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрд╣рд╛рдБ рд╕реЗ рджреЛ рдмрд╛рддреЗрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИрдВ:
RegTree
рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдкреНрд░рдХрд╛рд░ float
)- рд╕реНрдХрд┐рдк рдХрд┐рдП рдЧрдП рдЪрд╛рд░рд┐рддреНрд░рд┐рдХ рдореВрд▓реНрдп рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ
рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ
Node
рд╡рд░реНрдЧ рд╣реИред рдЗрд╕рдореЗрдВ рдкреЗрдбрд╝ рдХреА рд╕реНрдерд╛рдиреАрдп рд╕рдВрд░рдЪрдирд╛, рдирд┐рд░реНрдгрдп рдирд┐рдпрдо рдФрд░ рд╢реАрдЯ рдХрд╛ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ:
class Node { public:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЪрд╛рджрд░реЛрдВ рдХреЛ рдиреЛрдбреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП
cleft_ = -1
info_
рдлрд╝реАрд▓реНрдб рдХреЛ union
рд░реВрдк union
рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╛рди) рдиреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВsindex_
рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЧреБрдг рдорд╛рди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
RegTree::Predict
рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА
RegTree::Predict
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдорд╛рд░реНрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреЛ рдмрд╛рд░ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛:
float RegTree::Predict(const RegTree::FVec& feat, unsigned root_id) const { int pid = this->GetLeafIndex(feat, root_id); return nodes_[pid].leaf_value; } int RegTree::GetLeafIndex(const RegTree::FVec& feat, unsigned root_id) const { auto pid = static_cast<int>(root_id); while (!nodes_[pid].IsLeaf()) { unsigned split_index = nodes_[pid].SplitIndex(); pid = this->GetNext(pid, feat.Fvalue(split_index), feat.IsMissing(split_index)); } return pid; }
GetLeafIndex
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
GetLeafIndex
рд╣рдо рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рдиреАрдЪреЗ
GetLeafIndex
рдЬрдм рддрдХ рд╣рдо рдкрддреНрддреА рдХреЛ рдирд╣реАрдВ рдорд╛рд░рддреЗред
рд▓рд╛рдЗрдЯ рдЬреАрдмреАрдПрдо рдЯреНрд░реАрдЬрд╝
рд▓рд╛рдЗрдЯ рдЬреАрдмреАрдПрдо рдореЗрдВ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЯреНрд░реА
Tree
рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ (
include/LightGBM/tree.h
рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ) рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдПрд░реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдиреЛрдб рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class Tree {
LightGBM
рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рдорд░реНрдерди рдПрдХ рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП
cat_threshold_
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред
cat_boundaries_
рдЙрд╕ рдиреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдХрд┐рд╕ рднрд╛рдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╢реНрд░реЗрдгреАрдмрджреНрдз рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП
threshold_
рдлрд╝реАрд▓реНрдб рдХреЛ
int
рдореЗрдВ
cat_boundaries_
рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд┐рдЯ рдХреНрд╖реЗрддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
cat_boundaries_
рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрд╛рдпрдХ рдирд┐рдпрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
int CategoricalDecision(double fval, int node) const { uint8_t missing_type = GetMissingType(decision_type_[node]); int int_fval = static_cast<int>(fval); if (int_fval < 0) { return right_child_[node];; } else if (std::isnan(fval)) {
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐,
missing_type
рдЖрдзрд╛рд░ рдкрд░
missing_type
рдорд╛рди
NaN
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рдХреА рджрд╛рдИрдВ рд╢рд╛рдЦрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛,
NaN
рдХреЛ 0. рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдорд╛рди рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
bool FindInBitset(const uint32_t* bits, int n, int pos) { int i1 = pos / 32; if (i1 >= n) { return false; } int i2 = pos % 32; return (bits[i1] >> i2) & 1; }
рдпрд╛рдиреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛
int_fval=42
рдЬрд╛рдБрдЪ рдХреА
int_fval=42
рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рд░рдгреА рдореЗрдВ 41 рд╡рд╛рдВ (0 рд╕реЗ рдХреНрд░рдорд╛рдВрдХрди) рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рд╣реИ: рдпрджрд┐ рдПрдХ рд╢реНрд░реЗрдгреАрдЧрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдбрд╝реЗ рдорд╛рди рд▓реЗ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 100500, рддреЛ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдгрдп рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдореЗрдВ 12564 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдПрдХ рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛!
рдЗрд╕рд▓рд┐рдП, рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рддрд╛рдХрд┐ рд╡реЗ 0 рд╕реЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдПрдВ ред
рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
LightGBM
рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди
рдХрд┐рдП рдФрд░
рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ ред
рднреМрддрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛
XGBoost
рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдкрддреНрддрд┐рдпрд╛рдВ - рдЧреЛ рдореЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп
XGBoost
рдФрд░
LightGBM
рдирд┐рд░реНрдгрдп рдкреЗрдбрд╝реЛрдВ рдкрд░ рдврд╛рд▓
LightGBM
рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВред рдмреИрдХрдПрдВрдб рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рдореЙрдбрд▓ рдХрд╛ рдЖрд╡рдзрд┐рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдСрдлрд╝рд▓рд╛рдЗрди
- рдмреИрдХрдПрдВрдб рд╕реЗрд╡рд╛ рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рддрд░рдг
- рдкреЛрд▓ рдореЙрдбрд▓ рдСрдирд▓рд╛рдЗрди
рднрд░реА рд╣реБрдИ рдмреИрдХреЗрдВрдб рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП,
Go
рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛ рд╣реИред C API рдФрд░
LightGBM
рдорд╛рдзреНрдпрдо рд╕реЗ
XGBoost
рдпрд╛
LightGBM
XGBoost
рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЬрдЯрд┐рд▓ рд╣реИ, рд▓рд╛рдкрд░рд╡рд╛рд╣ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг, рдЖрдк
SIGTERM
рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ (рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдУрдкрдирдПрдордкреА рдмрдирд╛рдо рд░рдирдЯрд╛рдЗрдо рдереНрд░реЗрдбреНрд╕)ред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ
XGBoost
рдпрд╛
LightGBM
рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдореЙрдбрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз
Go
рдкрд░ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕реЗ
leaves
рдХрд╣рддреЗ
leaves
ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
LightGBM
рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП
- рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдк (рдкрд╛рда) рд╕реЗ рдореЙрдбрд▓ рдкрдврд╝рдирд╛
- рднреМрддрд┐рдХ рдФрд░ рд╢реНрд░реЗрдгреАрдмрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
- рдЧреБрдо рдорд╛рди рд╕рдорд░реНрдерди
- рд╢реНрд░реЗрдгреАрдмрджреНрдз рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди
- рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА-рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЕрдиреБрдХреВрд▓рди
XGBoost
рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП
- рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдк (рдмрд╛рдЗрдирд░реА) рд╕реЗ рдореЙрдбрд▓ рдкрдврд╝рдирд╛
- рдЧреБрдо рдорд╛рди рд╕рдорд░реНрдерди
- рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЕрдиреБрдХреВрд▓рди
рдпрд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо
Go
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
package main import ( "bufio" "fmt" "os" "github.com/dmitryikh/leaves" ) func main() {
рд▓рд╛рдЗрдмреНрд░реЗрд░реА API рдиреНрдпреВрдирддрдо рд╣реИред
XGBoost
рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
XGBoost
рдмрд╕ рдКрдкрд░ рджрд┐рдП рдЧрдП
leaves.XGEnsembleFromReader
рдмрдЬрд╛рдп
leaves.XGEnsembleFromReader
рдХреЙрд▓ рдХрд░реЗрдВред
leaves.XGEnsembleFromReader
рд╡рд┐рдзрд┐ред рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЛ
PredictDense
рдпрд╛
model.PredictCSR
рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐
Go
,
C++
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рднрд╛рд░реА рд░рдирдЯрд╛рдЗрдо рдФрд░ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдХреЗ рдХрд╛рд░рдг), рдХрдИ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реА рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓рдиреАрдп рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред

рддреБрд▓рдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рдЬреАрдердм рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИрдВред
рдЬрдбрд╝ рдХреЛ рджреЗрдЦреЗрдВ
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ
XGBoost
рдФрд░
LightGBM
рдореЗрдВ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмреБрдирд┐рдпрд╛рджреА рдирд┐рд░реНрдорд╛рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВ, рдФрд░ рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ - рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЧреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдврд╛рд▓ рдмрдврд╝рд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЦреБрдж рдХреЛ
рдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдВред
leaves
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
leaves
рдЖрдк рдореВрд▓ C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрддрд┐ рдЦреЛрдП рдмрд┐рдирд╛, рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ рдЕрдЧреНрд░рдгреА рдмрдврд╝рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕ рдЫрд╛!