SHARE
TWEET

Untitled

a guest Nov 21st, 2019 92 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import numpy as np
  2. from collections import Counter
  3.  
  4. def find_best_split(feature_vector, target_vector):
  5.     """
  6.     Под критерием Джини здесь подразумевается следующая функция:
  7.     $$Q(R) = -\frac {|R_l|}{|R|}H(R_l) -\frac {|R_r|}{|R|}H(R_r)$$,
  8.     $R$ — множество объектов, $R_l$ и $R_r$ — объекты, попавшие в левое и правое поддерево,
  9.      $H(R) = 1-p_1^2-p_0^2$, $p_1$, $p_0$ — доля объектов класса 1 и 0 соответственно.
  10.     Указания:
  11.     * Пороги, приводящие к попаданию в одно из поддеревьев пустого множества объектов, не рассматриваются.
  12.     * В качестве порогов, нужно брать среднее двух соседних (при сортировке) значений признака
  13.     * Поведение функции в случае константного признака может быть любым.
  14.     * При одинаковых приростах Джини нужно выбирать минимальный сплит.
  15.     * За наличие в функции циклов балл будет снижен. Векторизуйте! :)
  16.     :param feature_vector: вещественнозначный вектор значений признака
  17.     :param target_vector: вектор классов объектов,  len(feature_vector) == len(target_vector)
  18.     :return thresholds: отсортированный по возрастанию вектор со всеми возможными порогами, по которым объекты можно
  19.      разделить на две различные подвыборки, или поддерева
  20.     :return ginis: вектор со значениями критерия Джини для каждого из порогов в thresholds len(ginis) == len(thresholds)
  21.     :return threshold_best: оптимальный порог (число)
  22.     :return gini_best: оптимальное значение критерия Джини (число)
  23.     """
  24.     # ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
  25.    
  26.     df = pd.DataFrame({
  27.         "feature": pd.Series(feature_vector),
  28.         "target": pd.Series(target_vector)
  29.     })
  30.     df = df.sort_values('feature')
  31.     df.reset_index(drop=True)
  32.     feature_values, indices = np.unique(np.array(df['feature']), return_index=True)
  33.     feature = np.array(df['feature'])
  34.     target = np.array(df['target'])
  35.    
  36.     indices = indices[1:]
  37.    
  38.     if len(indices) == 0:
  39.         return 'All feature values are equal'
  40.    
  41.     threshold = (feature_values[:-1] + feature_values[1:]) / 2
  42.    
  43.     R = df.shape[0]
  44.     Rl = indices
  45.     n1l = np.array(np.cumsum(target)[indices - 1])
  46.     p1l = n1l / Rl
  47.     p0l = 1 - p1l
  48.     Hl = 1 - p1l ** 2 - p0l ** 2
  49.    
  50.     Rr = R - Rl
  51.     n1r = np.array(np.sum(target) - n1l)
  52.     p1r = n1r / Rr
  53.     p0r = 1 - p1r
  54.     Hr = 1 - p1r ** 2 - p0r ** 2
  55.    
  56.     gini = -(Rl * Hl + Rr * Hr) / R
  57.     max_index = np.argmax(gini)
  58.     edge = threshold[max_index]
  59.    
  60.     return threshold, gini, edge, np.max(gini)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top