Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def compute_bias_variance(regressor, dependence_fun, x_generator=np.random.uniform, noise_generator=np.random.uniform,
- sample_size=300, samples_num=300, objects_num=200, seed=1234):
- """
- После генерации всех необходимых объектов, должна вызываться функция compute_bias_variance_fixed_samples.
- Рекомендации:
- * Создайте вектор объектов для оценивания интеграла по $x$, затем вектор зашумленных правильных ответов.
- Оцените мат. ожидание шума с помощью генерации отдельной шумовой выборки длины objects_num.
- * Проверить правильность реализации можно на примерах, которые разбирались на семинаре и в домашней работе.
- :param regressor: объект sklearn-класса, реализующего регрессионный алгоритм (например, DecisionTreeRegressor,
- LinearRegression, Lasso, RandomForestRegressor ...)
- :param dependence_fun: функция, задающая истинную зависимость в данных. Принимает на вход вектор и возвращает вектор
- такой же длины. Примеры: np.sin, lambda x: x**2
- :param x_generator: функция, генерирующая одномерную выборку объектов и имеющая параметр size (число объектов в
- выборке). По умолчанию np.random.uniform
- :param noise_generator: функция, генерирующая одномерную выборку шумовых компонент (по одной на каждый объект) и
- имеющая параметр size (число объектов в выборке). По умолчанию np.random.uniform
- :param sample_size: число объектов в выборке
- :param samples_num: число выборок, которые нужно сгенерировать, чтобы оценить интеграл по X
- :param objects_num: число объектов, которые нужно сгенерировать, чтобы оценить интеграл по x
- :param seed: seed для функции np.random.seed
- :return bias: смещение алгоритма regressor (число)
- :return variance: разброс алгоритма regressor (число)
- """
- np.random.seed(seed)
- # ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
- x = x_generator(size=objects_num)
- X = np.ndarray((samples_num, sample_size))
- noise = np.ndarray((samples_num, sample_size))
- for i in range(samples_num):
- X[i] = x_generator(size=sample_size)
- noise[i] = noise_generator(size=sample_size)
- mean_noise = noise_generator(size=objects_num).mean()
- return compute_bias_variance_fixed_samples(
- regressor, dependence_fun, X, x, noise, mean_noise)
- def compute_bias_variance_fixed_samples(regressor, dependence_fun, samples, objects, noise, mean_noise):
- """
- В качестве допущения, будем оценивать $E_X\left[\mu(X)\right](x)$ как средний ответ на $x$ из samples_num
- алгоритмов, обученных на своих подвыборках $X$
- Рекомендации:
- * $\mathbb{E}[y|x]$ оценивается как сумма правильного ответа на объекте и мат. ожидания шума
- $\mathbb{E}_X [\mu(X)]$ оценивается как в предыдущей задаче: нужно обучить regressor на samples_num выборках длины
- sample_size и усреднить предсказания на сгенерированных ранее объектах.
- :param regressor: объект sklearn-класса, реализующего регрессионный алгоритм (например, DecisionTreeRegressor,
- LinearRegression, Lasso, RandomForestRegressor ...)
- :param dependence_fun: функция, задающая истинную зависимость в данных. Принимает на вход вектор и возвращает вектор
- такой же длины. Примеры: np.sin, lambda x: x**2
- :param samples: samples_num выборк длины sample_size для оценки интеграла по X
- :param objects: objects_num объектов для оценки интеграла по x
- :param noise: шумовая компонента размерности (samples_num, sample_size)
- :param mean_noise: среднее шумовой компоненты
- :return bias: смещение алгоритма regressor (число)
- :return variance: разброс алгоритма regressor (число)
- """
- samples_num, sample_size = samples.shape
- objects_num = objects.size
- targets = dependence_fun(samples) + noise
- mu = np.ndarray((samples_num, objects_num))
- bias = np.zeros(objects_num)
- variance = np.zeros(objects_num)
- for i in range(samples_num):
- sample = samples[i]
- target = targets[i]
- regressor.fit(X=sample[:, np.newaxis], y=target)
- # compute expected value of method mu(X)(x)
- for j in range(objects_num):
- obj = objects[j]
- mu[i][j] = regressor.predict(obj)
- for j in range(objects_num):
- obj = objects[j]
- EXmu = mu[:, j].mean()
- bias[j] = EXmu - (dependence_fun(obj) + mean_noise)
- variance[j] = ((mu[:, j] - EXmu)**2).mean()
- bias = (bias**2).mean()
- variance = variance.mean()
- return bias, variance
Add Comment
Please, Sign In to add comment