Guest User

Untitled

a guest
Dec 18th, 2017
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. def compute_bias_variance(regressor, dependence_fun, x_generator=np.random.uniform, noise_generator=np.random.uniform,
  2. sample_size=300, samples_num=300, objects_num=200, seed=1234):
  3. """
  4. После генерации всех необходимых объектов, должна вызываться функция compute_bias_variance_fixed_samples.
  5.  
  6. Рекомендации:
  7. * Создайте вектор объектов для оценивания интеграла по $x$, затем вектор зашумленных правильных ответов.
  8. Оцените мат. ожидание шума с помощью генерации отдельной шумовой выборки длины objects_num.
  9. * Проверить правильность реализации можно на примерах, которые разбирались на семинаре и в домашней работе.
  10.  
  11. :param regressor: объект sklearn-класса, реализующего регрессионный алгоритм (например, DecisionTreeRegressor,
  12. LinearRegression, Lasso, RandomForestRegressor ...)
  13. :param dependence_fun: функция, задающая истинную зависимость в данных. Принимает на вход вектор и возвращает вектор
  14. такой же длины. Примеры: np.sin, lambda x: x**2
  15. :param x_generator: функция, генерирующая одномерную выборку объектов и имеющая параметр size (число объектов в
  16. выборке). По умолчанию np.random.uniform
  17. :param noise_generator: функция, генерирующая одномерную выборку шумовых компонент (по одной на каждый объект) и
  18. имеющая параметр size (число объектов в выборке). По умолчанию np.random.uniform
  19. :param sample_size: число объектов в выборке
  20. :param samples_num: число выборок, которые нужно сгенерировать, чтобы оценить интеграл по X
  21. :param objects_num: число объектов, которые нужно сгенерировать, чтобы оценить интеграл по x
  22. :param seed: seed для функции np.random.seed
  23.  
  24. :return bias: смещение алгоритма regressor (число)
  25. :return variance: разброс алгоритма regressor (число)
  26. """
  27. np.random.seed(seed)
  28. # ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
  29. x = x_generator(size=objects_num)
  30. X = np.ndarray((samples_num, sample_size))
  31. noise = np.ndarray((samples_num, sample_size))
  32. for i in range(samples_num):
  33. X[i] = x_generator(size=sample_size)
  34. noise[i] = noise_generator(size=sample_size)
  35. mean_noise = noise_generator(size=objects_num).mean()
  36.  
  37.  
  38. return compute_bias_variance_fixed_samples(
  39. regressor, dependence_fun, X, x, noise, mean_noise)
  40.  
  41.  
  42.  
  43. def compute_bias_variance_fixed_samples(regressor, dependence_fun, samples, objects, noise, mean_noise):
  44. """
  45. В качестве допущения, будем оценивать $E_X\left[\mu(X)\right](x)$ как средний ответ на $x$ из samples_num
  46. алгоритмов, обученных на своих подвыборках $X$
  47.  
  48. Рекомендации:
  49. * $\mathbb{E}[y|x]$ оценивается как сумма правильного ответа на объекте и мат. ожидания шума
  50. $\mathbb{E}_X [\mu(X)]$ оценивается как в предыдущей задаче: нужно обучить regressor на samples_num выборках длины
  51. sample_size и усреднить предсказания на сгенерированных ранее объектах.
  52.  
  53. :param regressor: объект sklearn-класса, реализующего регрессионный алгоритм (например, DecisionTreeRegressor,
  54. LinearRegression, Lasso, RandomForestRegressor ...)
  55. :param dependence_fun: функция, задающая истинную зависимость в данных. Принимает на вход вектор и возвращает вектор
  56. такой же длины. Примеры: np.sin, lambda x: x**2
  57. :param samples: samples_num выборк длины sample_size для оценки интеграла по X
  58. :param objects: objects_num объектов для оценки интеграла по x
  59. :param noise: шумовая компонента размерности (samples_num, sample_size)
  60. :param mean_noise: среднее шумовой компоненты
  61.  
  62. :return bias: смещение алгоритма regressor (число)
  63. :return variance: разброс алгоритма regressor (число)
  64. """
  65. samples_num, sample_size = samples.shape
  66. objects_num = objects.size
  67. targets = dependence_fun(samples) + noise
  68.  
  69. mu = np.ndarray((samples_num, objects_num))
  70. bias = np.zeros(objects_num)
  71. variance = np.zeros(objects_num)
  72.  
  73. for i in range(samples_num):
  74. sample = samples[i]
  75. target = targets[i]
  76.  
  77. regressor.fit(X=sample[:, np.newaxis], y=target)
  78.  
  79. # compute expected value of method mu(X)(x)
  80. for j in range(objects_num):
  81. obj = objects[j]
  82. mu[i][j] = regressor.predict(obj)
  83.  
  84. for j in range(objects_num):
  85. obj = objects[j]
  86. EXmu = mu[:, j].mean()
  87. bias[j] = EXmu - (dependence_fun(obj) + mean_noise)
  88. variance[j] = ((mu[:, j] - EXmu)**2).mean()
  89.  
  90.  
  91. bias = (bias**2).mean()
  92. variance = variance.mean()
  93.  
  94. return bias, variance
Add Comment
Please, Sign In to add comment