SkillGridИзучай computer science на практике

Вероятность: рассуждение в условиях неопределённости

Пространство исходов, условная вероятность, математическое ожидание и почему тест с точностью 99 процентов может ошибаться почти каждый раз.

17 мин · 55 XP

До сих пор каждое утверждение в этом курсе было истинным или ложным. Вероятность нужна, когда честный ответ — число между ними, и дисциплина, которую она требует, проста: прежде чем что-то считать, выпишите пространство исходов. Это список всего, что может произойти, ровно по одной записи на исход. Для двух бросков монеты в пространстве ниже четыре записи, а не три. Соблазнительная ошибка — написать «два орла, один орёл, ни одного орла»: это склеивает два разных исхода в один и делает все дальнейшие вычисления неверными в два раза.

two fair coins

  S  =  { HH, HT, TH, TT }

  P(HH)             = 1 / 4
  P(at least one H) = 3 / 4
  P(exactly one H)  = 2 / 4

  P(HH) + P(HT) + P(TH) + P(TT)  =  1

Здесь окупается прошлый урок. Когда все исходы в пространстве равновероятны, вероятность — это просто одно количество, делённое на другое, а арифметику делают C от n и r и P от n и r. Весь следующий раздел состоит в подсчёте благоприятных исходов и делении на размер пространства — вот почему комбинаторика была первой.

/* independent */

  P(A and B)  =  P(A) * P(B)

  1/2 * 1/2   =  1/4

/* dependent, cards, no replacement */

  P(first ace)             =  4 / 52
  P(second ace | first ace) =  3 / 51

Два события независимы, когда знание о том, что одно произошло, ничего не говорит о другом, и только тогда их вероятности перемножаются. Два броска монеты независимы. Две карты без возврата — нет, потому что первая вытянутая карта ушла из колоды: вероятность второго туза равна трём из пятидесяти одной, а не четырём из пятидесяти двух. Классическая путаница в том, что независимость принимают за смысловую несвязанность событий. Это не так: она о том, изменило ли первое числа для второго. В программах то же различие выступает как выборка с возвращением и без, и немалая часть сломанных симуляций получается там, где выбирали без возвращения, а считали, что с возвращением.

P(A|B)  =  P(A and B) / P(B)

prevalence 1 / 1000        sensitivity 0.99        specificity 0.95

population 1000000

  ill                    =      1000
  healthy                =    999000

  ill and flagged        =  1000    * 0.99  =      990
  healthy and flagged    =  999000  * 0.05  =    49950
  flagged                =                     50940

  P(ill | flagged)       =  990 / 50940        =  0.019

А теперь то, в чём ошибается большинство людей, включая большинство врачей и большинство инженеров. Читайте блок ниже медленно. Один человек из тысячи болен. Тест ловит 99 из каждых 100 больных и помечает 5 из каждых 100 здоровых — звучит как очень хороший тест. Проследите по нему население в миллион. Девятьсот девяносто из тысячи больных помечены верно, и почти пятьдесят тысяч здоровых помечены ошибочно. Теперь считайте: из примерно пятидесяти одной тысячи положительных результатов настоящих только девятьсот девяносто. Это меньше двух процентов. Тест точен, и результат всё равно почти наверняка ложная тревога, и оба утверждения верны одновременно.

DoctorTestPatientrun the test pleasepositiveP(positive|ill) is 0.99this is not what was askedwhat I need is P(ill|positive)that is 0.019 here98 of 100 positives are healthy
P(positive | ill)  =  0.99
P(ill | positive)  =  0.019

ratio  =  0.99 / 0.019  =  52

  990 / 50940  =  0.019

Причина не в арифметике, а в том, что два разных вопроса были молча подменены. Чувствительность, 0.99, — это вероятность положительного результата при условии, что вы больны. Число, которое важно пациенту, — противоположное: вероятность того, что вы больны, при условии положительного результата. Это не одно и то же число, они даже не близки, и здесь они расходятся примерно в пятьдесят два раза. У этой подмены есть имя — ошибка базовой ставки, — и это не курьёз для экзамена. Она ведёт к ненужному лечению, лишней панике и плохим продуктовым решениям, и она выживает у умных людей потому, что правильный ответ ощущается неправильным. Общий вывод стоит носить с собой везде: увидев в предложении условную вероятность, спросите, какое событие стоит с какой стороны от черты и где находится редкое — в числителе или в знаменателе.

Если не верите арифметике, смоделируйте её. Код ниже прогоняет миллион человек через те же числа и печатает долю положительных результатов, которые действительно больны. Он будет попадать около 0.019 каждый раз.

import random

ill = 0
flagged = 0
true_positive = 0

for _ in range(1000000):
    sick = random.random() < 0.001
    hit = random.random() < (0.99 if sick else 0.05)
    if sick:
        ill += 1
    if hit:
        flagged += 1
        if sick:
            true_positive += 1

