Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  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.  
  32. feature = np.sort(feature_vector)
  33. target = target_vector[feature_vector.argsort()]
  34.  
  35. # print(feature)
  36. # print(target)
  37.  
  38. feature_values, indices = np.unique(feature, return_index=True)
  39. # feature = np.array(df['feature'])
  40. # target = np.array(df['target'])
  41.  
  42. indices = indices[1:]
  43. # print(indices)
  44.  
  45. if len(indices) == 0:
  46. return 'All feature values are equal'
  47.  
  48. threshold = (feature_values[:-1] + feature_values[1:]) / 2
  49.  
  50. R = len(feature)
  51. Rl = indices
  52. n1l = np.array(np.cumsum(target)[indices - 1])
  53. p1l = n1l / Rl
  54. p0l = 1 - p1l
  55. Hl = 1 - p1l ** 2 - p0l ** 2
  56.  
  57. Rr = R - Rl
  58. n1r = np.array(np.sum(target) - n1l)
  59. p1r = n1r / Rr
  60. p0r = 1 - p1r
  61. Hr = 1 - p1r ** 2 - p0r ** 2
  62.  
  63. gini = -(Rl * Hl + Rr * Hr) / R
  64. max_index = np.argmax(gini)
  65. edge = threshold[max_index]
  66.  
  67. return threshold, gini, edge, np.max(gini)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement