{"id":369719,"date":"2024-05-21T04:09:50","date_gmt":"2024-05-21T04:09:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=369719"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=369719","title":{"rendered":"<span>\u041e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u043b\u0435\u0441 \u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0447\u0435\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0414\u043b\u044f \u043a\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u044c\u044f<\/h2>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0438 \u043d\u0435\u043e\u043a\u0440\u0435\u043f\u0448\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u043c\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432.<\/p>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b)<\/p>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0442\u0430\u043a\u0438\u0435<\/h2>\n<blockquote>\n<p><strong>\u0414\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/strong> (\u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438\u00a0\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c)\u00a0\u2014 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435\u0441\u044f \u0432\u00a0\u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435.<\/p>\n<p> \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u043b\u0438\u0441\u0442\u044c\u044f\u00bb \u0438 \u00ab\u0432\u0435\u0442\u043a\u0438\u00bb. \u041d\u0430\u00a0\u0440\u0451\u0431\u0440\u0430\u0445<br \/> (\u00ab\u0432\u0435\u0442\u043a\u0430\u0445\u00bb) \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043e\u0442\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0446\u0435\u043b\u0435\u0432\u0430\u044f<br \/> \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432 \u00ab\u043b\u0438\u0441\u0442\u044c\u044f\u0445\u00bb \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,<br \/> \u0430\u00a0\u0432\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445\u00a0\u2014 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0438. \u0427\u0442\u043e\u0431\u044b<br \/> \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043d\u0430\u0434\u043e \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u0434\u0435\u0440\u0435\u0432\u0443 \u0434\u043e\u00a0\u043b\u0438\u0441\u0442\u0430 \u0438<br \/> \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c64\/1ba\/30d\/c641ba30d70e224c94939925e06b9b8b.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\" width=\"880\" height=\"564\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c64\/1ba\/30d\/c641ba30d70e224c94939925e06b9b8b.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.<\/p>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 2 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0442\u0432\u0438.<br \/>\u0414\u043e\u0439\u0434\u044f \u0434\u043e \u043b\u0438\u0441\u0442\u044c\u0435\u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435(\u043b\u0438\u0431\u043e \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435) \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>\u041f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"Input &lt; X\" alt=\"Input &lt; X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fc\/5e8\/7ef\/0fc5e87ef2e9d20c4a8bcabc6d4b8c49.svg\" width=\"93\" height=\"20\"\/><\/p>\n<p>\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0439\u0442\u0438 X.<\/p>\n<p>\u0410 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043c\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435(\u0438\u043b\u0438 \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435) \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e X.<br \/>\u041f\u043e\u043f\u0430\u0434\u0430\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e loss, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0434\u0438\u0441\u043a\u0440\u0438\u043c\u0438\u043d\u0430\u0442\u043e\u0440.<\/p>\n<h3>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0442\u0435\u0440\u044c \u0438 \u043c\u0435\u0442\u0440\u0438\u043a:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"MSE = \\sum{(y_{pred} - y_{true})^2}     \\\\[10px]    MAE = \\sum{\\left| y_{pred} - y_{true} \\right|}    \\\\[10px]    Accuracy = \\frac{TP + TN}{TP + TN + FP + FN}\" alt=\"MSE = \\sum{(y_{pred} - y_{true})^2}     \\\\[10px]    MAE = \\sum{\\left| y_{pred} - y_{true} \\right|}    \\\\[10px]    Accuracy = \\frac{TP + TN}{TP + TN + FP + FN}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb2\/f9b\/9a8\/cb2f9b9a8d6c572bffa6ddfb98839dcf.svg\" width=\"697\" height=\"119\"\/><\/p>\n<p>\u0412 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u0445 \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442  1\/N \u0431\u044b\u043b \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<pre><code class=\"python\">def get_mse_loss(model, x,y):     return ((model.predict(x) - y)**2).mean()  def get_mae_loss(model, x,y):     return np.abs(model.predict(x) - y).mean()  def get_accuracy(model, x,y):     count = 0     preds = model.predict(x)     for i in range(len(preds)):         if (preds[i] == y):             count +=1     return count\/len(y)<\/code><\/pre>\n<h4>\u0421\u0430\u043c\u043e \u0434\u0435\u0440\u0435\u0432\u043e<\/h4>\n<pre><code class=\"python\">class MyDecisionTree:      @staticmethod     def get_loss(node, x, y, loss_type):         preds = np.array([node.classify(i) for i in x])          if loss_type == \"mse\":             return ((preds - y)**2).mean()         if loss_type == \"mae\":             return np.abs(preds - y).mean()                  raise NotImplementedError      class NodeTree:          def __init__(self, approx, separator:float = 0, left_node = None, right_node = None,):             self.separator = separator             self.approx = approx             self.left_node = left_node             self.right_node = right_node          #we can divide dataset into intervals with certain step and calculate means of it         @staticmethod         def get_intervals(x,y, step):             means = []             for i in range(len(x)-min(step, len(x))+1):                 means.append((x[i:i+min(step, len(x))], y[i:i+min(step, len(x))]))             return means               #creates node with minimal loss         @staticmethod         def create_node(x,y, loss_type, step):             if len(x) == 0:                 raise ValueError(\"empty data\")             intervals = MyDecisionTree.NodeTree.get_intervals(x,y, step)             min_loss = 100000000             minNode = None             if len(intervals) &lt; 1:                 raise ValueError(\"inrervals must be more than 0\")                          for i in intervals:                 approx = i[1].mean() if loss_type == \"mse\" else np.median(i[1])                 n = MyDecisionTree.NodeTree(approx, i[0].mean())                 loss = MyDecisionTree.get_loss(n, x, y, loss_type)                 if loss &lt; min_loss or minNode is None:                     min_loss = loss                     minNode = n              if minNode is None:                 raise ValueError(\"null node\")                          return minNode                  #this function creates new nodes from leaves         def grow(self, x,y, loss, step, min_data_size = 2):              if(len(x)) &lt; min_data_size:                 return                          if(len(x)!=len(y)):                 raise ValueError              l_x =[]             l_y =[]             r_x =[]             r_y =[]                          for i in range(len(x)):                 if x[i] &lt; self.separator:                     l_x.append(x[i])                     l_y.append(y[i])                 else:                     r_x.append(x[i])                     r_y.append(y[i])                          if self.left_node is None or self.right_node is None:                 if(len(l_x)):                     self.left_node = self.create_node(np.array(l_x),np.array(l_y), loss, step)                 else:                     self.left_node = MyDecisionTree.NodeTree(approx=self.approx)                 if(len(r_x)):                     self.right_node = self.create_node(np.array(r_x),np.array(r_y), loss, step)                 else:                     self.right_node = MyDecisionTree.NodeTree(approx=self.approx)                      else:                 self.left_node.grow(np.array(l_x), np.array(l_y), loss, step, min_data_size)                 self.right_node.grow(np.array(r_x), np.array(r_y), loss, step,min_data_size)                  def classify(self, x:float):             if self.left_node is None or self.right_node is None:                 return self.approx                          if(x &lt; self.separator):                 return self.left_node.classify(x)             return self.right_node.classify(x)       def __init__(self, loss = \"mse\", interval_step = 2, min_node_data_size = 2, max_depth = None):         self.loss = loss         self.step = interval_step         self.min_data_size = min_node_data_size         self.max_depth = max_depth               def fit(self, x, y, logging = False):         self.root = MyDecisionTree.NodeTree.create_node(x,y, self.loss, self.step)         iters = 0         while (self.max_depth is None or iters &lt; self.max_depth):             loss = MyDecisionTree.get_loss(self.root, x,y, self.loss)             self.root.grow(x,y, self.loss, self.step, self.min_data_size)             new_loss = MyDecisionTree.get_loss(self.root, x,y, self.loss)             if logging:                 print(f\"iter {iters}: loss: {loss} new loss: {new_loss}\")             iters+=1             if loss &lt;= new_loss and iters > 5:                 break         self.depth = iters      def predict(self, x):         return np.array([self.root.classify(i) for i in x]) <\/code><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b<\/h4>\n<pre><code class=\"python\">x = np.arange(0, 100) y = 5*np.sin(3*x\/len(x)* 2*np.pi)  tree = MyDecisionTree(loss=\"mse\") tree.fit(x[::3],y[::3])  plt.scatter(x,y, color=\"orange\") x_tree = np.linspace(-5,len(x)+5,len(x)*10) plt.plot(x_tree, tree.predict(x_tree), \"-\")<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/56a\/e6a\/99d\/56ae6a99d0ad1f35b39f0f587850c6f1.png\" alt=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0443\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0440\u0435\u0432\u043e\" title=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0443\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0440\u0435\u0432\u043e\" width=\"546\" height=\"413\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/56a\/e6a\/99d\/56ae6a99d0ad1f35b39f0f587850c6f1.png\"\/><\/p>\n<div><figcaption>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0443\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0440\u0435\u0432\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0448\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0442\u0438\u0439 \u043e\u0442\u0441\u0447\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439?&#187;. \u0410 \u044f \u0432\u0430\u043c \u043e\u0442\u0432\u0435\u0447\u0443: \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e&#8230; \u041d\u0443 \u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438 \u043e\u043d\u043e \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442, \u0434\u0430\u0439\u0442\u0435 \u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434\u044b<\/h4>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c recap \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 2 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f X<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u0441\u0442\u044c\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0438\u0437 \u0434\u043e\u0448\u0435\u0434\u0448\u0435\u0439 \u0434\u043e \u043b\u0438\u0441\u0442\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0432\u0443\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043e\u043a<\/p>\n<\/li>\n<\/ol>\n<h2>\u0414\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u043b\u043e, \u043f\u043e\u0441\u0430\u0434\u0438\u043c \u043b\u0435\u0441<\/h2>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043a\u0440\u0443\u0442\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 bagging, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0435\u0433\u043e \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0435\u0441 &#8212; \u044d\u0442\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u043b\u0438\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u0432 n \u043a\u0443\u0441\u043a\u043e\u0432 \u043f\u043e m \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c, \u0433\u0434\u0435 n &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432(\u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c n*m, \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u043f\u043b\u043e\u0445\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c<\/p>\n<\/li>\n<li>\n<p>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 \u0434\u0430\u043b\u0435\u0435<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0430\u0436\u043e\u0440\u0430\u043d\u0442\u0443<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 &#8212; \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>\u0410 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0432\u0441\u0435 \ud83d\ude42<\/p>\n<h3>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u041b\u0435\u0441<\/h4>\n<pre><code class=\"python\">class RandomForest:      def __init__(self, estimators_count = 100, loss=\"mse\", approx = \"regression\", max_depth = None, interval_size = 2, min_node_data = 2, cluster_size = None):         self.__forest = [MyDecisionTree(max_depth = max_depth, interval_step= interval_size, min_node_data_size = min_node_data, loss=loss) for _ in range(estimators_count)]         self.__cluster_size = cluster_size         self.__approx = approx          @staticmethod     def __spit_dataset(x,y, cluster_size, splits):         subsets = []         n_x = list(x)         n_y = list(y)         for i in range(splits):             set = ([],[])             for i in range(cluster_size):                 ind = r.randint(0, len(n_x)-1)                 set[0].append(n_x.pop(ind))                 set[1].append(n_y.pop(ind))                  if (len(n_x) ==0):                     n_x = list(x)                     n_y = list(y)              subsets.append(set)         return np.array(subsets)          @staticmethod     def get_loss(forest, x, y, loss_type = \"mse\"):         pred = forest.predict(x)         if (loss_type == \"mse\"):             return ((pred - y)**2).mean()         if (loss_type == \"mae\"):             return np.abs(pred - y).mean()      def fit(self, x, y, logging=False):         if self.__cluster_size is None:             self.__cluster_size = len(x)\/\/3                  data = RandomForest.__spit_dataset(x,y, self.__cluster_size, len(self.__forest))          for index_tree in range(len(self.__forest)):             if(logging):                  print(f\"tree: {index_tree}\/{len(self.__forest)}\")             self.__forest[index_tree].fit(data[index_tree][0],data[index_tree][1], logging= logging)          def predict(self, x):         predicts = np.array([i.predict(x) for i in self.__forest]).T         if self.__approx == \"regression\":             return predicts.mean(axis=1)         if self.__approx == \"classification\":             return st.mode(predicts)                  raise ValueError(\"approximation type error\")<\/code><\/pre>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b<\/h3>\n<pre><code class=\"python\">forest = RandomForest(cluster_size=60) forest.fit(x,y, logging=False)  plt.scatter(x,y, color=\"orange\") x_tree = np.linspace(-5,len(x)+5,len(x)*10) plt.plot(x_tree, forest.predict(x_tree), \"-\")<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c32\/4ba\/e93\/c324bae93df69273f6e09a63fe6c6fc9.png\" alt=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0435\u0441\" title=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0435\u0441\" width=\"546\" height=\"413\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c32\/4ba\/e93\/c324bae93df69273f6e09a63fe6c6fc9.png\"\/><\/p>\n<div><figcaption>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0435\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0433\u0440\u0430\u0444\u0438\u043a \u0441\u0442\u0430\u043b \u043c\u044f\u0433\u0447\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<h2>\u0414\u0440\u0435\u0432\u0435\u0441\u043d\u044b\u0439 \u0431\u0443\u0441\u0442\u0438\u043d\u0433<\/h2>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 bagging \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c &#8212; boosting.<\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043b\u0435\u0441\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u0443\u0441\u0442\u0438\u043d\u0433\u0435 \u043d\u0430\u0448\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e.<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u0430 \u0432 \u0433\u043e\u043b\u044c\u0444: \u043f\u0435\u0440\u0432\u044b\u043c \u0443\u0434\u0430\u0440\u043e\u043c \u043c\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441 \u043b\u0443\u043d\u043a\u043e\u0439, \u0430 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0435\u043c \u0448\u0430\u0440 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0438\u0436\u0435.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\" \\text{\u041f\u0435\u0440\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e} \\\\     err_{1} = Y_{true} - y_{pred1} \\\\     \\text{\u0412\u0442\u043e\u0440\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e}\\\\     err_{2} = err_{1} - y_{pred2} = Y_{true} - y_{pred1} - y_{pred2}\\\\     \\text{n \u0434\u0435\u0440\u0435\u0432\u043e}\\\\     err_{n} = Y_{true} - \\sum_{i=1}^{n}{y_{pred_{i}}} \\\\[15px]     \\text{\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 }\\\\     y_{pred} = \\sum_{i=1}^{n}{y_{i}}\" alt=\" \\text{\u041f\u0435\u0440\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e} \\\\     err_{1} = Y_{true} - y_{pred1} \\\\     \\text{\u0412\u0442\u043e\u0440\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e}\\\\     err_{2} = err_{1} - y_{pred2} = Y_{true} - y_{pred1} - y_{pred2}\\\\     \\text{n \u0434\u0435\u0440\u0435\u0432\u043e}\\\\     err_{n} = Y_{true} - \\sum_{i=1}^{n}{y_{pred_{i}}} \\\\[15px]     \\text{\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 }\\\\     y_{pred} = \\sum_{i=1}^{n}{y_{i}}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ac\/400\/9aa\/3ac4009aa4dd46201668b651ec10def7.svg\" width=\"697\" height=\"285\"\/><\/p>\n<h3>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u0411\u0443\u0441\u0442\u0438\u043d\u0433<\/h4>\n<pre><code class=\"python\">class ForestBoosting:          def __init__(self, estimators_count = 100, loss = \"mse\", approx = \"regression\"):         self.__estimators_count = estimators_count         self.__loss = loss         self.__approx = approx         self.__forest = None          def fit(self, x,y, logging = False):         data = y         trees = []         last_loss = 10000000         for i in range(self.__estimators_count):             tree = MyDecisionTree(loss=self.__loss, interval_step=len(x)\/\/2, max_depth=5)             if (logging):                 print(\"tree:\", i)             tree.fit(x, data, logging = logging)             pred = tree.predict(x)             data = (data - pred)             trees.append(tree)             l = (data**2).mean() if self.__loss == \"mse\" else np.abs(data).mean()             if(logging):                 print(\"err:\", l)             if last_loss &lt;= l:                 break             last_loss = l                          self.__forest = trees          def predict(self, x):         if(self.__forest is None):             raise ValueError(\"Boosting not fitted\")                  res = np.zeros(shape=len(x))          for tree in self.__forest:             res += tree.predict(x)          return resy<\/code><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b<\/h4>\n<pre><code class=\"python\">oscillation_x = np.linspace(0,5,1000) oscillation_y = np.exp(-oscillation_x)*5*np.sin(10*oscillation_x) boosting = ForestBoosting(loss=\"mse\") boosting.fit(oscillation_x, oscillation_y, True)  plt.scatter(oscillation_x,oscillation_y, color=\"orange\") x_tree = np.linspace(-1,6,1000) plt.plot(x_tree, boosting.predict(x_tree), \"-\") plt.grid(True)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/266\/c2e\/139\/266c2e139cc0dff572878e2e25873d9e.png\" alt=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0443\u0441\u0442\u0438\u043d\u0433\" title=\"\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0443\u0441\u0442\u0438\u043d\u0433\" width=\"546\" height=\"413\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/266\/c2e\/139\/266c2e139cc0dff572878e2e25873d9e.png\"\/><\/p>\n<div><figcaption>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0443\u0441\u0442\u0438\u043d\u0433<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043e 3 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043a\u043e\u0434\u0430 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u043a\u043b\u0430\u0434\u043e\u043a.<\/p>\n<p>\u0416\u0434\u0443 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439, \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \ud83d\ude42<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/797489\/\"> https:\/\/habr.com\/ru\/articles\/797489\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0414\u043b\u044f \u043a\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u044c\u044f<\/h2>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0438 \u043d\u0435\u043e\u043a\u0440\u0435\u043f\u0448\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u043c\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432.<\/p>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b)<\/p>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0442\u0430\u043a\u0438\u0435<\/h2>\n<blockquote>\n<p><strong>\u0414\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/strong> (\u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438\u00a0\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c)\u00a0\u2014 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435\u0441\u044f \u0432\u00a0\u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435.<\/p>\n<p> \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u043b\u0438\u0441\u0442\u044c\u044f\u00bb \u0438 \u00ab\u0432\u0435\u0442\u043a\u0438\u00bb. \u041d\u0430\u00a0\u0440\u0451\u0431\u0440\u0430\u0445<br \/> (\u00ab\u0432\u0435\u0442\u043a\u0430\u0445\u00bb) \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043e\u0442\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0446\u0435\u043b\u0435\u0432\u0430\u044f<br \/> \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432 \u00ab\u043b\u0438\u0441\u0442\u044c\u044f\u0445\u00bb \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,<br \/> \u0430\u00a0\u0432\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445\u00a0\u2014 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0438. \u0427\u0442\u043e\u0431\u044b<br \/> \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043d\u0430\u0434\u043e \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u0434\u0435\u0440\u0435\u0432\u0443 \u0434\u043e\u00a0\u043b\u0438\u0441\u0442\u0430 \u0438<br \/> \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/blockquote>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.<\/p>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 2 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0442\u0432\u0438.<br \/>\u0414\u043e\u0439\u0434\u044f \u0434\u043e \u043b\u0438\u0441\u0442\u044c\u0435\u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435(\u043b\u0438\u0431\u043e \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435) \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>\u041f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/p>\n<p>\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0439\u0442\u0438 X.<\/p>\n<p>\u0410 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043c\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435(\u0438\u043b\u0438 \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435) \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e X.<br \/>\u041f\u043e\u043f\u0430\u0434\u0430\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e loss, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0434\u0438\u0441\u043a\u0440\u0438\u043c\u0438\u043d\u0430\u0442\u043e\u0440.<\/p>\n<h3>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0442\u0435\u0440\u044c \u0438 \u043c\u0435\u0442\u0440\u0438\u043a:<\/p>\n<p>\u0412 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u0445 \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442  1\/N \u0431\u044b\u043b \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<pre><code class=\"python\">def get_mse_loss(model, x,y):     return ((model.predict(x) - y)**2).mean()  def get_mae_loss(model, x,y):     return np.abs(model.predict(x) - y).mean()  def get_accuracy(model, x,y):     count = 0     preds = model.predict(x)     for i in range(len(preds)):         if (preds[i] == y):             count +=1     return count\/len(y)<\/code><\/pre>\n<h4>\u0421\u0430\u043c\u043e \u0434\u0435\u0440\u0435\u0432\u043e<\/h4>\n<pre><code class=\"python\">class MyDecisionTree:      @staticmethod     def get_loss(node, x, y, loss_type):         preds = np.array([node.classify(i) for i in x])          if loss_type == \"mse\":             return ((preds - y)**2).mean()         if loss_type == \"mae\":             return np.abs(preds - y).mean()                  raise NotImplementedError      class NodeTree:          def __init__(self, approx, separator:float = 0, left_node = None, right_node = None,):             self.separator = separator             self.approx = approx             self.left_node = left_node             self.right_node = right_node          #we can divide dataset into intervals with certain step and calculate means of it         @staticmethod         def get_intervals(x,y, step):             means = []             for i in range(len(x)-min(step, len(x))+1):                 means.append((x[i:i+min(step, len(x))], y[i:i+min(step, len(x))]))             return means               #creates node with minimal loss         @staticmethod         def create_node(x,y, loss_type, step):             if len(x) == 0:                 raise ValueError(\"empty data\")             intervals = MyDecisionTree.NodeTree.get_intervals(x,y, step)             min_loss = 100000000             minNode = None             if len(intervals) &lt; 1:                 raise ValueError(\"inrervals must be more than 0\")                          for i in intervals:                 approx = i[1].mean() if loss_type == \"mse\" else np.median(i[1])                 n = MyDecisionTree.NodeTree(approx, i[0].mean())                 loss = MyDecisionTree.get_loss(n, x, y, loss_type)                 if loss &lt; min_loss or minNode is None:                     min_loss = loss                     minNode = n              if minNode is None:                 raise ValueError(\"null node\")                          return minNode                  #this function creates new nodes from leaves         def grow(self, x,y, loss, step, min_data_size = 2):              if(len(x)) &lt; min_data_size:                 return                          if(len(x)!=len(y)):                 raise ValueError              l_x =[]             l_y =[]             r_x =[]             r_y =[]                          for i in range(len(x)):                 if x[i] &lt; self.separator:                     l_x.append(x[i])                     l_y.append(y[i])                 else:                     r_x.append(x[i])                     r_y.append(y[i])                          if self.left_node is None or self.right_node is None:                 if(len(l_x)):                     self.left_node = self.create_node(np.array(l_x),np.array(l_y), loss, step)                 else:                     self.left_node = MyDecisionTree.NodeTree(approx=self.approx)                 if(len(r_x)):                     self.right_node = self.create_node(np.array(r_x),np.array(r_y), loss, step)                 else:                     self.right_node = MyDecisionTree.NodeTree(approx=self.approx)                      else:                 self.left_node.grow(np.array(l_x), np.array(l_y), loss, step, min_data_size)                 self.right_node.grow(np.array(r_x), np.array(r_y), loss, step,min_data_size)                  def classify(self, x:float):             if self.left_node is None or self.right_node is None:                 return self.approx                          if(x &lt; self.separator):                 return self.left_node.classify(x)             return self.right_node.classify(x)       def __init__(self, loss = \"mse\", interval_step = 2, min_node_data_size = 2, max_depth = None):         self.loss = loss         self.step = interval_step         self.min_data_size = min_node_data_size         self.max_depth = max_depth               def fit(self, x, y, logging = False):         self.root = MyDecisionTree.NodeTree.create_node(x,y, self.loss, self.step)         iters = 0         while (self.max_depth is None or iters &lt; self.max_depth):             loss = MyDecisionTree.get_loss(self.root, x,y, self.loss)             self.root.grow(x,y, self.loss, self.step, self.min_data_size)             new_loss = MyDecisionTree.get_loss(self.root, x,y, self.loss)             if logging:                 print(f\"iter {iters}: loss: {loss} new loss: {new_loss}\")             iters+=1             if loss &lt;= new_loss and iters > 5:                 break         self.depth = iters      def predict(self, x):         return np.array([self.root.classify(i) for i in x]) <\/code><\/pre>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b<\/h4>\n<pre><code class=\"python\">x = np.arange(0, 100) y = 5*np.sin(3*x\/len(x)* 2*np.pi)  tree = MyDecisionTree(loss=\"mse\") tree.fit(x[::3],y[::3])  plt.scatter(x,y, color=\"orange\") x_tree = np.linspace(-5,len(x)+5,len(x)*10) plt.plot(x_tree, tree.predict(x_tree), \"-\")<\/code><\/pre>\n<figure class=\"full-width\">\n<div><figcaption>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0443\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0440\u0435\u0432\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441: &#171;\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0448\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0442\u0438\u0439 \u043e\u0442\u0441\u0447\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439?&#187;. \u0410 \u044f \u0432\u0430\u043c \u043e\u0442\u0432\u0435\u0447\u0443: \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e&#8230; \u041d\u0443 \u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438 \u043e\u043d\u043e \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442, \u0434\u0430\u0439\u0442\u0435 \u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434\u044b<\/h4>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c recap \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 2 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f X<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u0441\u0442\u044c\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0438\u0437 \u0434\u043e\u0448\u0435\u0434\u0448\u0435\u0439 \u0434\u043e \u043b\u0438\u0441\u0442\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0432\u0443\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043e\u043a<\/p>\n<\/li>\n<\/ol>\n<h2>\u0414\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u043b\u043e, \u043f\u043e\u0441\u0430\u0434\u0438\u043c \u043b\u0435\u0441<\/h2>\n<p>\u0414\u0435\u0440\u0435\u0432\u044c\u044f &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043a\u0440\u0443\u0442\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 bagging, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0435\u0433\u043e \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0435\u0441 &#8212; \u044d\u0442\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u0414\u0435\u043b\u0438\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u0432 n \u043a\u0443\u0441\u043a\u043e\u0432 \u043f\u043e m \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c, \u0433\u0434\u0435 n &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432(\u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c n*m, \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u043f\u043b\u043e\u0445\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c<\/p>\n<\/li>\n<li>\n<p>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 \u0434\u0430\u043b\u0435\u0435<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0430\u0436\u043e\u0440\u0430\u043d\u0442\u0443<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 &#8212; \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>\u0410 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0432\u0441\u0435 \ud83d\ude42<\/p>\n<h3>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u041b\u0435\u0441<\/h4>\n<pre><code class=\"python\">class RandomForest:      def __init__(self, estimators_count = 100, loss=\"mse\", approx = \"regression\", max_depth = None, interval_size = 2, min_node_data = 2, cluster_size = None):         self.__forest = [MyDecisionTree(max_depth = max_depth, interval_step= interval_size, min_node_data_size = min_node_data, loss=loss) for _ in range(estimators_count)]         self.__cluster_size = cluster_size         self.__approx = approx          @staticmethod     def __spit_dataset(x,y, cluster_size, splits):         subsets = []         n_x = list(x)         n_y = list(y)         for i in range(splits):             set = ([],[])             for i in range(cluster_size):                 ind = r.randint(0, len(n_x)-1)                 set[0].append(n_x.pop(ind))                 set[1].append(n_y.pop(ind))                  if (len(n_x) ==0):                     n_x = list(x)                     n_y = list(y)              subsets.append(set)         return np.array(subsets)          @staticmethod     def get_loss(forest, x, y, loss_type = \"mse\"):         pred = forest.predict(x)         if (loss_type == \"mse\"):             return ((pred - y)**2).mean()         if (loss_type == \"mae\"):             return np.abs(pred - y).mean()      def fit(self, x, y, logging=False):         if self.__cluster_size is None:             self.__cluster_size = len(x)\/\/3                  data = RandomForest.__spit_dataset(x,y, self.__cluster_size, len(self.__forest))          for index_tree in range(len(self.__forest)):             if(logging):                  print(f\"tree: {index_tree}\/{len(self.__forest)}\")             self.__forest[index_tree].fit(data[index_tree][0],data[index_tree][1], logging= logging)          def predict(self, x):         predicts = np.array([i.predict(x) for i in self.__forest]).T         if self.__approx == \"regression\":             return predicts.mean(axis=1)      <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-369719","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=369719"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369719\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=369719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=369719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=369719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}