malyj_gorgan: (Default)
Блін, чому я все життя роблю такі тупі помилки?
Оце тільки що: колись давно написав скрипт, який час від часу отримує масив даних input_array про недавні логіни певного типу юзерів і щось з ним робить. Зберігаючи в локальному списку array_size довжинu масиву, len(input_array), тому, що залежно від того, чи останній раз функція повернул масив довжиною більше 50 тисяч, ми відкладаємо наступний запуск коду лише на годину, коли більше 40 тисяч -- на дві, і т.п., аж до того, що коли масив має менше тисячі елементів, ми чекаємо цілу добу.

І все працювало, але мене попросили забрати зайві порогові значення, залишити лише оде: > 50 тисяч або ні. І все перестало працювати! Я облазив все, що міг, в таблиці вхідних юзерів -- ну явно ж, якщо щось таке помінялося, то проблема на вході, нє?... Бо мого коду там було піврядка, нема де помилитися!

І лише після кількох днів дурної роботи ну, хто вгадає, де я пошився в дурні? )
malyj_gorgan: (Default)
Ну, не зовсім зло, але .... З мого досвіду кількох дуже різних компаній з дуже різними середовищами і продуктами, одним з основних джерел проблем є логи. Вірніше, logging код.
Пояснюю: запускаючи продукти в якихось специфічних середовищах, всяких Airflowʼах, Cradle'ax, контейнерах і навіть джупітер ноутбуках, добросовісні програмісти намагаються впхати якийсь код для того, щоби воно писало логи. Ну, очевидно, щоби знати, що стається. Так от, ці всі логгери завжди (завжди!) виявляються найідіотськішими бібліотеками з найідіотськішими вимогами і болючими точками, такими, що логгер -- це те, що ламається в першу чергу. Найчастіше, він яко-тако працює лише в продакшн середовищі (і то, навіть там ламається), а в хоч трохи іншому середовищі не встановлюється, не працює, ламається... Тобто, якщо продакшн середовище -- той самий Airflow, ти ніде, крім нього, свій код не віддестуєш, бо логгер дає помилку... а в самому Airflowʼі тестувати - не тойво.

Шкода, ніколи не зустрічав людини, яка писала ті логгери. СПробував би пояснити, що якщо логгер написаний не в fail-to-wire парадигмі, то за це треба пиздити ломом.
malyj_gorgan: (Default)
Ну знаєте, коли ти щось робиш-робиш -- і ніфіга не виходить.
Копирсаєшся, довбаєш, пробуєш, думаєш -- пшик.
Втрачаєш надію, ховаєшся від начальства, депресуєш, бухаєш.

А потім -- хоба! -- і щось запрацювало, виходить кльова картинка, код працює, як треба, продукт іде на-гора. Неідеально, але прикольно -- можна починати писати статтю, хоча роботи, ще, звичайно, купа.

Це у всіх так? Чи лише у мене? Чи лише в деяких родах занять, типу прикладної науки чи data science проектів? Бо у мене -- весь час так. Вірніше, не весь-час, 3/4 проектів так пшиком і закінчуються, тому треба паралельно робити кілька, щоби хоч щось вийшло.

У цьому світі, взагалі, є хоч якась галузь, в якій існує ітеративний прогрес?
malyj_gorgan: (Default)
Переглядав якісь старі емейли і знайшов цікавий кусок коду десь десятилітньої давності. Це були часи, коли я ще був бона фіде вченим, жив в Матлабі, а продакшн код, типу статистичних алгоритмів томографічного відновлення гігантських 3D картинок писав на C. І раптом мені довелося шукати роботу в індустрії, і дали мені зробити домашнє завдання. Ну, є така фішка, особливо давніше була, при пошуках датазнавців дають програмувальний проект. Ну, там, прочитати дані з CSV файлів, пару перетворень, класифікатор, все таке. Зараз -- роботи на півгодини.

Який було би зробити просто, але одна засада - треба було використовувати Python, а я про нього тоді не знав приблизно нічого. Взагалі. Про бібліотеки, про саме існування якихось бібліотек. Відкрив сайт python.org, почав заглядати в документацію... І написав! Правда, тиждень грався, але навіть в час вклався, бо на ту домашку ліміту не було. В процесі щось вивчив, наприклад, з нуля на коліні написав naive Bayes класифікатор для змішаних числових і категорійних змінних (а от нема такого в їхніх бібліотеках, бо надто кастомізовано).

Послав в ту компанію. Чувак відповів -- data science aspects -- superb. Але взяти вони мене не візьмуть, бо у них трохи інший підхід до програмування.

І дивлячись на код нижче, я розумію, чому.... :)
Але, тим не менше, як на людину, яка вчора вперше відкрила документацію Пітону, і обчислює все в Сі, мені, знаєте, навіть не соромно.

А, код -- прочитати CSV табличку. )
UPDATE:
Якщо неясно, то вищенаписаний код -- це спроба скопіювати логіку Сі там, де від неї лише шкода. Він ігнорує існування бібліотек, безпричинно перевизначає код помилки), і, найгірше, обчислює абсолютно непотрібні змінні, які там для того, щоби потім звертатися до даних в таблиці як до матриці, за числовими індексами. Словом, зараз я те ж саме пишу так:
import pandas
pandas.read_csv(filename,index=0).fillna(float('inf'))

Ну, на крайняк... )
malyj_gorgan: (Default)
Товариство, я не слідкую, хто мене читає, але якщо раптом хтось, кому (самому чи близьким) цікаво попрацювати на позиції Data Engineer, то, прошу, дайте знати. Я б не писав, але щиро вважаю, що у нас непогана компанія, плюс, на відміну від багатьох інших варіантів, fully remote опція. США або Канада. Позиція лише відкрилася, стандартних пошукачів через професійні мережі багато, але фільтрувати з них хоч приблизно релевантних кандидатів важко.

Словом, якщо вам цікаво, пишіть приватні повідомлення
malyj_gorgan: (Default)
Яху підкинула допис про фаворитизм в сімʼях. Ну, про те, що, коли більше одної дитини, то хтось з дітей є фаворитом ("більше любимо", більше вибачаємо, надаємо перевагу і т. д.), а навіть якщо ні, то діти сприймають, що фаворитами є не вони, а брат/сестра. Але останнє то уже психологічні моменти, в реалі повної гомогенності не буває, так що, якщо у вас, скажімо, двоє дітей, то хтось один з них -- улюбленець. Я читав статтю в HuffPost, яка розповідає про статтю пари вчених з, of all places, Brigham Young University, яка, в свою чергу, є оглядовим мета-аналізом кількох десятків уже справжніх статей на тему. Сподіваюся, ніде з ідеологічних причин сильно не прибрехали, але не впевнений, в якому місці меседж втратив важливу компоненту. Я це до чого -- далі в статті наводяться дані про те, як буття фаворитом впливає на подальшу долю дитини. Кому цікаво, спробуйте вгадати: як відрізняється стан і майбутня доля дітей, які були фаворитами в родині? Щоби не було спойлерів, заховаю решту допису.
Клацніть сюди, коли сформулюєте для себе відповідь і захочете читати далі )
malyj_gorgan: (Default)
Літав по роботі з одного узбережжя на інше, по дорозі вирішив спробувати написати допис для ЛінкдІна на професійні теми. Але видно в душі сидить образа на деяких колишніх колег, бо зловив себе на тому, що захотів написати таке собі уточнення про одну штуку, яка мене особливо дратує у виконанні деяких менеджерів. Питання в аудиторію: якщо в ЛінкдІні написати отаке, воно сильно вдарить по репутації? (Сам допис я ще не дописав... каламбур, однако)

My little commentary-turned-rant: A “mental model” is a modern corporate phenomenon that involves a less technical manager or a business leader and a more technical concept (e.g., an algorithm), let us call it “X”. Said leader claims to have built a mental model of X when they have learned just enough about it to support a conversation. Often, in that conversation they start actively sharing their ideas about how to develop X, how to productize it, and so on, even if their level of competence on the topic is still grossly inadequate. In a perfectly cooperative environment such approach is fine, it may help fix problems and produce innovations. However, in a corporate environment that is competitive and/or hierarchical, such mental model-based inputs tend to get abused, leading to wrong decisions, shifted responsibilities, and covered-up problems. Since perfectly cooperative environments are rare, these mental models do more harm than good. For what it’s worth, my advice to leaders in high-tech business world is this: if you hear anyone say “my mental model of X is ... ”, put very little value into what they say about that X afterwards.
malyj_gorgan: (Default)
Ну чому завжди ти щось робиш-робиш... і щось починає виходити в пʼятницю зранку. Ти цілий день тестуєш, ніби, все працює. І от всьо, думаєш, зробив і можна запускати. А інженери дивляться на твій PR і кажуть: чекаємо до понеділка, у нас полісі -- в пʼятницю ввечері ніяких змін на продакшн.

І хрін переконаєш, що нічого поганого не станеться. (Раз уже переконав -- погане сталося, дата інженер потім в суботу все ремонтував... але це була випадковість! правда-правда!)
malyj_gorgan: (Default)
In any formula, constants (especially those obtained from handbooks) are to be treated as variables.

Яка прекрасна думка. Чи то пак, спостереження. Що цікаво, воно правда далеко не лише в соціальних і економічних науках. (Там, якби мене хто запитав, слід би було написати "any formulae are to be treated as mnemonic rules to be applied when and if convenient")
malyj_gorgan: (Default)
Кажуть, якщо поділитися з іншими тим, що тебе дратує, стане легше. Good ol' rant, значицця, допомагає психічному здоровлю. (Не перевіряв, як там з психічним здоровлям слухачів... на всякий випадок і не буду.) Навіть нових теґів придумувати не треба, перетин "за це їх і не люблять" і "lament" якраз попаде, кути треба. Всі інші теґи -- про підтеми.

Отже, три випадкових речі, які мене серйозно дратують. З трьох зовсім різних аспектів життя.

1. Коли влітку кондиціонер охолоджує приміщення до температури нижчої (або навіть такої ж), як обігрівач нагріває те ж саме приміщення взимку. В кількох різних сценаріях таке спостерігав, особливо, в тих місцях, де є реальна зима. Коли надворі спека і всі, хто може, ходять напівголі, вони вистуджують офіс до 20-21 Цельсія. Зате взимку, коли ти прешся на роботу через мороз і пургу, в довгих штанях, сорочці-светрі під курткою, а чого доброго ще і всякій теплій спідній білизні, вони гріють до вище 22 градусів. (Я чого запамʼятав, памʼятаю ще з "Охорони Праці" зі студентських часів, що поза інтервалом 17-22 градуси вважається некомфортне виробництво.) І не лише офіси -- скільки народу, які влітку нормально сидять в хаті при 20 градусів, взимі нагрівають до 25 і більше, що ходять по хаті в трусах і майці і при цьому скаржаться, яке дороге опалення.

2. Коли теоретик (датазнавець, вчений і т. п.) надає всі розрахунки виключно в форматі матричного множення, але при цьому толком не розуміє, що там всередині робиться. Ну, наприклад, коли рахують стандартну регресію
argmin (A Xi - Yi)2
де A , Xi, Yi -- то масиви, тобі починають писати через добуток всяких матриць, транспонованих матриць і обернених матриць, а коли пробують порахувати довжину кроку в ґрадієнтному пошуку, або варіативність оцінки, то ця формула росте, росте.... А коли в будь-який момент кажеш людині, яка це все пише: а ти можеш це написати, як суму? ... То ця людина губиться і дивиться на тебе, як самі знаєте хто на нові ворота. І ці люди щиро думають, що вони щось знають, а не запамʼятали з використанням мнемонічного правила..

3. Коли українці за кордоном з одного боку скаржаться на війну і несправедливість, а з іншого не роблять і мінімального зусилля, щоби хоча б в очах сторонніх зберегти лице. ОК, говориш вдома російською -- твоя справа, але розповідати вголос, що "какая разніца", що про мову, що про культуру -- при цьому купувати російські продукти, ходити в московську церкву, тихцем обурюватися, що діяспора їм тут недостатньо помагає, поки діаспора продовжує купувати і відсилати речі в Україну, а вони самі ні цента не шлють, зате у відпустку зʼїздити або бʼюті процедури -- це запросто. Дуже хочеться вірити, що таких типів не аж так багато, це вони просто в очі кидаються, бо дратують особливо сильно.

Ну, все, поскаржився, хай воно тепер і вас теж дратує.
malyj_gorgan: (Default)
Колись, ще в аспірантурі, мені попалася на очі цитата, яка влучила прямо в центр мішені моїх наукових проблем, ще й резонансом відгукнулася: "A year in the lab saves you half-a-day at the library". Хай я був теоретиком і працював не в лабораторії, але суть збереглася: працюєш, кодуєш, шукаєш баґи, переробляєш десять разів... А коли вже все готово, і ти порпаєшся в літературі, шукаючи посилання для дисертації, ти знаходиш пару статей, де все, до чого ти сам так довго не міг доперти, розкладено покроково, гарно, просто, елєґантно...
Це я до того, що я в якийсь момент потратив купу власного часу, розбираючись, як працює причинно-наслідковість на моїй попередній роботі (бо колеги або ну геть не вміли пояснити, або, маю сильну підозру, самі толком не розуміли, що роблять), потім тут щось писав, потім навіть провів дводенний воркшоп для інших, потім на нинішній роботі дав семінар. І тут мені показали книжку, де все, нарешті, написано одночасно і повно, і просто: https://matheusfacure.github.io/python-causality-handbook/landing-page.html


P.S. Може, якби я це прочитав півтора року тому, все би в житті інакше пішло... хоча навряд, там треба було робити речі, які я ні не вмію, ні не люблю, ні не поважаю.
malyj_gorgan: (Default)
Знову повернуся до причинно-наслідковості. В попередніх дописах з цим теґом я намагався охопити загальну інтуїцію на тему, а зараз вже конкретика. Це статус кво галузі, як я його розумію, хоча, звичайно, воно все не записано в книжці стандартів, еталонів і аксіом. Тим не менше, я досить-таки твердо переконаний у всьому, що виклав нижче (мінус помарки або приступи дислексії), і якщо ви хочете зі мною поговорити про прикладні причини, спочатку варто погодитися з теорією.

В дописі три секції: формальне визначення причинності, метод подвійного машинного навчання і обговорення з прикладом.

A. Визначення: що таке причинний вплив бінарної дії A на результат Y?
Часто, особливо, коли Y бінарний, може виникнути спокуса визначати причинність як (знак оклику означає заперечення, !A еквівалентно не-A) еквівалент умови "якщо A, то Y, а якщо !A, то !Y". Це буде помилкою! Так визначається не причина, а єдина, необхідна і достатня причина; а такі за межами підручників зустрінеш рідко. Якщо поміркувати над стандартним вжитком, то погодитися можна лише про таке: "ʼA є причиною Yʼ означає, що позитивною є β, міра причинного впливу A на Y", і визначається ця бета так:
(1)   β = P(Y|A) − P(Y|!A) ≡ P(Y|A=1) − P(Y|A=0)

Це визначення правильне, але неповне. Ви помітили, що тут лише дві величини, дія і наслідок? Aле в житті-то є і всякі інші події, тому формула (1) завжди несе в собі імплікацію "everything else being equal", тобто, з двох боків знаку мінус міняється лише А, а все решта залишається незмінним. На жаль, неможливо спостерегти дві події, ідентичну у всьому, крім значення A. Це фундаментальна властивість реальності, поети її формулюють як "не можна двічі увійти в ту саму ріку", а математики як "!A ∩ A = ∅". В датазнавстві такі дані називають counterfactual data, а визначення причинності пишуть не для індивідуальних подій, а для розподілів. Тобто, якщо зовнішнє середовище і передісторія нашої події описуються багатомірним вектором Х з розподілом ρ, то бету пишуть як
(2)   β = P(Y|A, X) − P(Y|!A, X),
маючи на увазі
       β = P(Y|A, ρ(X)) − P(Y|!A, ρ(X)).

Ну і так далі )

На самий кінець додам, що все вищесказане було для бінарних A лише тому, що так простіше і чіткіше все пояснювати. Точно так само працює модель і DML для скалярного A, хоч дискретного, хоч неперервного, хоч обмеженого, хоч ні. Більше того, так само все працює і для багатомірних A, але тоді розмивається концепція існування причинни взагалі, а залишається лише розрахунок багатомірного вектора бета.
malyj_gorgan: (Default)
Відучив дводенний воркшоп-інтенсив з причинно-наслідкового моделювання для української онлайн освітньої платформи robot_dreams. Трохи новий для мене досвід -- останній раз я бона фіде вчив людей нешкільного віку понад двадцять років тому, тай то -- воно було фізика, класика, в рамках визначеної програми, все ясно, що розказувати, а студенти -- звичайні студенти. А тут невідомо хто, може, уже готові професіонали, які можуть більше мене навчити, ніж я їх... хоча поняття не маю, хто були ті люди, про себе зголосився розповісти лише один з двох десятків учасників. Поскаржуся на життя, що часу і зусиль воно зайняло більше, ніж я собі думав: два дні, мало бути по 3 години лекцій, вийшло по 4 з гаком, плюс, приготувати домашнє завдання. Але цікаво. Хочу вірити, що учасникам сподобалося. Організатори сказали (хитро сказали, уже після закінчення), що той факт, що майже всі досиділи до кінця -- це успіх, що іншими разами у них до кінця курсу досиджує меншість.

Так чи інакше, воно позаду. Чи буде вищезгадана платформа якось ділитися матеріалами курсу -- я не знаю, ми з ними домовилися, що все, що я приготував для курсу -- їхня власність, най так і буде, домовленостей треба дотримуватися. Але, як відомо, можна курити під час молитви, а можна молитися під час куріння (хто не знає цього анекдоту -- ви багато втратили, знайдіть і прочитайте), тому, я думаю, що маю повне право ділитися своїми напрацюваннями, які я зробив раніше/деінде, а в курсі використав. Думаю, на кілька дописів стане. Ось, наприклад, візуалізація одного принципу, як робити узагальнення про підмножини. Нехай у вас є якась залежність Y(X), ось така:
multiple_linear
Різними крапочками там зазначені розподіли семплів у цій залежності, а кольори цих крапочок -- якісь конфаундери, aka confounders, aka змішуючі змінні. Вважайте, непрофільні характеристики семплів, які впливають і на ікс, і на ігрек. Якщо ви побудуєте графік Y(X), усереднених за цими непрофільними конфаундерами, то він може виглядати зовсім неподібно, наприклад, десь так:
averages
Так от, не в плані математики, а в плані вдалого/невдалого використання статистичних чи просто частотних аргументів. Воно, звичайно, моя субʼєктивна інтерпретація особистого академічного і професійного досвіду, якогось style guide на цю тему ви не знайдете (якщо знайдете -- покажіть):
1. Розподіл середніх за непрофільними групами без додаткових міркувань не може бути доказом яких завгодно тверджень про залежність Y(X). (Розподіл всередині груп або незалежно від груп -- може, саме так і доказують.)
2. Позиція середнього одної підмножини на розподілі середніх може бути ілюстрацією існування залежності Y(X), якщо вона збігається з напрямком залежності, порахованим без врахування підгруп. Позиція середнього підмножини, яка не попадає в загальний тренд Y(X) нічого на цю тему не ілюструє.
3. Порівняння позицій двох підмножин (XA, YA) і (XB, YB) має сенс, якщо у них близькі або ікси, або ігреки -- таке порівняння дозволяє оцінити різницю між конфаундерами, які визначають множини A і B, але про існування чи значимість саме залежності Y(X) воно не каже нічого.

Десь так :)
malyj_gorgan: (Default)
В розмовах з коментаторами до попереднього допису у мене склалося враження, що часто, коли я не погоджуюся з опонентами, причина не в тому, що ми собі знаємо різні факти, а в тому, що ми по-різному інтерпретуємо ті самі факти з числового простору в простір потяттєвий. Тому оце вирішив показати пару речей, очевидних, якщо ти регулярно працюєш з статистичними даними, і далеко не таких очевидних, якщо ти з ними стикаєшся лише в опрацьованому форматі.
Насамперед дисклеймер: я не наполягаю, що враження, яке у мене склалося про когось з моїх співрозмовників, вірне. Це не персоніфіковане пояснення, а абстрактна мінілекція, дуже прошу не сприймати нічого особисто. Дві маленькі ілюстрації сценаріїв, де я не раз спостерігав нерозуміння представниками всіх можливих і неможливих професій.