print(true_positive / flagged)Проверка чисел медицинского теста методом Монте-Карло: распространённость 0.001, чувствительность 0.99, доля ложных срабатываний 0.05.

Математическое ожидание — одно число, которым описывают случайный исход; это среднее, которое вы получили бы за попытку при множестве попыток. Умножьте каждый исход на его вероятность и сложите. У лотерейного билета ниже ожидание минус один — это честный способ сказать, что билет стоит на единицу дороже, чем возвращает в среднем. Ожидание же делает конкретным вопрос про тест из начала урока: тест стоит проводить только тогда, когда ожидаемая польза от верного результата перевешивает цену ложных тревог, которые он производит, а для редкой болезни с неидеальным тестом это настоящий расчёт, а не мнение.

/* lottery ticket, price 2 */

E  =  (1/1000000) * 1000000  +  (999999/1000000) * 0  -  2
   =  1 - 2
   =  -1

Это прямо связано с оценкой моделей из tier 1, и это тот же провал в другой одежде. Accuracy — условная вероятность, прочитанная задом наперёд: она говорит, как часто модель права вообще, тогда как обычно нужно, как часто модель права, когда говорит «да». На редком классе эти числа расходятся радикально, поэтому существуют precision и recall и поэтому модель с accuracy 99 процентов может не стоить ничего. Базовая ставка — не деталь метрики: именно она решает, значит ли метрика вообще что-нибудь.

Практика

  1. Скрининговый тест на редкую болезнь имеет чувствительность 0.99, то есть помечает 99 из каждых 100 больных, и долю ложных срабатываний 0.05, то есть помечает 5 из каждых 100 здоровых. Один человек из 1000 в популяции болен. Ваш тест положительный. Какое утверждение верно?

    Подсказки
    • Выпишите два события в том порядке, в каком их даёт предложение, и назовите каждое словами, прежде чем трогать числа.
    • Одна из величин — про больных людей, другая — про тех, у кого тест положительный. Это разные группы населения.
  2. Сопоставьте каждую ситуацию с тем, независимы ли два события. Каждый ответ используется ровно дважды.

    Подсказки
    • Спросите, меняет ли первый результат число благоприятных исходов, оставшихся для второго.
    • Именно возврат карты в колоду заставляет следующую вытяжку забыть предыдущую.
  3. Расставьте по порядку расчёт базовой ставки для населения в 100000 человек. Распространённость 1 из 1000, чувствительность 0.99, доля ложных срабатываний 0.05.

    1. 1чувствительность 0.99 означает, что положительный тест у 100 * 0.99 = 99 больных
    2. 2значит, около 98 из каждых 100 положительных результатов приходят от здоровых людей
    3. 3болен 1 из 1000, значит больных 100, а здоровых 99900
    4. 4начинаем со 100000 человек
    5. 5P(болен | положительный) = 99 / 5094, то есть примерно 0.019
    6. 6всего положительных тестов 99 + 4995 = 5094
    7. 7доля ложных срабатываний 0.05 означает, что положительный тест у 99900 * 0.05 = 4995 здоровых
    Подсказки
    • Возьмите круглое население в 100000 человек, чтобы все группы остались целыми числами: больных 100, здоровых 99900.
    • Стройте таблицу строка за строкой из двух частот ошибок и только потом делите верные срабатывания на весь столбец положительных.

Вопросы по этому уроку

Почему начинать с логики и множеств?

Потому что на этом стоит всё остальное. Базы данных — это множества, программы — булевы решения, а вопрос «достаточно ли это быстро?» — это математика роста. Пропустишь — дальше начнётся заучивание.

Что реально говорит Big-O?

Как растёт объём работы при росте данных. Это не секундомер: он говорит, удвоится время при удвоении данных или вырастет в квадрат. Эта разница решает, выдержит ли программа реальное использование.

Это бесплатно?

Да. Первый уровень каждого предмета бесплатный и не требует аккаунта. Дальше уровни и старшие грейды платные — именно это позволяет проекту существовать.

На какой возраст рассчитано?

Для любознательных подростков примерно с 12 лет и для взрослых, начинающих с нуля. Опыт программирования не предполагается: уроки по сетям и физике не требуют математики сверх школьной.

Нужно ли уже уметь программировать?

Нет. Логика, физика и сети начинаются с нуля. Код ты пишешь в разделе языков — и он тоже начинается с самого начала.

Нужно что-то устанавливать?

Нет. Всё работает в браузере: теория, практика и интерактивные симуляции. Скачивать нечего и настраивать нечего.

Сколько времени занимает один предмет?

Урок — от 10 до 15 минут. Грейд «джун» это примерно 12–20 уроков, то есть несколько недель регулярных занятий, а не один вечер.

Обязательно идти по порядку?

Внутри грейда уровни открываются по очереди: каждый опирается на предыдущий. А между предметами ты свободен — начинай с логики, физики или сетей.