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
#intel #stocks

"Близость достижения цели Intel по освоению пяти новых техпроцессов за четыре года инвесторов не впечатлила, а текущая структура расходов, включая себестоимость процессоров новых семейств Lunar Lake и Arrow Lake, добавила пессимизма инвесторам. Компания вынуждена сокращать расходы буквально по всем направлениям и будет вынуждена экономить на капитальных затратах, которые и были одним из главных условий потенциального преображения бизнеса процессорного гиганта. Кроме того, Intel откажется на какое-то время от выплаты дивидендов, а это держателей акций тоже не может порадовать в условиях их сохраняющейся уже не первый год отрицательной динамики. Фактически, акции Intel за пять лет подешевели более чем на 40 %, и примерно в такой же пропорции они обесценились с начала текущего года."

https://3dnews.ru/1108912/posle-otkritiya-torgov-aktsii-intel-ruhnuli-na-28-na-fone-udruchayushchego-kvartalnogo-otchyota
#series #openings #witcher

Посмотрел 1-ю серию Ведьмака - смотреть интересно, поединки на мечах отличные!

PS. Серии с 6-й скатилось в тупость ( Всё как и с супергероями-пацанами.

https://www.youtube.com/watch?v=KebuamM0ZvE
#fantasy #leguin

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

Эта комната являлась сердцем всего замка и здесь было холодно, страшно холодно – ничто не могло согреть эту комнату. Камень был древний, как сама Земля, и столь же древний и ужасный призрак был погребен в этом куске скалы. Он не ответил Серрет, не произнес ни слова, и через минуту, бросив на него любопытный взгляд, она сказала, указав на Камень:

– Это и есть тот самый Терренон. Как ты думаешь, почему мы храним такую драгоценность за семью замками?

Из осторожности Гед продолжал молчать. Возможно, Серрет испытывала его, хотя он был почти уверен, что она плохо представляла себе сущность этого Камня, и потому говорила о нем столь небрежно. Серрет знала слишком мало, чтобы бояться его.

– В чем его сила? – спросил он наконец.

– Этот Камень был создан до того, как Сегой поднял острова из Открытого Моря. Он был создан одновременно с нашим миром, и будет существовать, пока существует Вселенная. Время для него – пустой звук. Если положить на него руку и задать вопрос, он ответит, но чтобы услышать его голос, надо уметь слушать. Он говорит о том, что было, есть и будет. Камень давно предсказал твое появление здесь. Спроси его о чем-нибудь!

– Нет.

– Он ответит тебе.

– Мне не о чем спрашивать его.

– Он может подсказать тебе, – тихо произнесла она, – как одолеть твоего врага.

Гед молчал.

– Неужели ты боишься этого Камня? – спросила она, словно не веря своим ушам.

И Гед ответил:

– Да."

http://flibusta.site/b/145613/read
#fun #witcher

К таким эльфам жизнь меня не готовила!
«Объём работ, необходимых для упрощения двигателя Raptor, интеграции вторичных каналов подачи и добавления регенеративного охлаждения для незащищенных компонентов, был ошеломляющим, — пояснил Илон Маск в подписи к фотографии. Теперь для двигателя нужно меньше места и отсутствует необходимость в тепловом экране для целого ряда узлов.

«В результате Raptor 3 не требует никакого теплозащитного экрана, что исключает массу и сложность теплозащитного экрана, а также систему пожаротушения. Он также легче, обладает большей тягой и более высокой эффективностью, чем Raptor 2»,

https://3dnews.ru/1108944/izgotovlen-perviy-seriyniy-raketniy-dvigatel-raptor-3-eto-proizvedenie-iskusstva-kak-zayavil-ilon-mask
2
#featureselection

В дополнение к посту. Потестировал много вариантов улучшения исходной идеи:

1) усреднение значений Шэпли нескольких типов (с разными feature_perturbation)
2) усреднение значений Шэпли нескольких разных моделей
3) использование парных интеракций (shap_interaction_values)
4) мета-модель ML: зная индексы выбранных в комбинацию признаков и оставшихся признаков, а также честные предсказания моделек, давайте попробуем создать как мета-признаки ряд простых числовых агрегатов от шепли-значений (суммы, средние, отклонения, мин/макс и тп). ну и уже от этого мета-модель, вдруг она будет точнее чем исходная простая идея просуммировать значения Шепли выбранных в комбинацию признаков?

Находки/открытия:

