Bootstrap и бэггинг на NumPy: выборки и прогноз

В bootstrap один объект может попасть в выборку несколько раз. Посчитайте кратности, найдите пропущенные объекты и усредните прогнозы ансамбля, не потеряв повторяющиеся индексы.

Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».

Аудит кратности bootstrap-выборок и агрегация ансамбля

Что уже дано

Проверяющая система выполняет решение в среде Python 3.12 с доступной библиотекой numpy. Никаких предопределённых глобальных переменных, файлов или классов в окружении перед запуском решения не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию audit_bootstrap_ensemble.

Что нужно сделать

Реализуйте функцию audit_bootstrap_ensemble(row_ids, bootstrap_positions, member_predictions).

Функция принимает:

  • row_ids: одномерный массив или список уникальных строковых/числовых идентификаторов исходной обучающей выборки длины ;
  • bootstrap_positions: целочисленный двумерный массив NumPy или список списков формы , где каждая строка задаёт позиции объектов, выбранных с возвращением (значения должны лежать в диапазоне от до включительно);
  • member_predictions: числовой двумерный массив NumPy или список списков формы , где строка содержит точечные регрессионные прогнозы -го члена ансамбля на объектах запроса.

Требования к валидации входных данных:

  • Если длина row_ids не совпадает с числом столбцов матрицы bootstrap_positions, функция должна возбуждать исключение ValueError.
  • Если число строк bootstrap_positions не совпадает с числом строк member_predictions (разное количество членов ансамбля ), функция должна возбуждать исключение ValueError.
  • Если любой индекс в bootstrap_positions выходит за границы допустимого диапазона , функция должна возбуждать исключение ValueError.

Требования к возвращаемому результату:
Функция должна возвращать словарь dict со следующими ключами:

  1. "counts_matrix": двумерный массив NumPy np.ndarray целочисленного типа (int64 или аналогичный) формы . Элемент [m, i] равен кратности (количеству вхождений) исходного объекта с индексом (соответствующего row_ids[i]) в bootstrap-выборке -го члена ансамбля. Повторные индексы не должны отбрасываться до подсчёта.
  2. "n_unique_per_member": одномерный массив NumPy целых чисел длины , где -й элемент равен числу строго уникальных исходных объектов, попавших в обучающую выборку -го оценщика (то есть количество объектов с кратностью ).
  3. "missing_row_ids": список списков длины , где -й элемент — это список идентификаторов из row_ids, которые вообще не вошли в выборку -го члена (их кратность равна ). Идентификаторы должны следовать строго в том же относительном порядке, в каком они перечислены в исходном row_ids.
  4. "ensemble_predictions": одномерный массив NumPy вещественного типа np.float64 длины , содержащий итоговый усреднённый прогноз ансамбля для каждого из объектов запроса (среднее арифметическое прогнозов всех оценщиков по первой оси).

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система напрямую вызывает функцию audit_bootstrap_ensemble(row_ids, bootstrap_positions, member_predictions) с различными наборами аргументов и проверяет возвращённые структуры данных, их размерности, типы и соответствие контракту.

Пример использования

import numpy as np

row_ids = ["id_0", "id_1", "id_2", "id_3"]
boot_pos = np.array([
    [0, 2, 0, 3],
    [1, 1, 1, 1]
])
member_preds = np.array([
    [10.0, 20.0],
    [12.0, 24.0]
])

res = audit_bootstrap_ensemble(row_ids, boot_pos, member_preds)
print("counts:", res["counts_matrix"].tolist())
print("unique:", res["n_unique_per_member"].tolist())
print("missing:", res["missing_row_ids"])
print("ensemble:", np.round(res["ensemble_predictions"], 1).tolist())

Результат:

counts: [[2, 0, 1, 1], [0, 4, 0, 0]]
unique: [3, 1]
missing: [['id_1'], ['id_0', 'id_2', 'id_3']]
ensemble: [11.0, 22.0]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи