Aspiring Data Science – Telegram
Aspiring Data Science
385 subscribers
465 photos
12 videos
12 files
2.15K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#category_encoders #advicewanted

У меня давно есть идея сделать свою версию category_encoders, которая
1) в TargetEncoder вдобавок к mean будет вычислять кучу других полезных статистик
2) расширит концепцию на OtherVarEncoding, т.е. будет заменять уровни категориальной переменной на статистики (mean, std, etc) другой непрерывной или ординальной переменной (не таргета)
3) вместо примитивной формулы априорной вероятности заюзает Bayes и mcmc
4) будет иметь нормальную объясняющую человеческим языком документацию

и вот в свете недавних энтропийных размышлений хочется понять, как получить хоть какие-то подсказки к пунктам 1 и 2. Особенно 2, ведь статистик можно придумать десятки, а комбинаций с другими переменными будет десятки тысяч. Как решить, какие статистики считать и по каким кандидатам-"напарникам"?

Пока для 2) есть только такая весьма поверхностная идея: если MI(target; cat_var,num_var)>MI(target; cat_var)+MI(target; num_var), только для таких пар пробовать создавать эти "уровневые статистики".
🔥1
#politics #patriots #war


Илья Яшин 2 дня назад

"Наверняка среди ваших знакомых есть люди, которые не в восторге от войны с Украиной, но предпочитают молчать или даже поддерживают агрессию. Логика их в том, что патриот не может допускать критику власти во время войны – ведь это по сути предательство. Людей, рассуждающих таким образом, много. Это основа общественной поддержки Путина.

На самом же деле, патриот вовсе не должен оправдывать любую глупость своего правительства, даже если эта глупость связана с использованием вооружённых сил. Патриот обязан защищать национальные интересы своей Родины.

Соответствует ли интересам России эта война? Нет, она им противоречит. Доказать этот тезис легко, и доказывать его необходимо. Я набросал простой мануал, способный помочь вам в спорах со знакомыми, которых вы хотите переубедить и в чьих головах вы пытаетесь посеять зерно сомнений. Всего пять пунктов.

1. До 24 февраля жизнь в России оставалась вполне спокойной, а риски, связанные с боевыми действиями, стремились к нулю. Сегодня артиллерийские обстрелы наших городов стали обычным явлением, беспилотники долетают до центра Москвы, ряд населенных пунктов на границе полностью разрушен, а Ростов пережил оккупацию мятежниками. Вывод: война нанесла удар по безопасности России.

2. Цена вторжения в Украину – сотни тысяч россиян, погибших и ставших на фронте калеками. В основном работоспособные мужчины репродуктивного возраста. Это уже создало дефицит кадров на рынке труда, а в перспективе приведёт и к спаду рождаемости. Вывод: война нанесла удар по демографии России.

3. Нападение на Украину «активизировало» НАТО и резко повысило враждебность этого блока по отношению к России. Альянс отказался от нейтральных формулировок и теперь прямо называет нашу страну угрозой, принимает в свой состав граничащие с ним государства и стягивает к нашим рубежам всё больше войск. Вывод: война угрожает глобальной безопасности России.

4. Агрессия против Украины привела к тому, что наша страна почти полностью потеряла газовый рынок в ЕС, уступив его американскому СПГ и не получив сопоставимый по объемам альтернативный рынок сбыта. Доходы государства снизились, дефицит бюджета вырос, а резервы скукоживаются. Вывод: война ударила по экономике России.

5. Русским стало сложнее адаптироваться за границей и даже просто путешествовать по миру. Наши эмигранты и туристы повсеместно жалуются на оскорбления и унижения, их называют оккупантами и фашистами. Помимо этого, наши спортсмены забанены почти во всех международных соревнованиях, включая олимпийские игры и футбольные еврокубки. Вывод: война бьет по репутации России и её граждан.

***

Итог очевиден: война против Украины по сути своей является антироссийским действием. Человек, который её поддерживает, не имеет морального права называть себя патриотом России."
#featureselection

Несколько дней плотно занимаюсь написанием своего mRMR блока отбора признаков. Огромный прогресс. Полностью перенёс старую реализацию в Питон. Исправил много ошибок. Сделал много оптимизаций. Основой я выбрал упомянутый Мастерсом алгоритм Fleuret: "Fast Binary Feature Selection with Conditional Mutual Information".

"We propose in this paper a very fast feature selection technique based on conditional mutual in formation. By picking features which maximize their mutual information with the class to predict conditional to any feature already picked, it ensures the selection of features which are both individually informative and two-by-two weakly dependant. We show that this feature selection method outperforms other classical algorithms".

Этот фильтр-блок, основанный на прямом последовательном отборе. На каждой итерации к списку S добавляется кандидат X, имеющий самый высокий критерий min I (X ;Y | Z ) по всем Z уже находящимся в S, где I (X ;Y | Z ) - условная взаимная информация между таргетом Y и кандидатом X при данном уже принятом кандидате Z. Вроде логично, если X не будет влиять на таргет, все его I будут нулевыми и он не будет принят. Если на таргет влиять он будет, но другой фактор уже объясняет это влияние, случится то же самое.

Но всё же при реализации мне несколько раз казалось, что здесь какая-то ошибка. И вот я понял, в чём она. Что если некоторый Z и X совместно влияют на таргет, а с остальными факторами кандидат X вообще никак не взаимодействует? I (X ;Y | Z ) будет очень высоким, но т.к. критерий берёт минимум по всем факторам, этот высокий вклад будет отброшен и затёрт одним из нулей, и кандидат X, очень ценный совместно с Z, алгоритм не примет.

К счастью, это легко исправить. Критерий должен выглядеть по-старому только если нет фактора, который увеличивает его знание о таргете по сравнению со средним знанием I (X ;Y) :

min I (X ;Y | Z ) if max I (X ;Y | Z )<=I (X ;Y) else  max I (X ;Y | Z )

Напишу об этом профессору, интересно, что скажет )

Также я расширил алгос рассмотрением не только индивидуальных кандидатов, но и сочетаний (2-way, 3-way etc). Если пары отрабатывают ещё быстро, то для 250 фичей троек будет уже 2.5 миллионов, что на 1 ядре работает 3 часа.

Да, кстати, я встроил расчёт надёжности с помощью случайных перестановок. Если на 40k примеров шаффлить расчёты MI 10k раз, это отсеивает 99% ложных срабатываний (когда связи на самом деле нет).

Но большая проблема в том, что начало списка могут забить мусорные факторы, которые сами по себе новой инфы о таргете не несут, но зато коррелированы с многими настоящими предикторами. Почему это происходит: хотя любой Z снижает MI такого кандидата, всё же он связан с таким большим количеством других предикторов, что всё равно побеждает всех остальных. Там более что на ранних этапах других факторов ещё не добавлено в список.

Сначала я думал, как бороться с попаданием такого мусора в список, потом понял, что это имеет свои плюсы: истинные предикторы в список всё равно попадут, просто позже, а такие "универсальные солдаты", объединяющие много истинных предикторов, можно использовать для построения самых экономных и быстрых моделей с приемлемым качеством.

Другое дело, что они не дадут добиться наивысшего качества самым мощным моделям, т.к. будут их отвлекать на шум в этих мусорных факторах.
🔥4
#featureselection

Для проблемы мусорных факторов вижу 2 решения:

1) модифицировать критерий приёмки, чтобы он смотрел условные MI не по одиночным факторам, а по 2-way сочетаниям. Это уже отсеет значительный % мусорных факторов, которые коррелируют с 1 или 2 другими предикторами. Обязательно повторить эти расчёты по завершении отбора, когда сформирован полный набор факторов. Это наверняка отсеет некоторых кандидатов. Главное, учитывать, кто стал причиной отсева, чтобы не удалить причину и следствие одновременно )

2) делать пост-анализ по всем попавшим в финал кандидатам: кто связан с каким количеством других факторов, какое количество информации с ними разделяет, в % к своей собственной энтропии. Можно даже спуститься вниз по уровню и посчитать взвешенные суммы тех же метрик для его партнёров. Тем самым можно косвенно определить, какие фичи скорее всего просто сливные бачки, и попробовать их выбросить. В итоге мы получим:

ценные фичи, которые ни с кем другим не связаны, кроме мусорных и таргета. они содержат уникальное знание;

потенциально мусорные X, которые связаны с множеством других, и шарят очень много общей инфы с другими факторами Z, при том, что эти другие факторы имеют много уникального знания о таргете помимо X: sum(I(Y;Z|X))>e;

все остальные "середнячки"
.

Лучше идеи у меня пока нет, т.к. если это будет задача на временные ряды, где есть зависимость по 100+ лагам, я не знаю способа, как высчитать именно уникальную информацию фичи. Ладно бы 2-3, для этой мерности MI и CMI я посчитать ещё могу, но что-то мне подсказывает, в реальности будет сотни и тысячи. Буду рад советам.

Ах да, упомянутый недавно алгоритм PLD/MIFS для учёта избыточности просто считает среднюю взаимную информацию уже отобранных факторов с кандидатом. Но это тоже не идеальное решение, т.к. если кандидат А связан с факторами Б и В, усреднение (или суммирование) сработает только если Б и В независимы.
#featureselection

Работаю над пост-анализом кандидатов в предикторы, отобранных FS алгосом. Решил представить их как граф друзей )

Размер узла=энтропии фактора. Толщина и цвет ребра=взаимной инфе 2 факторов.

Направление стрелки зависит от ADC.

Зелёные узлы - уникальные факторы, красные - предположительно "мусорки".
#numba #codegems #shuffle #random #numpy

На удивление, нумба ускоряет и функции нампай для работы со случайными числами. Пользуйтесь!
#distributions #brokeback

Как вам такое распределеньице? )
#trading #backtesting #masters

"Thank you Dr. Masters for an outstanding sharing of your insight and experience and for agreeing to be interviewed! The clear denoscriptions of Monte Carlo Permutation Tests (MCPT-3 variants) and application BEFORE looking at precious out-of-sample data, Parameter Sensitivity, Stationarity, Entropy, Predictive Indicators and Bootstrapping are tremendously helpful to me as a strategy developer. I realize now that MCPT needs to be added to my strategy development process as well as the other elements you've articulated. Thank you, Andrew, for continually bringing gifted trading professionals to Better System Trader here on Youtube!"

https://www.youtube.com/watch?v=1RKz9v_0WDo
Есть большой массив Numpy с результатами вычислений. На очередной итерации вам надо его обнулить. Что сработает гораздо быстрее:
Anonymous Quiz
47%
a = np.zeros(shape)
17%
a[:,:] = 0
36%
a.fill( 0)
#featureselection #diogenes

Кипит работа над отборщиком признаков. Вчера провел много тестов, профилирования, оптимизаций. План на сегодня:

1) модуляризировать, разбив на мелкие хорошо читаемые функции. а то пока что это огромное полотно кода.
2) подключить многоядерность (numba или joblib/dask)
3) добить постанализ: больше мерности, добавить показатели иерархии, сделать доп. вывод деревом.
4) сделать этот FS совместимым с sklearn

Ну ладно, будем реалистами, это не на сегодня, а скорее на несколько ближайших дней. Кстати, после консультаций с AI определилось имя проекта: Диоген )

Diogenes of Sinope (c. 412-323 BCE) was a Cynic philosopher known for his extreme simplicity, ascetic lifestyle, and highly selective approach to life. He rejected societal norms, material possessions, and conventional values, living in minimalistic conditions.

One of the most famous anecdotes about Diogenes highlights his selectiveness and disregard for social conventions. He was known to carry a lantern during the day, claiming to be searching for an honest person but never finding one. This act symbolized his highly critical and selective stance toward human behavior and moral integrity.

Diogenes also practiced what he called "autarky," which meant self-sufficiency. He believed in rejecting desires and wants, demonstrating a selective attitude towards material possessions and comforts. He was known for living in a large ceramic jar, or "diogenes," which further emphasized his rejection of societal norms and his selectiveness in embracing only what was essential.

Through these behaviors and attitudes, Diogenes exemplified a highly selective and discerning approach to life, values, and human interaction. His actions challenged conventional ideas and highlighted his commitment to living in accordance with his own principles, even if they were unconventional or extreme.
1
#numpy #numba #codegems #calloc

Итак, выяснилось, что numpy.zeros делегирует вызов сишной calloc, и на самом деле читит. Если тестировать инициализацию массива с реальной записью хотя бы 1 элемента, всё стаёт на свои места. .zeros() чуть медленнее остальных, .fill(0) несущественно быстрее двоеточий. Но удивительно, что нумба медленнее в 2-8 раз.

shape = (10000, 10000)
a = np.zeros(shape, dtype=np.int64)

def alloc_new(a):
a = np.zeros(shape, dtype=np.int64)
a[500, 500] = 1
return a

def numpy_fancy_assign(a):
a[:, :] = 0
a[500, 500] = 1
return a

def numpy_fill(a):
a.fill(0)
a[500, 500] = 1
return a

def cyclces_assign(a):
for i in range(a.shape[0]):
for j in range(a.shape[1]):
a[i, j] = 0
a[500, 500] = 1
return a

njitted_funcs = []
funcs = (alloc_new, numpy_fancy_assign, numpy_fill, cyclces_assign)
for func in funcs:
njitted_func = njit(func)
njitted_func(a) # test call
njitted_funcs.append(njitted_func)
1
#numpy #numba #codegems #zeros

История с zeros не закончилась )) Открылись новые факты. Я подумал, нумба показалась медленной из-за переключения контекста, поэтому внутри каждой функции выше просто сделал цикл до 10, чтобы основную работ вести внутри контекста. К примеру,

def numpy_fancy_assign(a):
for _ in range(10):
a[:, :] = 0
a[500, 500] = 1
return a

и т.д.
Выводы из прошлого поста подтвердились: numba-версии действительно медленнее numpy-евских, КРОМЕ a[:, :] = 0, которая одна-единственная при выполнении в контексте numba в 5 раз быстрее зануляет numpy-массив, чем сам numpy.

Оптимальная тактика на сегодня: массив создавать надо вне numba с помощью .zeros(), а обнулять его вызовом a[:, :] = 0 внутри numba (если, конечно, это надо делать много раз). Feature request чтобы нумба редиректила на np.zeros.
#featureselection #diogenes

Придумал ещё несколько полезностей для Диогена:

1) мультитаргет. у меня уже и так можно использовать в качестве таргета многомерный вектор (что бы это ни значило), в таком случае влияние факторов будет оцениваться совместно на все указанные компоненты. но иногда есть много таргетов, для которых надо найти лучшие факторы (и потом построить модельки) по отдельности. В таком случае для энтропийных методов можно СИЛЬНО сэкономить время, меняя только часть слагаемых в формулах. Это, кстати, позволит эффективно просчитывать факторы для multilabel classification.

2) бюджет времени. у меня сейчас можно искать лучшие факторы с остановкой по 3 критериям:

пока ценность новых кандидатов не станет меньше порога;

пока самые перспективные кандидаты не "провалятся" при перестановочном тестировании более N раз подряд

пока не исчерпается лимит взаимодействий, которые хочется проверить (обычно от 1 до 3).

думается, неплохо бы сюда добавить и максимальное время выполнения. типа, "найди мне лучшие объясняющие факторы, какие сможешь за 5 минут". ну или час. итд.

3) GPU. Можно попробовать cuda-возможности numba. И/или заюзать cupy, я в бою ещё не пробовал это.

4) Dask. Пока ещё думаю, как реализовать многоядерность на CPU. Наверное, лучше сразу на joblib делать, чтобы было совместимо с Dask.

У меня несколько блоков, подлежащих параллельным вычислениям:

предварительная оценка всех кандидатов против уже отобранных - можно разбивать поровну на число воркеров, по завершении синхронизировать кэши

финальная оценка лучшего кандидата MCPT с большим количеством перестановок - можно разбивать повторения по воркерам, результаты суммировать

пост-анализ, когда все прошедшие отбор кандидаты пересчитываются против остальных финалистов:
а) еще раз по критерию Fleuret, на этот раз на полном множестве конкурентов, с возможным отсевом
б) на предмет коллинеарности по критерию взаимной информации, с возможностью учета 2-, 3-way связей

ну тут тоже параллелится весьма очевидно

5) Если ограничиться 1-way взаимодействиями, то можно применять и другие критерии вместо энтропийных. corcoeff, ftest, Kendall’s Tau, Spearman’s rho, etc. Избыточность оценивать можно ещё с помощью метода PLD, когда с уже выбранными факторами у кандидата считается информация не по таргету условная по фактору взаимная, а просто средняя взаимная кандидатов и фактора.
Тест на знание английского! Не заглядывайте в словарь ) Что означает слово trepidation?
Anonymous Quiz
13%
трепет
0%
репутация
16%
гнев
42%
воздержание
29%
такого слова в английском нет
👍1
#postgres #db

А тем временим готовится к релизу Постгре 16.

Из интересного:

Allow parallelization of FULL and internal right OUTER hash joins (Melanie Plageman, Thomas Munro)
Allow optimization of always-increasing window functions ntile(), cume_dist() and percent_rank() (David Rowley)

Add system view pg_stat_io view to track IO statistics (Melanie Plageman)
Record statistics on the last sequential and index scans on tables (Dave Page) This information appears in pg_stat_all_tables and pg_stat_all_indexes.

Create a predefined role and grantable privilege with permission to perform maintenance operations (Nathan Bossart) The predefined role is is called pg_maintain.
Add predefined role pg_create_subnoscription with permission to create subnoscriptions (Robert Haas)

Add support for regular expression matching on database and role entries in pg_hba.conf (Bertrand Drouvot)

Allow NUMERIC to process hexadecimal, octal, and binary integers of any size (Dean Rasheed) Previously only unquoted eight-byte integers were supported with these non-decimal bases.
Allow underscores in integer and numeric constants (Peter Eisentraut, Dean Rasheed) This can improve readability for long strings of digits.
Accept the spelling "+infinity" in datetime input (Vik Fearing)

Allow parallel application of logical replication (Hou Zhijie, Wang Wei, Amit Kapila)

Allow the STORAGE type to be specified by CREATE TABLE (Teodor Sigaev, Aleksander Alekseev) Previously only ALTER TABLE could control this

Allow subqueries in the FROM clause to omit aliases (Dean Rasheed)

Change date_trunc(unit, timestamptz, time_zone) to be an immutable function (Przemyslaw Sztoch) This allows the creation of expression indexes using this function.
Add functions array_sample() and array_shuffle() (Martin Kalcher)
Add aggregate function ANY_VALUE() which returns any value from a set (Vik Fearing)
Add function random_normal() to supply normally-distributed random numbers (Paul Ramsey)
Add error function erf() and its complement erfc() (Dean Rasheed)

Add libpq option sslcertmode to control transmission of the client certificate (Jacob Champion) The option values are "disable", "allow", and "require".

Add LZ4 and Zstandard compression to pg_dump (Georgios Kokolatos, Justin Pryzby)
Allow pg_dump and pg_basebackup to use "long" mode for compression (Justin Pryzby)

Add support for SSE2 (Streaming SIMD Extensions 2) vector operations on x86-64 architectures (John Naylor) вот это странно, этой поддержки не было, чтоль?
Add support for Advanced SIMD (Single Instruction Multiple Data) (NEON) instructions on ARM architectures (Nathan Bossart)

Require Windows 10 or newer versions (Michael Paquier, Juan José Santamaría Flecha) Previously Windows Vista and Windows XP were supported. Вот это вряд ли можно считать улучшением.


https://www.postgresql.org/docs/16/release-16.html
#poetry #music #mantus #deutsch #translation

An empty vessel by the shore's edge roams,
A forgotten orphan left to wither alone,
Tulips, decayed, on asphalt they lie,
The night wraps itself in a mute lullaby.

Birds circle and then take their flight,
From the sky descends the final rite,
The owl flees its forest domain,
Blood drips from trees like crimson rain.

Words that once echoed now faded away,
Legends of unity in disarray,
A darkened sea consumes dreams in decay,
Of us, not a trace, all led astray.

The deceased repose in their earthen bed,
A stranger's gaze, a fleeting shred,
Drawn into solitude, voices worn thin,
All that remains is the quiet within.

Elven fury scalds the pale moon's light,
The black plague reigns, a grievous blight,
In damp warmth, a sultry shimmering gloom,
And the stool falls silently in the room.

оригинал

"Ein leeres Boot, das am Ufer treibt
Ein Waisenkind, das vergessen bleibt
Die Tulpen modern auf dem Asphalt
Die Nacht hüllt sich in Schweigen

Die Vögel kreisen und ziehen fort
Vom Himmel tönet der Schlussakkord
Die Eule flüchtet aus ihrem Wald
Das Blut tropft von den Bäumen

Die Worte sind schon längst verhallt
Legenden von Zusammenhalt
Ein dunkles Meer verschluckt den Traum
Von uns ist nichts geblieben

Der Tote sinkt ins Grab zurück
Den Fremden streift ein letzter Blick
Man schließt sich ein, man redet kaum
Von uns ist nichts geblieben

Ein kalter Abend zieht schnell heran
Ein Krieger rudert durch tiefen Schlamm
Der weiße Magier sucht das Exil
Ein Haus versinkt im Nebel

Der Zorn der Elfen verbrennt den Mond
Die schwarze Pest über allem thront
Und feuchte Wärme, sie flimmert schwül
Und lautlos fällt der Schemel

Die Worte sind schon längst verhallt
Legenden von Zusammenhalt
Ein dunkles Meer verschluckt den Traum
Von uns ist nichts geblieben"


https://www.youtube.com/watch?v=Br1LgdnmQcQ
#ml #applied #dyakonov #pzad #featureselection #permutationimportance #mid #pfi #boruta #ace

Artificial contrasts with ensembles - примечательный метод. Ещё интересна идея, что в обёрточных методах FS оценивать важность признаков надо не тем классом моделей, который будет в итоге обучаться для решения самой ML задачи.

https://www.youtube.com/watch?v=ZRa7-F5PvRk&list=PLaRUeIuewv8CMFox0oEjlyePUhUmo-x0h&index=28