1) не существует работающей реализации Shap на GPU (GPUTreeExplainer из пакета shap нерабочий, и всем похер. По идее он должен ставиться с xgboost (без shap), но он всё равно не юзает gpu, я проверял.)
2) KernelExplainer непроходимо медленен, забудьте про его использование. Речь о сотнях часов даже на небольшом датасете.
3) некоторые модели (lightgbm) считают интеракции в один поток и очень медленно (~40 минут на 100k x 20 датасете)
4) некоторые бустинги (Catboost) раздувают expected_value так, что они не просто не сходятся точно к среднему прогнозу, а превышают его вдвое. При этом внутренняя проверка shap на аддитивность проходит! ХЗ как это возможно. У других бустингов тоже такое наблюдалось, но хотя бы с гораздо меньшей амплитудой. В режиме feature_perturbation="tree_path_dependent" такого никогда не наблюдал.
5) Режим feature_perturbation="interventional" требует теневого датасета и считает значения Шэпли на порядки дольше, но ничего не даёт к точности.
6) xgboost (и только он) поддерживает доп параметр approximate=True, который отрабатывает быстрее, но реально роняет качество. его использовать не надо.
7) документация shap по-прежнему дырявая (параметры объясняльщика, которые ничего не делают, например), а на гитхабе никто по-прежнему не отвечает и не отрабатывает сигналы и проблемы юзеров. не понимаю, как они при этом релизят новые версии, скорее всего, это в основном переписывания исходного говнокода Скотта Ландберга.

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

1) все виды бустингов и все виды объясняльщиков для нашей задачи имеют примерно одинаковое качество (если не использовалось approximate=True)
2) усреднения ничего особо не меняют.
3) метамодель существенно улучшает линейную (да и другие) корреляцию, но особо не меняет метрики ранжирования комбинаций (которые и так на удивление хороши).
4) при небольшой по размеру группе кандидатов на удивление ранжирующие свойства сильно не падают.
🔥3
#featureselection

Вот внесэмпловые метрики XGBRegressor feature_perturbation=tree_path_dependent, approximate=False из предыдущего поста.

meta=мета-моделька, naive это просто сумма шэпли-значений как у автора идеи, adjusted это naive минус сумма шэпли-значений признаков не вошедших в комбинацию.

Считалось на датасете poker (10 исходных признаков + 5 фейковых случайных + 5 коррелированных с исходными). Помимо 2 видов ndgc (rel/abs), грубыми, но выразительными метриками были top_recall@k. Например, чтобы посчитать recall@10, брались 10 лучших (согласно честными прогнозам) на test комбинаций, и проверялось, сколько из них оказались в 10 лучших по версии того или иного метода.

В целом, для данной задачи нет смысла морочиться с мета-моделью, надо просто брать наивный оригинальный метод автора, и feature_perturbation="tree_path_dependent".
👍1
#featureselection #shap

Ну и теперь к практической реализации отборщика признаков на основе этой прекрасной идеи. Как это вообще сделать?

Обучать одну большую модель на всех признаках надо обязательно. Это, по счастливому совпадению, 1-й шаг всех RFE-* методов.
Далее получаем "простые" кэфы Шэпли самым быстрым (но не приближённым) методом. По желанию усредняем на CV.

И тут открывается простор для фантазии:

Полный брутфорс:

Генерим все 2^n_features сочетаний признаков, сортируем индексы признаков в сочетаниях.
суммируем шэпли-значения 1й комбинации. далее удаляем суммы убывших, прибавляем суммы прибывших в комбинацию признаков. раз в N итераций ресет суммы, чтобы сбросить накопленную ошибку суммирования.

Генетик:

Вектор 1/0 длины n_features генов - это особь популяции, её фитнесс оценивать мы умеем (суммируя его шэпли-значения и считая от них и ground truth нашу ml-метрику).
применяем направленный поиск путём скрещивания, мутаций, и прочего элитизма. Запускаем эволюцию, играем в Создателя, смеёмся страшным голосом mwa-ha-ha.

Любая другая эвристика, типа имитации отжига:

Начинаем со случайного вектора, делаем небольшие изменения, продвигаемся с вероятностью пропорциональной улучшениям, порог принятия снижается со временем.
Мультистарт. А если начинать с кандидатов ранжированных по FI?

Градиентный поиск:

Ну да, это ж бинарный вектор, нет непрерывности, как по нему дифференцировать? Есть идея применить "признаки Шрёдингера"! ))
А именно, размазать их бинарность с помощью весового коэффициента. Они могут как бы входить, а как бы и нет в комбинацию с определённым весом. А чтобы вес в итоге ограничивался промежутком [0,1], к нему можно применить сигмоиду. Тем самым autograd-оптимизатор по идее сможет найти экстремумы ML-метрики, плавно включив/исключив признаки из комбинации.

А если итоговая ML-метрика недифференцируема (типа ROC, PR AUC)? Ну тогда ведь можно взять Brier score или какую-то подходящую прокси.
Уже есть набросок кода для pytorch, попробую затестить.

Не знаю, что сработает лучше, есть надежды на градик.

В любом случае, надо дать методу оптимизации поработать (в рамках бюджета времени), и получить от него топ-N лучших кандидатов. А их уже "честно" проверить (в оставшееся время) на insample CV и вернуть самую лучшую/устойчивую комбинацию признаков.

Надо ещё помнить, что точность метода может падать при уменьшении количества кандидатов в группе по сравнению с размерностью матрицы значений Шэпли, но это обсудим позже.
#fun

Вот как надо перемещаться по элеваторам )

https://www.youtube.com/shorts/eDkScjKYotI
#python #cleancode #codegems

Реально, эти хинты так долго писать нужно ) И потом при вызове функции удалять написанное тобой же.

Annotated это вообще перебор, мне кажется. А вот с возвратом понятно именованной переменной - совет хороший.

Про сложность Halstead не слышал.

Про Legacy раздел не согласен. Меня вот тошнит от Pathlib, и я предпочитаю os.path. Какого хрена всякие индюки объявляют прекрасно работающий пакет legacy? Да ещё и в линтеры типа ruff добавляют избавление от "легаси" как правила.

Про "непитонячий питон" тоже скорее не согласен. Если ты инкрементируешь счётчик цикла вручную (вместо enumerate), то это может быть преимуществом, т.к. твой код, не использующий специфичный для языка средства, будет легко портировать на другой язык. Зависит от целей и дорожной карты проекта.

Вопрос из зала про быстрый MVP и целесообразность чистого кода в нём хорош!

https://www.youtube.com/watch?v=2m8u_QwTaQQ
1
#boostings #mlgems

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

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

Только недавно я стал исследовать возможность и эффекты добавления альтернативных классов моделей в ансамбль.

Плюс, в моих DS проектах обычно не хватало времени и/или бюджета на тюнинг гиперпараметров, и я так с потолка оценивал эффект от HPT в +- 10% - nice to have, но не критично.

Всем, кто в опросе выше выбрал 1-й вариант, я советую запустить вот такой простой пример:

import numpy as np, pandas as pd
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.metrics import root_mean_squared_error


X=np.random.normal(0,9,size=(10_000,3)) # generate 3 random features with normal distribution
X[:,0]=X[:,0]*1000 # make one feature of a bigger magnitude

y=X.sum(axis=1) # target is just an exact sum of our 3 features


model=CatBoostRegressor(verbose=0,eval_fraction=0.1)
model.fit(X,y,plot=True)


print(f"train RMSE={root_mean_squared_error(y,model.predict(X))}")

train RMSE=311.7677815427915

и попытаться понять, что происходит.

Очень большим открытием для меня стало, что бустинги не могут хорошо промоделировать даже сумму 3 случайных величин, особенно если одна их них сильно в другой шкале. Задача, с которой на ура справляется линейная регрессия!

Мне подсказали увеличить катбустовый (гипер)параметр border_count, но даже с максимальным значением RMSE всё равно высока. Ну хотя бы снижается втрое.

Какие выводы можно сделать из данного примера:

1) всегда проверяйте несколько альтернативных классов моделей, обязательно включая линейные
2) в некоторых случаях HPT даёт прирост не в 10-15, а в 300-500% (также справедливо для категориек в xgboost. ну плохо он умеет с ними обращаться, плохо). делайте HPT.
3) lightgbm с линейной регрессией в листьях (вместо константы) решает задачу LGBMRegressor (linear_tree=True)
4) в общем случае бустинги требуют в качестве препроцессора не только PolynomialFeatures для моделирования произведений, но и, похоже, "AdditiveFeatures", дающего суммы/линейные комбинации сырых признаков.
5) плохонький и простенький посчитанный численный эксперимент лучше любого предвзятого убеждения.
6) декомпозиция рулит
👍21🔥1
#trading #books #masters

Ооо даа! наконец-то добрались до меня книжки одного из лучших (imho) статистиков и дата сайентистов современности!
🔥4