Ілюстрація перша: середнє vs частотне. Часто люди з підозрою ставляться до ситуацій, коли помітна більшість вимірів виявляється більшою (або меншою), ніж середнє значення. Як жартував мій улюблений радіоавтор про своє уявне містечко Лейк Вобегон, там "all the children are above average". Так от, всі діти вище середнього бути не можуть, але значна більшість - запросто. Наприклад, якщо у нас якась величина, хоч оцінка з математики, хоч кількість дрінків на місяць, хоч продажі за рік мають ось такий, цілком реальний, розподіл:
distr074
то три з чотирьох учасників цього розподілу будуть мати значення вище середнього! А якщо взяти не менш реальний розподіл, дзеркально відбитий навколо вертикальної вісі, то 3/4 учасників будуть мати значення нижче середнього. І це ще компактний розподіл, між нулем і одиницею, а якщо значення не мають обмеження, то асиметрія може асимптотично наближатися до ста відсотків.

Ілюстрація друга: кореляції. Кореляція не означає очевидної лінійної залежності. Більшість всяких кореляцій в більшості галузей людської діяльності, які гордо називають статистично значними кореляціями, вони можуть на перший погляд виглядати як повна відсутність залежності. Що в медицині, що в бізнесі, що в соціології всякій... Коли ми чуємо, що А корелює з Б, але знаємо приклади існування "А and not Б" або "Б and not А", навіть, приклади на рівні субдемографій, то є спокуса сказати, що ні, ніякої кореляції нема. Боріться з цією спокусою! Єдиним способом показати, що кореляції нема, є поміряти кореляцію і показати, що її нема. Тому що розбіжності.... Ну ось, подивіться наприклад на цей розподіл з семидесяти пʼяти пар (x, y):
corr042_013
Це дані, які досить добре корелюють. Коефіцієнт Пірсона -- 42%, в бізнесі постійно таке оголошують успіхом. Коефіцієнт детермінації (R-квадрат) 18%, не фонтан... але, повірте, у світі купа людей, які 4-5% оголошують нормальною залежністю, особливо в обчисленнях причинності, там більше 10% -- за щастя. І це цілком нормально, якщо ви рахуєте не ML передбачення, а модель причинності. Зокрема, при даних такого ж рівня "шумності", як оце на картинці, імовірність помилки першого роду у спробі поміряти середнє значення ігрека для 75 точок на симетричних і рівномірних іксах з точністю вимірювання (precision) до половини справжнього середнього буде десь 25-30%. Це ще називають p-value. Це багато, така статистика нічого не доказує... Але якщо взяти не 75 точок, а 150, то p-value буде вже 12%, забагато в серйозній статистиці, але уже на межі для найгрубших оцінок. А якщо кількість самплів збільшити до 750, то p-value буде менше півпроцента, всі щасливі. Точність вимірювання замала? На десяти тисячах точок ми матимемо p-value один відсоток для точності вимірювання 0.1 від правди. Це я все до чого: позитивна кореляція може бути слабкою, але для достатньої кількості семплів вона буде статистично важливою. Всі вищенаведені виміри взяті не зі стелі, а перераховані ось цими от руками.

Бонус до другої ілюстрації. Взагалі, вміння розуміти кореляції -- дуже корисне вміння. Дуже раджу вбити 5-10 хвилин часу і погратися в цікавущу гру: "угадай кореляцію". Мені вона у свій час серйозно допомогла виробити певну інтуїцію.
malyj_gorgan: (Default)
Після того, як самому довелося зіткнутися з user sentiment research, почав набагато вдумливіше ставитися до цих формочок, які часом просять заповнити. З огляду на те, що і як читає всі ті текстові відгуки, намагаюся часом бути креативним. Вчора поставив девʼять з десяти одній компанії за доставку, а коли вони після цього вилізли з формочкою "please explain your rating" написав:

     Nine is a very good number

Чорт його знає, чому захотілося цим поділитися. Напевно, профдеформація
malyj_gorgan: (Default)
В наші часи нікому не можна вірити. Навіть собі. Я не Мюллєр/Бронєвой, мені також не можна :)

Я тут чого про казуальність почав писати? Бо вважаю, що про це ніде нормально не написано: або заплутано, або пропущено, або перекручено.... найчастіше все одночасно.
Приклад: якийсь чувак на towardsdatascience написав статтю про подвійне машинне навчання, про яке, я, власне і збираюся розпівісти у своїй серії про казуальність. Так мало що у нього теж все заплутано і погано, так ще і, он, з самого верху фрази типу:


Double machine learning (DML) is the method for estimating heterogeneous treatment effects especially when we have a large number of confounders. It also works with continuous treatment, unlike the meta-learners we discussed in the previous article. The method was introduced in the paper "Double Machine for treatment and causal parameters" which won the 2020 Nobel Prize in Economics.


На всякий випадок, кому лінь перевіряти:
1. Назва статті трохи переплутана.
2. За цю статтю не давали Нобелівських премій
3. Авторам цеї статті не давали Нобелівських премій за інші роботи
4. Нобелівська премія з економіки 2020-го року була присуджена ншим людям за роботи на інші теми.
5. В 2021-му році, так, Нобеля з економіки дали комусь іншому, але за роботи з теорії казуальності. А стаття за посиланням теж з теорії казуальності, от і вся "правда", решта -- брехня.
malyj_gorgan: (Default)
Причинно-наслідкова або ж каузальна дедукція. Це я так перекладаю поняття causal inference. Оскільки воно все туманно, давайте, краще визначу про що мова.
Отже, нехай у нас є якась числова міра реальності Y, яку можна застосувати до одного семпла. Місячна виручка за морозиво марки ʼКурдупликʼ в генделиках Галичини, оцінка на тестуванні з математики у студента, ефективність їзди в літрах на 100 км на автомобіль і т. п. Далі, нехай, у нас є якась дія A, яка може статися або не статися перед тим, як ми мірятимемо наш Y. Скажімо, для трьох вищевказаних прикладів діями можуть бути "поставили паперову фігурку Курдуплика на вході в генделик", "прослухали рекомендовану лекцію ʼМатематика - це стильно, модно, маладьожноʼ", "Поставили під вітрове скло іконку Святого Хоми". Важливо, що в нашій популяції (популяція -- це сукупність всіх генделиків/студентів/машин, які ми розглядаємо) у деяких членів за час, поки їх спостерігали, ця дія сталася, а у решти -- не сталася. Ще ви, може, звернули увагу, що я назвав лише бінарні дії, A або відбулося або ні, А=0 або 1, тоді як Y найчастіше має якийсь відносно неперервний інтервал (можна описати дійсним або цілим числом). (Насправді, для небінарної дії все виводиться і імплементується практично так само, але я фокусуватимуся саме на бінарних А, тим більше, що в реальних задачах воно трапляється частіше, а мінуси, які я буду критикувати в кінці курсу, там очевидніші.)

Повернемося до задачі. Максимально загальне її формулювання дуже туманне: знайти, як бінарна дія (action або treatment) А впливає на кількісний наслідок (outcome) Y:
dag0
Можна прискіпатися, чого це ми впевнені, що А є однією з причин Y, а не навпаки, але не проблема: зворотнього впливу бути не може, бо Y вимірюється після того, як А відбулося або не відбулося. Інша справа, що від настільки загального формулювання толку мало, бо що значить "як впливає"?

Найпершим ділом, визначимо оце "як". Як я і обіцяв у попередньому дописі, ми зробимо ось таку штуку. Ми уявимо собі, що можемо спостерегти і ситуацію, коли дії не було, і ситуацію, коли дія була. Давайте, для зручності, відтепер мислити в термінах першого з придуманих прикладів, про генделики, морозиво і курдупликів. Насправді, це одна з найпопулярніших задач в бізнесі: маркетологи придумали спосіб підняти продажі, здизайнували фігурку, друкували-вирізали-клеїли, розіслали в деякі генделики, десь їх навіть встигли встановили, і от тепер тепер начальство хоче знати, чи був від цього толк. Словом, чи не найтиповіша бізнес-задача в цьому світі.

Повертаємося до формулювань. Нехай індекс i позначає номер генделика нашому списку, Ai позначає факт встановлення там фігурки Курдуплика, а Yi позначає місячні продажі там відповідного морозива. Так от, ми визначимо казуальний вплив дії на результат βi через два можливі сценарії, в одному з яких Ai дорівнює нулю, а в іншому -- одиниці.
(1)   Yi[якщо Ai=1] = Yi[якщо Ai=0] + βi.
(N.B. для тих, хто не звик до статей і книжок з математики/фізики: цифра (1) перед попередньою формулою -- це її номер, щоби потім не казати "а памʼятаєте, я колись писав формулу про таке–то", а посилатися на неї як "формула номер один".)

В цьому місці ми зробили один дуже хитрий логічний хід: ми допустили, що, принаймні в уяві, можемо порівнювати два зовсім різні сценарії, в одному з яких сталося одне, а в другому -- друге, тоді як в реалі такого не буває, в кожному з генделиків ми мали або сценарій Ai=0, або Ai=1, ніколи не обидва зразу. (Насправді, я ще не торкався важливого моменту, коли відбувається наша дія; поки що, для простоти, уявімо собі, що фігурки Курдупликів ставили або не ставили виключно 31 січня і ніколи більше, а продажі міряли в лютому. (Щось я зловживаю зауваженнями в дужках, але такий з мене непродуманий писака.)) Можливість, хай віртуально, порівнювати два різних сценарії, хоча спостерегти можемо лише один, нічим не гарантована. Але таким чином ми обходимо кілька дуже слизьких моментів і використовуємо нашу богорівну уяву, щоби замінити строгі визначення інтуіцією. А що на такому допущенні ґрунтується вся теорія імовірності сотоваріщі, то чим ми гірші? Для неофітів додам, що повний набір отаких справжніх і уявно можливих сценаріїв називається "статистичний ансамбль".

Оскільки, як я оце розпинався, ми ніколи не можемо спостерегти продажі для двох різних сценаріїв, найпростіше допустити, що це β для всіх генделиків однакове. А якщо неоднакове, то тупо оголосити, що ми шукаємо середнє, найчастіше середнього достатньо. Інтуітивно найочевиднішим сподобом оцінити наше β є просто порівняти середні продажі mean(Yi) для всіх генделиків, де Ai=1, з середнім для всіх, де Ai=0. То, що саме цей метод є інтуітивно найочевиднішим, це я вам з досвіду кажу. Не заглядаючи під кат, ви як думаєте, це нормальний підхід? )

А що саме я маю на увазі і що там далі -- в наступному випуску :)

P.S. До теми конфаундерів: нагадую!
malyj_gorgan: (Default)
Почну потрохи писати лекцію з причинності і всякого такого. Наперед дякую за коментарі і запитання -- воно мені допоможе... а вас, можливо, зацікавить. Тих же, хто все це прекрасно знає і без мене, і краще за мене (боюся, таких тут більшість) перепрошую за зайвий шум. :)

Вступ


Перше, ніж повести мови про каузальність і всяке таке, давайте подивимося на кілька базових понять статистики і теорії імовірності. Вони не викарбувані в граніті, різні джерела вживають речі трохи по–різному, тому заодно просто звіримо термінологію. Дисклеймер: це не курс статистики, а розмова "на хлопський розум", тому деякі речі я навмисне спрощуватиму. Зате важливі поняття даватиму ще і англійською.

Імовірність (Probability). Одне з найбазовіших понять в нашому житті, і при цьому до смішного неінтуітивне. Хоча найпростіший випадок ще Ок: якщо ви знаєте, що може статися кілька подій, якщо уявити безліч світів, де ці події сталися, то ймовіність події A буде писатися P(A) і дорівнюватиме частці всіх світів, де сталася подія A, а не якісь альтернативні події. Аби не сперечатися на тему чи хоч щось станеться, давайте напишу це все контексті причинно-наслідковості: у кожної дії (причини), є якісь можливі насліди A, B, C і т. д., і кожен з них має свою імовірність, так що сума всіх імовірностей
P(A) + P(B) + P(A) + ... = 1. Причинно насліддковий звʼязок можна описати ось так:
probability


Правдоподібність (Likelihood). Різниця з імовірністю в тому, що ми починаємо з якогось спостереження, тобто, ми бачимо наслідок, який може статися в результаті кількох різних причин. Нехай, у нас знову є безліч світів, у яких у всіх стався наш наслідок. Так от, правдоподібність події A, позначається L(A), -- це частка цеї безлічі світів, у якій причиною цього насліду була саме дія A:
likelihood

Давайте проілюструємо це на прикладі. Чи не найкласичнішим засобом ілюстрацій після монет є гральні кубики, а.к.а. кості. Нехай у нас є три чесних кубики (чесних -- це таких, де сторони рівноімовірні, визначення виходить рекурсивним, але вдаватися в деталі облом), і ми граємо у гру, де ми міряєму суму, яка випала на цих трьох кубиках. Розподіл імовірностей для усіх можливих сум можна побачити нижче. Імовірність викинути суму, ну, наприклад, 14, буде P(14) = 15/216 ≅ 7%, це частка комбінацій, які додаються до чотирнадцяти , з усіх можливих комбінацій, ось картинка:
a05
З імовірністю чотирнадцяти все ясно. А для того, щоби ввести правдоподібність, треба задати додаткове запитання. Нехай ви знаєте, що випала сума 14, тоді додатковим запитанням буде "а яка правдоподібність того, що на всіх трьох кубиках були різні цифри?" (Відповідь -- 40%, звідки вона взялася, сподіваюся, ви побачите самі.) Або ще: знаючи, що сума трьох кубиків різних кольорів, жовтого, білого і сірого, складає 14, скажіть, з якою імовірністю жовтий кубик показує чотири? (Порахуйте це самі, в якості домашнього завдання.)

Одною з цілей вищенаписаного було показати вам, що навіть в найпростіших випадках, коли ми знаємо, що діється, ми не можемо точно передбачити, що в результаті станеться, лише надати якісь імовірності. І навпаки, навіть коли ми якось поміряли, що в результаті сталося, ми не обовʼязково знаємо, як воно прийшло до такого результату, і можемо лише оцінити правдоподібність різних комбінацій причин. Весь цей цурес і неконкретика називаються "стохастичність".

Причинно-наслідковість / каузальність (Causality) стосується ближчого до реальності стану речей, а цей стан навіть в найпростіших прикладах є набагато складнішим, ніж перші дві картинки зі стрілочками. Почну з кінця: по-перше, у всякій життєвій ситуації наслідок рідко є чимось однозначним, а найчастіше є якийсь багатомірний простір наслідків. Який ми любимо проектувати на одну або більше лінійних числових метрик, як то "продажі товару", "сума крапочок на костях", "добре/погано", "оцінка на тесті" і ще мільйон інших. Найчастіше люблять вибрати якусь одну метрику ... що часто-густо веде до підміни усього багатства наслідків одною кількісною величиною, через що стається сама лише шкода і дуже небагато користі, бо ця одна метрика і надмірно спрощує, і неясно, чи ми правильно розуміємо механізм звʼязку цеї метрики з власне подіями. (Див. помилка Макнамари і закон Ґудгарта) По-друге, на відміну від задачок на ідеальні шестигранні кості або чесні монетки, ми майже ніколи точно не знаємо, як саме та чи інша причина впливає на наш наслідок. Власне, встановлення цього механізму і є основною задачею каузального моделювання. По–третє, крім відомих причин A, B, C з різними правдоподібностями і механізмами впливу, завжди є ще і невідомі причини. Ну і, нарешті, причини між собою ні разу не незалежні, тому, намагаючись зі спостережень встановити, як A впливає на Y, треба памʼятати, що розподіли спостережених A і Y дуже сильно розмиті всякими невідомими нам подіями і явищами, а, по–друге, що частина подій є конфаундерами, або сплутуючими факторами, такими, які одночасно впливають на A і Y, вносячи байаси і іншу статистични не-незалежність в наші спостереження.
Базова картинка причинно наслідкового, наприклад, ось:
a.03
Типова задача буде, ну, наприклад, така: нехай A -- якийсь педагогічний прийом на заняттях з англійської мови. Ну, наприклад, заміна одного із програмних творів на уроках англійської зі звичайного твору на комікс. А Y -- стандартизований тест з англійської, який учні пишуть в кінці року. Відомі причини -- всякі інші оцінки і кількості годин учнів перед тестом. Невідомі причини -- все решта, від особи вчителя до того, що того року в телевізорі показують.

Як це робиться -- я буду писати в наступних розділах, а поки що, для лінивих, розкажу основну ідею і висновок:

  1. Основна ідея: першим ділом в таких задачах доводиться допускати функціональну форму механізму залежності. Найчастіше, вибирають лінійну залежність:
    Y|A=1 = Y| A=0 + β,
    де A-нуль відповідає звичайному твору, а одиниця -- коміксу... або навпаки, суть в тому, що ми перетворюємо причину на бінарну величину (можна небінарну, підхід аналогічний).

  2. Тоді, використовуючи всякі наближення і допущення, можна порахувати значення β, його і називають причинним впливом AY

  3. Ця бета -- вона завжди і тільки описує середній ефект

  4. Будь-які спроби прикинутися, ніби ви таким статистичним способом можете порахувати індивідуальний вплив, тобто, як A вплине на Y для одного конкретного учня (як причина вплине на наслідок в конкретному семплі), майже завжди -- відверта брехня і шахрайство.

malyj_gorgan: (Default)
If you put tomfoolery into a computer, nothing comes out but tomfoolery. But this tomfoolery, having passed through a very expensive machine, is somehow enobled and no-one dare criticise it.
              -- Pierre Gallois
malyj_gorgan: (Default)
Я тут погодився ближче до кінця весни провести короткий курс з однієї з тем датазнавства, причинно-наслідкового моделювання. Тепер шукаю хороший приклад, на якому це діло добре би ілюструвати. Дані, з якими я працював професійно я, зі зрозумілих причин, використовувати не можу. Хочеться якийсь цікавий публічний датасет.
Ліричний відступ: я продовжую страждати через недосконалість української термінології в датазнавстві. Саме слово "датазнавство" я вживав і вживати буду, хай я буду такий один, це буде моя "Carthago delenda est". Але, холєра, як українською dataset? Так і писатиму, "датасет."..

Словом, не порадите, де би таке взяти? В ідеалі, це повинна бути якась велика таблиця даних, на десятки тисяч, а краще більше, рядків, з ось такими вимогами:
1. має бути один "результат", який (а) міряють (б) кількісно для кожного семпла. Ну, там, зарплата, виплата, оцінка з тесту, айкʼю індекс і т. п.
2. має бути більше двох-трьох причинних змінних, які до цього результату призводять. Вони можуть бути числовими, можуть бінарними, можна категорійними, але на кілька класів, не більше, бо потім все-одно в числа переводити
3. Одна зі змінних має бути бінарною, ми будемо рахувати вплив цієї оної змінної.

Хорошим прикладом була би, наприклад, табличка базової статистики людей, яких наймають на роботу, з усякими базовими змінними: професія (галузь), вік, стать, попередня зарплатня, освіта, роки досвіду, раса, регіон, ще щось, ну і, нарешті, зарплатня, яку цій людині запропонували при наймі. Роками точиться суперечка, чи дискримінують роботодавці *сьогодні*, допустімо, жінок чи негрів чи ще когось за їхню расу чи стать. Одні кажуть, що є дискримінація, інші кажуть, що давно нема. Це би був ідеальний спосіб ізолювати саме вплив потрібного фактору. Словом, гей, активісти, якщо у вас є тверде переконння на цю тему і набір даних, яким ви це переконання пояснюєте, покажіть мені ті дані! Буде вам прохвесійний казуальний аналіз з чесною відповіддю, можливість закрити якусь одну тему.
Бо, блін, хоч би щось знайти.... Спеціалісти зі статистики, які ці всі методи придумують, переконують себе, що воно працює через симуляцію: симулювали вхідні дані, застосували свій метод, все вийшло, і ходять щасливі, хваляться/публікуються. Але як слушно казав один мій колєґа ще з академічних часів, коли я займався діагностичними зображеннями, симуляція -- це як мастурбація, you know that the results will come to be but have no idea what would happen if you have to do it in real life :)

Profile

malyj_gorgan: (Default)
malyj_gorgan

June 2025

S M T W T F S
12 345 67
89 1011 121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 17th, 2025 05:14 pm
Powered by Dreamwidth Studios