Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48

Доверительный интервал для точности модели на тестовой выборке с помощью бутстрапа

24.06.2024, 10:08. Показов 1333. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализуйте функцию bootstrap_confidence_interval_solution, которая вычисляет доверительный интервал для точности модели на тестовой выборке с помощью бутстрапа.

Аргументы функции bootstrap_confidence_interval_solution:

y — реальные значения предсказываемой характеристики для объектов тестовой выборки;

y_pred — значения характеристики, предсказанные с помощью модели для объектов тестовой выборки;

i-й элемент списка y_pred соответствует предсказанию моделью значения под номером i в списке y;

fraction_to_cut — доля элементов, которые нужно отбросить с конца каждого значения, полученного с помощью бутстрапа, перед получением доверительного интервала;

random_gen — генератор случайных чисел.

В процессе работы бутстрапа необходимо сгенерировать 10000 бутстрап-выборок.

В процессе работы вам пригодится функция cut_on_edges, которая отбрасывает с левого и с правого концов переданного списка заданную долю элементов.

В результате работы функция bootstrap_confidence_interval_solution должна возвращать доверительный интервал для точности модели, оценённой по метрике «среднее отклонение от предсказанного значения»:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\sum_1^n\left|{y}_{i}-{ypred}_{i} \right|}{n}
Доверительный интервал представляется в виде пары чисел, округлённых до трёх знаков после запятой с помощью функции round_to_3: левая и правая границы интервала.

На функцию накладывается условие, что в процессе её работы вызов функции choices у генератора random_gen должен производиться не больше 10000 раз.

Заготовка для функции bootstrap_confidence_interval_solution уже реализована в блокноте с задачами этого модуля.

Рекомендации по решению

Генерировать бутстрап-выборки на основе исходного множества необходимо с повторениями. Функция sample, которую мы использовали для генерации случайных выборок ранее, создавала их без повторений.

Для генерации случайной выборки с повторениями у генератора случайных чисел есть функция choices. С помощью её аргумента k можно задавать размер сгенерированной выборки:

random_gen = random.Random(0)
l = [1, 2, 3]
print(random_gen.choices(l, k=5)) # выведет [3, 3, 2, 1, 2]
Процесс работы алгоритма бутстрапа очень похож на моделирование, которое мы проводили в рамках одного из предыдущих заданий. Соответствующий код можно использовать вновь, заменив вызов функции sample на choices.

Формат сдачи решения

В качестве ответа на задание приведите код реализованной функции. Важно: сама функция не должна ссылаться ни на какие внешние переменные, которые определены вне функции. Исключениями являются функции cut_on_edges и round_to_3.

В коде функции также запрещено использовать ключевое слово import.

Тестирование решения

Для запуска тестов необходимо скачать этот файл (error_modelling.csv, использовавшийся в заданиях ранее) и поместить его в ту же папку, где находится блокнот Jupyter, с которым вы работаете в рамках задания.

Для тестирования функции у себя на компьютере можно воспользоваться функцией bootstrap_confidence_interval_tests, которая реализована в отдельной ячейке блокнота. Если все представленные в файле тесты отработают корректно, в результате запуска bootstrap_confidence_interval_tests появится фраза «Все тесты прошли успешно!».

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#Библиотеки
import pandas as pd
import seaborn as sns
 
from math import floor
from copy import deepcopy
 
import random
# Функции
class ChoicesNRandom():
    """
    Генератор случайных чисел, который запрещает использовать
    функцию choices больше n раз.
    """
    
    def __init__(self, seed=None, n=1):
        import random
        
        self._random_gen = random.Random(seed)
        self._choices_cnt = 0
        self._n = n
        
    def choices(self, *args, **kwargs):
        if self._choices_cnt >= self._n:
            raise RuntimeError(f'Нельзя использовать функцию choices больше {self._n} раз')
            
        self._choices_cnt += 1
        return self._random_gen.choices(*args, **kwargs)
def round_to_3(x):
    """
    Принимает число и возвращает результат его округления
    до 3 знаков после запятой.
    
    Аргументы:
        x: Число.
        
    Возвращаемое значение:
        Результат округления числа до 3 знаков после запятой.
    """
    
    return round(x, 3)
def cut_on_edges(l, fraction_to_cut):
    """
    Отбрасывает с левого и с правого концов переданного списка заданную долю элементов.
    
    Аргументы:
        l: Список элементов.
        fraction_to_cut: Доля элементов, которую нужно отбросить с каждой из сторон списка.
        
    Возвращаемое значение:
        Новый список, в котором с левого и с правого концов отборешна заданная доля элементов.
    """
    
    to_cut = floor(len(l) * fraction_to_cut)
    return l[to_cut:len(l) - to_cut]
# ============================= - граница кода, который требуется изменить
def bootstrap_confidence_interval_solution(y, y_pred, fraction_to_cut, random_gen):
    """
    Вычисляет доверительный интервал для точности модели на тестовой выборке с помощью бутстрапа.
    
    Аргументы:
        y: Реальные значения предсказываемой характеристики для объектов тестовой выборки.
        y_pred: Предсказанные с помощью модели значения характеристики для объектов тестовой выборки.
                i-ый элемент списка y_pred соответствует предсказанию моделью
                значения под номером i в списке y.
        fraction_to_cut: Доля элементов, которую нужно отбросить с каждого из концов списка полученных с помощью
                         бутстрапа значений перед получением доверительного интервала.
        random_gen: Генератор случайных чисел.
        
    Возвращаемое значение:
        Доверительный интервал для точности модели, оценённой по метрике
        «среднее отклонение от предсказанного значения».
        Представляется в виде пары значений: левая граница интервала, правая граница интервала.
    """
 
    boots_ans = []
    for i in range(10000):
        bootstrap_vyborka = random_gen.choices(y, k=len(y))
        summa = 0
        for j in range(len(y)):
            summa += abs(y[j] - bootstrap_vyborka[j])
        itog = abs(summa) / len(y)
        boots_ans.append(round_to_3(itog))
    boots_ans = sorted(boots_ans)
    boots_ans = sorted(cut_on_edges(boots_ans, fraction_to_cut))
    print(boots_ans)
    return boots_ans[0], boots_ans[-1]    
# =============================================
# Проверка кода
def bootstrap_confidence_interval_test():
    error_modeling_data = pd.read_csv('error_modelling.csv')
    
    y = list(error_modeling_data['y'])
    y_pred = list(error_modeling_data['y_pred'])
    
    y_y_pred = list(zip(y, y_pred))
    
    random_gen = random.Random(0)
    y_y_pred_example_1 = random_gen.sample(y_y_pred, 100)
    
    y_example_1 = [x[0] for x in y_y_pred_example_1]
    y_pred_example_1 = [x[1] for x in y_y_pred_example_1]
    random_gen_example_1 = ChoicesNRandom(0, n=10000)
    
    res_example_1 = 7.178, 13.509
    
    assert bootstrap_confidence_interval_solution(y_example_1, y_pred_example_1, 0.025, random_gen_example_1) == res_example_1
    
    print('Тест прошёл успешно!')
bootstrap_confidence_interval_test()
Второй день сижу и не могу понять, почему выводятся не те значения, хотя вроде делаю всё правильно.
Помогите пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2024, 10:08
Ответы с готовыми решениями:

Сравните построенные модели на тестовой выборке по метрикам Precision
Сравните построенные модели на тестовой выборке по метрикам Precision (посчитайте среднюю метрику Precision по всем классам) и f-мера.

Как с помощью базовых инструментов вычислить доверительный интервал
Не могу разобраться, можно ли в STATISTICA с помощью базовых инструментов вычислить доверительный интервал коэффициента корреляции Пирсона?...

Доверительный интервал для АКФ
Здраствуйте! Подскажите пожалуйста: 1) как в программе Statistica определяются доверительный интервал для АКФ(на рисунке - красные...

20
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 11:55
Цитата Сообщение от PROdada Посмотреть сообщение
Python
1
2
res_example_1 = 7.178, 13.509
assert bootstrap_confidence_interval_solution(y_example_1, y_pred_example_1, 0.025, random_gen_example_1) == res_example_1
То есть вы думаете, что находит с точностью третьего знака после запятой? На выборке в 10К.

Добавлено через 1 минуту
Вообще сама идея проверки float на равенство - плохая идея, но это техническая погрешность по сравнению с уже озвученной.
1
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 12:20  [ТС]
Red white socks, ну вот такое уж задание, я пытался искать ответ, ну или хотя бы что-то похожее, без использования других библиотек, но так и не нашел. А итоговые значения в моем коде очень сильно отличаются от правильных, я думаю дело в выборке, но сид я не менял, так что не знаю откуда выборку брать.

Добавлено через 2 минуты
В формуле среднего отклонения ошибок нет, так как я её до этого использовал и все работало.
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 12:57
PROdada, ну давайте не про задание, а про здравый смысл. Вы же понимаете, что третьего знака вы не достигнете никогда? Соответственно, должны самостоятельно вычислить погрешность, с которой вы находите искомые величины и успешность теста определять с учетом этой погрешности.

Далее, откуда у вас взялись эти магические значения 7.178, 13.509?
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 13:01  [ТС]
Red white socks, я прохожу курсы в Сириусе и это задание оттуда.
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 13:20
PROdada, да меня мало интересует место вашего обучения. Я объясняю, почему ваши тесты не проходят, логику модели я глубоко не копал.
Еще раз. Вот вы рандомно генерируете 100 тестов, и рассчитываете, что в каждом тесте будет один и тот же результат. С учетом всех тех случайностей, которые заложены в модель. Ну такого никогда не случится.
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 13:25  [ТС]
Red white socks, вы меня спросили "откуда эти ответы?", я вам просто ответил. Мне там сказали, что с одним и тем же сидом результат будет одинаковый. Поэтому я и спрашиваю, есть ли ошибки в моем коде.
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 13:46
То есть эти магические числа вам дали для конкретной задачи?
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 13:54  [ТС]
Red white socks, да, я писал только тот код, который находится в "границах кода, который нужно поменять". Остальной код был написан не мной, а эти "магические числа" являются ответом к задаче, и если они не совпадают, код не принимается.
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 13:55
С таким подходом, тут даже место округления будет иметь значение. Например, вы округляете до 3 знаков, а потом определяете доверительный интервал и сначала определяете доверительный интервал, а потом округляете - могут дать разные результаты.
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 14:08  [ТС]
Red white socks, по поводу 3 знаков, я исправил код, теперь он округляет только первое и последнее число:

Python
1
return round_to_3(boots_ans[0]), round_to_3(boots_ans[-1])
Но проблема в том, что выборка неправильная:

Python
1
2
3
print(round_to_3(boots_ans[0]), round_to_3(boots_ans[-1]))
 
>>> 21.248 28.229
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 15:43
PROdada, выложите error_modelling.csv. Тут гадать можно долго
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 16:50  [ТС]
Вот:
Вложения
Тип файла: zip error_modelling.zip (14.4 Кб, 3 просмотров)
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 18:13
Цитата Сообщение от PROdada Посмотреть сообщение
Python
1
summa += abs(y[j] - bootstrap_vyborka[j])
Вот здесь вы делаете что-то странное. Для каждого y вы вычисляете разницу между ним и случайным значением из того же y.
А что должны по ТЗ?
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 18:49  [ТС]
Red white socks,
Цитата Сообщение от PROdada Посмотреть сообщение
В результате работы функция bootstrap_confidence_interval_solution должна возвращать доверительный интервал для точности модели, оценённой по метрике «среднее отклонение от предсказанного значения»
Здесь я вычисляю среднее отклонение в данной выборке

Добавлено через 30 минут
А еще, разве бутстрап не в том заключается, что мы берем случайным образом из списка с размером n, n объектов и сравниваем?
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 18:58
PROdada, ваша задача вычислить доверительный интервал для точности. А как вы его получите если предсказанные значения у вас никоим образом в вычислениях не участвуют?
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 19:09  [ТС]
Red white socks, а как они должны участвовать? Просто я не очень понял.
0
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2024, 19:16
Как бутстрап работает? Вы берете одну выборку, считаете для нее точность модели. Повторяете много раз. Если вам нужен доверительный интервал, например 95%, то выписываете полученные значения и отбрасываете крайние 5%. Вот и ваш интервал.
0
3 / 3 / 0
Регистрация: 28.01.2022
Сообщений: 48
24.06.2024, 23:51  [ТС]
Red white socks, а какую выборку брать надо?

Добавлено через 4 часа 25 минут
Я решил! Дело реально было в выборке, надо было сделать:
Python
1
2
3
4
5
y_and_y_pred = list(zip(y, y_pred))
 
bootstrap_vyborka = random_gen.choices(y_and_y_pred, k=len(y_and_y_pred))
 
summa += abs(bootstrap_vyborka[j][0] - bootstrap_vyborka[j][1])
Это нужно было для того, чтобы не терять предсказанные значения.

Добавлено через 2 минуты
Red white socks, спасибо, что помогали и более внятно объяснили, что такое бутстрап.
1
Эксперт Python
 Аватар для Red white socks
4522 / 1898 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
25.06.2024, 03:06
PROdada, поздравляю, вы молодец, что сами дошли до результата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2024, 03:06
Помогаю со студенческими работами здесь

Доверительный интервал для среднего
Всем добра, Строю гистограмму, использую data. Элемент показывает значение параметра доверит.интервал для среднего. Для какой...

Доверительный интервал для коэффициента асимметрии
Уважаемые коллеги. Встречал-ли кто нибудь информацию, связанную с построением доверительного интервала для коэффициента асимметрии. ...

Доверительный интервал для многомерного случая
Добрый день! Допустим, имеется набор некоторых параметров, которые могут как зависеть, так и не зависеть друг от друга. Для простоты...

Построить γ(гамма)-доверительный интервал для параметра
№4. 4. Рассматривается статистическая модель ξ ~ N(θ,1). Построить γ(гамма)-доверительный интервал для параметра θ. Рассчитать границы...

Определить доверительный интервал для неизвестного параметра распределения
Добрый день! Уважаемые форумчане и эксперты, помогите, пожалуйста, решить две задачи либо укажите на подобные, что бы можно было сделать по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Облако проектов
russiannick 01.06.2025
Слава Джа, написал прогу для компиляции. Значит написал компилятор? Обьем кода 300+ строк. Язык-яву. Вводим данные, заполняем поля, тычем радиобаттоны. И по итогу в поле результат получам листинг. . .
Rust и квантовые вычисления: интеграция с Q# и Qiskit
golander 01.06.2025
Мир квантовых вычислений традиционно оставался закрытым клубом для высокоуровневых языков типа Python и специализированных DSL вроде Q#. Однако в последние годы Rust начал тихую революцию в этой. . .
Кэш REDIS и C#
UnmanagedCoder 01.06.2025
Redis (Remote Dictionary Server) - это ультраскоростное хранилище данных в оперативной памяти, работающее по принципу "ключ-значение". Суть проста: данные хранятся не на диске, а прямо в RAM, что. . .
Lenovo IH110CX Rev: 1.0 motherboard manual
Maks 01.06.2025
Размещения без повторений
VistaSV30 31.05.2025
Код возвращает список вариантов размещений A^{k}_{n}=\frac{n!}{(n-k)!} from itertools import permutations def pwr(k, n): # Размещение без повторений (Placement without repetition) if k. . .
Redis и Node.js с TypeScript - решения для высоконагруженных систем
Reangularity 31.05.2025
Redis (Remote Dictionary Server) — сверхбыстрое хранилище данных в памяти, способное обрабатывать операции за микросекунды. И что особенно важно для нас — с удивительно простым API. А теперь. . .
Unit-тестирование с моками в Go
golander 31.05.2025
Большинство разработчиков предпочитают тестировать код без использования моков. Например, при интеграции с Elasticsearch логичнее запустить контейнер локально и тестировать Go-код непосредственно с. . .
Как работать с PDF в C#
stackOverflow 31.05.2025
Нам приходится сталкиваться с PDF по разным причинам. Генерация счетов, создание отчетов, извлечение данных из загруженных пользователем документов, автоматизация рабочих процесов - это лишь верхушка. . .
Двухбуквенные коды стран в шифровании.
russiannick 31.05.2025
Человечество издревле манила возможность замены сочетаний букв вымышленными символами, делающие сообщение понятным только для посвещенных. Настала пора внести в это свой вклад. Двухбуквенные коды. . .
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона.
Programma_Boinc 31.05.2025
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона. Хотел бы поделиться опытом в исправлении ошибки приложения в части заряда батареи смартфона. Сразу скажу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »