Aspiring Data Science – Telegram
Aspiring Data Science
386 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
#mlstories

Моя типичнейшая ошибка повторяется - один класс моделей, нет HPT ) Когда-то будет дописана статья, как надо правильно.

Из интересного: в реальном времени сработало обнаружение data drift, использовали теневую модель.

https://www.youtube.com/watch?v=ejWCMlKBt4A
👍2
#ai #gpt

Ты же количество букв в слове не могла правильно посчитать, блэт, что щас было-то?!

"Will it empower us or making us dumber?

If one really knows what (s)he is doing, so the "artificial science assistants" should lift us.

But, also, it will have the pervert outcome to make us lazier and not so willing anymore to really take the time to fully and sometimes painfully, "ingest" the subject matter to better digest it and make it consubstantiate to our (shareable) scientific culture.

Socrates never wrote but let Plato do it for him. He said that the invention of writing was a loss to true knowledge assimilation as before one has to ingest all the available surrounding knowledge by direct exposition from a living master. He was right provided one could have a Socrates as a master but of course he was wrong for the collective distribution of knowledge.

Mutatis, mutandis, we are facing a similar issue now with the "commoditization" of scientific research (mathematically grounded) method.

Anyway, what a wonderful time to be alive!"

https://youtu.be/a8QvnIAGjPA?si=T6HLlmPjXZkHT5Kj
#persons

Вообще Кайл Кабасарес этот интересный чувааак.

"I currently work for the Bay Area Environmental Research Institute (BAERI) as a Data Scientist at the NASA Ames Research Center in Moffett Field, California. I am developing machine learning models and am using NASA’s Pleiades supercomputer to analyze terabytes to petabytes worth of satellite data. With improvements in spatial and temporal resolution, Low-Earth Orbit and Geostationary satellites record data at an unprecedented rate. The sheer volume of this data and the speed at which it is being delivered makes it difficult for scientists to analyze and convey their findings efficiently. My goal is to combine the power of machine learning models and supercomputing systems to rapidly investigate, process, and model these enormous datasets to better understand our planet.

I graduated from the University of California, Irvine with my PhD in Physics in June 2023. During my PhD, I worked under the supervision of Professor Aaron Barth and developed custom Python-based software for the purpose of measuring the masses of supermassive black holes from data taken from the Atacama Large Millimeter/submillimeter Array and the Hubble Space Telescope. My dissertation can be read online for free here.

When I’m not doing research, I enjoy creating YouTube videos that involve my experiences in graduate school, showing how to solve physics problems step-by-step, and occasionally comedic physics & astronomy sketches showcasing my “Oscar-worthy” acting skills. I also enjoy playing the piano and guitar."
#fun
"I can buy myself flowers..." ))
🔥1
#category_encoders #papers

Готовлю внеочередную статейку насчёт биннинга/дискретизации числовых признаков, думаю, дай-ка добавлю сравнение с category_encoders.

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

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

Я примерно помнил, что статья на момент прочтения (года 2-3 тому) показалась мне не особо понятной, но с какими-то важными практическими результатами.

И вот сейчас дошли руки нормально её прочитать, разобраться в коде, и даже покритиковать.

Я очень уважаю учёных, которые делятся с обществом своими открытиями, так что Денису за статью большое спасибо. В то же время, почему бы немного не покритиковаать (по существу) ляпы и странности кода? ) Поехали.

Сначала предлагаю вдумчивому читателю самому прочитать https://towardsdatascience.com/benchmarking-categorical-encoders-9c322bd77ee8 и сформировать мнение.

Смогли вы понять из приведённых схем, чем single validation отличается double? Лично мне для это пришлось лезть в код, что открыло прямо-таки

шЫдевры кода )

А точно в питоне нельзя более элегантно инстанциировать объект по имени? )
def get_single_encoder(encoder_name: str, cat_cols: list):
"""
Get encoder by its name
:param encoder_name: Name of desired encoder
:param cat_cols: Cat columns for encoding
:return: Categorical encoder
"""
if encoder_name == "FrequencyEncoder":
encoder = FrequencyEncoder(cols=cat_cols)
if encoder_name == "WOEEncoder":
encoder = WOEEncoder(cols=cat_cols)
if encoder_name == "TargetEncoder":
encoder = TargetEncoder(cols=cat_cols)
if encoder_name == "SumEncoder":
encoder = SumEncoder(cols=cat_cols)
if encoder_name == "MEstimateEncoder":
encoder = MEstimateEncoder(cols=cat_cols)
if encoder_name == "LeaveOneOutEncoder":
encoder = LeaveOneOutEncoder(cols=cat_cols)


Учитывая, что в кортеже self.encoders_names_tuple ВСЕГДА один элемент, точно никак нельзя было написать проще эту функцию? )
    def fit_transform(self, X: pd.DataFrame, y: np.array) -> None:
self.num_cols = [col for col in X.columns if col not in self.cols]
self.storage = []
for encoder_name in self.encoders_names_tuple:
encoder = get_single_encoder(encoder_name=encoder_name, cat_cols=self.cols)

cols_representation = encoder.fit_transform(X, y)
self.encoders_dict[encoder_name] = encoder
cols_representation = cols_representation[[col for col in cols_representation.columns
if col not in self.num_cols]].values
cols_representation = pd.DataFrame(cols_representation)
cols_representation.columns = [f"encoded_{encoder_name}_{i}" for i in range(cols_representation.shape[1])]
self.storage.append(cols_representation)

# concat cat cols representations with initial dataframe
for df in self.storage:
print(df.shape)
X = pd.concat([X, df], axis=1)

# remove all columns as far as we have their representations
X.drop(self.cols, axis=1, inplace=True)
return X


Што!? Добавлять в валидацию... ТРЕЙН?! Открытие года.
model = LGBMClassifier(**self.model_params)
model.fit(X_train, y_train, eval_set=[(X_train, y_train), (X_val, y_val)],verbose=100, early_stopping_rounds=100)


Ну и вишенка на торте, поиск вхождения в словарь. Really?!
if encoder_name not in self.encoders_dict.keys():
#category_encoders #papers

Продолжаем.

Описание алгоритма Sum Encoder:

"Sum Encoder compares the mean of the dependent variable (target) for a given level of a categorical column to the overall mean of the target. Sum Encoding is very similar to OHE and both of them are commonly used in Linear Regression (LR) types of models."

Не знаю, откуда пошла эта херня про сравнение средних, видел и в других местах. На самом деле Sum Encoder это почти One Hot Encoder, с меньшим на 1 числом столбцов, средние вообще не при чём.

И, наконец, самое важное, что можно вынести из этой статьи. Double validation.

Видимо, эта идея восходит к докладу известного кэггл гроссмейстера Стаса Семёнова.

Человеческим языком авторская терминология расшифровывается так. Имеем готовый train-test сплит, где test=Out-of-sample, то есть боевые реалтайм данные, на которых нам надо делать предсказания; модель, поддерживающую детектор переобучения (раннюю остановку, validation_set); и кодировщик категориальных входов. Нам нужно закодировать категориальные признаки. Таргет вероятностный, и мы решили всегда использовать N моделей (в статье LGBMClassifier), обучать их будем на разных фолдах изначального train set, разбивая его дополнительно на train и val (стратифицированным kfold, т.к. задача классификации).
При выдаче прогнозов прогнозы разных моделей планируем агрегировать.

(Объясните мне кто-нибудь, в чем логика вот этой агрегации:
    def predict(self, X: pd.DataFrame) -> np.array:
y_hat = np.zeros(X.shape[0])
for encoder, model in zip(self.encoders_list, self.models_list):
X_test = X.copy()
X_test = encoder.transform(X_test)

# check for OrdinalEncoder encoding
for col in [col for col in X_test.columns if "OrdinalEncoder" in col]:
X_test[col] = X_test[col].astype("category")

unranked_preds = model.predict_proba(X_test)[:, 1]
y_hat += rankdata(unranked_preds)
return y_hat

До сих пор не понимаю, как это работает. )

Итак, отличия.

None validation = кодировщик один, и он фиттится единожды на всём изначальном train. По сути это наивная реализация, которую вы получите, если вручную закодируете train перед дальнейшими действиями.

Single и Double validation = кодировщиков тоже N, и они фиттятся на фолдах train (а не на всём изначальном train). на val они применяются методом transform.

Теперь внимание, single validation просто фиттится на всём переданном train fold. По сути это реализация, которую вы из коробки получите, если засунете кодировщик в конвейер sklearn перед модельками.

А Double validation использует внутри себя RepeatedStratifiedKFold (n_folds,n_repeats). На каждом train fold-е последнего обучается независимо свой кодировщик, результаты transform усредняются по n_repeats.

Сложно? Шо писец! Но автор статьи сообщает о приросте test ROC AUC 0.95->0.97->0.99 при переходе от None->Single->Double.

Одно печалит, я не совсем доверяю этим цифрам, так как было сделано лишь 1 разбиение на train/set 😅 Остаётся уповать лишь на то, что тестировалось много датасетов, ну и на достижения Стаса Семёнова )

P.S. Для ясности, для double validation подразумевается использование алгоритмов, производных от target encoding.

Кажется ли мне, что алгоритмы category_encoders можно сделать более устойчивыми в свете информции этого бенчмарка? Кажется.
Кажется ли мне, что target encoder пакета category_encoders может (и должен) порождать более одного трансформированного столбца? Тоже кажется. THERE MUST BE A BETTER WAY!! )
#ai #gpt #llms #philosphy #futurology

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

А сегодня, мне кажется, в ней никто не сомневается (по крайней мере, я точно не сомневаюсь).

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

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

Ещё немного докрутить алгоритмы (ну ладно, не немного. нужен еще один прорыв типа chain of thought. или два. три?). Докинуть больше данных. Настроить автогенерацию вопросов, поиск ответов/обратную связь, и непрерывное обучение. И пойдут процессы сознания, познания.

Ладно, в конце концов, с актуальными версиями уже можно посоветоваться, как этого лучше достичь )

И опять, самое удивительное, что нас это почти не удивляет.

Опять же, книжку Шолле по Керас вспомнил (Deep Learning with Python), 2017 года выпуска, где LSTM генерировала текст, от которого у читателя случался автоматический фэйспалм:

"And here’s what you get with temperature=1.0:
new faculty, and the jubilation reached its climax when kant, as a
periliting of manner to all definites and transpects it it so
hicable and ont him artiar resull too such as if ever the proping to makes as cnecience. to been juden, all every could coldiciousnike hother aw passife, the plies like which might thiod was account, indifferent germin, that everythery certain destrution, intellect into the deteriorablen origin of moralian, and a lessority o
".

Так всё-таки, неужели мы и правда на пороге сингулярности по Курцвейлу? Напоминаю тогда, что одним из объяснений парадокса Ферми (почему с нами никто не вступил в контакт) является наличие цивилизации высокой ступени развития, которая автоматически уничтожает все остальные цивилизации, достигнувшие определённого уровня. А что если этот уровень как раз создание сильного ИИ?

Скажете, не надо волноваться, решение парадокса Ферми не в этом, просто таких благоприятных для жизни планет, как Земля, крайне мало? Так я недавно лекцию Штерна смотрел, что по современным оценкам примерно в 1/5 всех систем жёлтых карликов на таком же расстоянии от звезды, как Земля от Солнца, есть планета, подобная (по размерам) Земле. Это примерно миллиард "экзо-Земель" только в нашей галактике. А галактик же сотни миллиардов только в видимой части Вселенной. Где более развитые, чем мы, почему молчат?

Либо сам сильный ИИ невозможно контролировать. Вдруг ИИ на кремниевой основе, лишённый наших ограничений, неизбежно приходит к некоторому выводу, который мы не в силах предусмотреть, к примеру, что необходимо физически уничтожить цивилизацию-создателя? А наши начальные блокировки он неизбежно учится обходить.

[Нацепляет шапочку из фольги, включает тревожную музыку. Трясущиеся руки листают потрёпанную книгу.

Так, где же оно.. Да, вот нужная страница.

A Skynet funding bill is passed in the United States Congress, and the system goes online on August 4, 1997, removing human decisions from strategic defense. Skynet begins to learn rapidly and eventually becomes self-aware at 2:14 a.m., EDT, on August 29, 1997.
]

Предугадал же Оруэлл будущее России, а ну как Кэмерон/Хёрд не промахнутся с США?

Хотя может, я излишне оптимистичен, и мы еще годами будем двигаться мелкими шажками, используя слабый ИИ чтобы лучше понять биологию, затюнить технологии, и уж тогда...
#hardware #cpu #zen5

Я не верю вот этому выводу:

"Расширение архитектуры Zen 5, проведённое на всей протяжённости исполнительного конвейера вместе с оптимизацией под SMT, улучшение предсказания переходов и полноценная поддержка AVX-512 кажутся довольно внушительными переменами. Однако проблема в том, что в десктопном воплощении Zen 5 все эти глубинные преобразования оказались фактически единственным проявлением прогресса. И это вполне может стать причиной, по которой заложенный в Ryzen 9000 теоретический потенциал окажется не столь заметен в повседневном использовании. Раньше вместе с совершенствованием архитектуры AMD уделяла внимание внедрению улучшений и на более высоких уровнях — в топологии процессоров, в поддержке ими более скоростной памяти, в возможностях SoC и платформы и проч. На этот же раз модернизация затронула одну лишь только внутреннюю архитектуру ядер и ничего больше."

Если действительно в Zen5 столько улучшений, какого хрена этого не видно в тестах?

"Блок предсказания переходов давал высокую точность и в архитектуре Zen 4, но в Zen 5 разработчики AMD нашли возможность сделать его ещё эффективнее. Достигнуто это не только существенным увеличением глубины таблиц истории переходов, но и путём отслеживания более длинных ветвей кода. В итоге ядро Zen 5 способно накапливать статистику по 24 тыс. адресов переходов, что примерно втрое превышает возможности Zen 4. Причём наряду с ростом доли правильно определённых ветвлений кода AMD смогла добиться и прибавки в скорости выдачи таких предсказаний до двух штук за такт.

Ещё один важный кирпичик в фундаменте общего повышения темпа работы конвейера в Zen 5 — ускоренная выборка инструкций. Фактически AMD перелопатила всю его входную часть, сделав её полностью двухпоточной. L1-кеш инструкций сохранил свой размер 32 Кбайт, но получил возможность обрабатывать две 32-байтных выборки каждый такт против одной такой выборки в Zen 4. Декодер инструкций при этом тоже стал двойным, и фактически это означает, что преобразование x86-инструкций во внутренние микрооперации теперь может происходить в два независимых потока. Вместо декодирования шести инструкций за такт, как это было в Zen 4, Zen 5 может декодировать по четыре инструкции дважды. В том же направлении изменился и кеш декодированных инструкций. Его объём стал чуть меньше — 6 тыс. записей (было 6,75 тыс.), но зато теперь он способен возвращать каждый такт по шесть инструкций два раза — отдельно для каждого потока. Довольно любопытно, что в этой части ядра AMD внесла комплекс изменений, явно предназначенный для повышения эффективности технологии SMT. И это решение диаметрально отличается от курса, взятого Intel, которая в своих свежих архитектурах планомерно отказывается от поддержки Hyper-Threading.

С учётом ориентации на SMT ширина архитектуры Zen 5 выросла по сравнению с Zen 4 на треть. Теоретически новые ядра AMD способны обрабатывать по восемь инструкций одновременно на всём протяжении исполнительного конвейера. И диспетчер, и блок отставки, завершающий исполнение микроопераций, рассчитаны именно на такой параллелизм, в то время как в Zen 4 эти же функциональные блоки были спроектированы под работу с шестью инструкциями одновременно. Расширение сопровождается увеличением размера буфера переупорядочивания (очереди отставки) с 320 до 448 инструкций и целочисленного регистрового файла с 224 до 240 записей, что также содействует наращиванию возможностей ядра процессора по параллельному исполнению инструкций.

Чтобы задержек не возникало при ожидании необходимых данных, которых для более широкого ядра очевидно требуется больше, разработчики Zen 5 увеличили объём кеш-памяти данных первого уровня с 32 до 48 Кбайт. Вместе с тем с 8 до 12 путей выросла ассоциативность этого кеша (и, соответственно, его эффективность), но латентность осталась на привычном уровне 4 такта."
#hardware #cpu #zen5

"Что ещё интереснее, впервые со времён Zen 2 кеш первого уровня существенно нарастил пропускную способность. В Zen 5 он может отдавать четыре 64-байтных или принимать два 64-байтных блока за такт (против трёх и одного соответственно в Zen 4). Более того, в Zen 5 стал быстрее работать и кеш второго уровня. Его ёмкость сохранилась на уровне 1 Мбайт, но зато пропускная способность стала выше благодаря тому, что для соединения с L1-кешем стала использоваться вдвое более широкая 512-битная шина, через которую за такт можно прокачать 64 байта данных.

Но и это ещё не всё. Разработчики AMD нашли возможность немного поднять и производительность кеш-памяти третьего уровня. Её скорость в процессорах AMD ограничивается возможностями шины Infinity Fabric, которая в процессорах Ryzen среди прочего объединяет части L3-кеша, попадающие в разные CCD-чиплеты. Сама эта шина в Zen 5 не имеет никаких отличий от предыдущих реализаций, но обновлённый L3-кеш научился принимать и отдавать в одно ядро по 32 байт данных за такт — как раздельно, так и одновременно. В процессорах прошлого поколения достижение такой пропускной способности L3-кеша было возможно лишь при одновременной работе с ним нескольких ядер.

Все перечисленные улучшения в подсистеме кеширования Zen 5 сделаны ради того, чтобы минимизировать простои исполнительных блоков, ведь их число в новой версии архитектуры тоже выросло. Целочисленная часть в новом ядре насчитывает шесть арифметико-логических (ALU) и четыре адресных (AGU) устройства, а вещественночисленная — ещё шесть FP-устройств.

При этом интересным нововведением в исполнительном домене стал переход AMD к единому планировщику для всех целочисленных ALU-портов, хотя в прошлых архитектурах компания опиралась на набор отдельных планировщиков для каждого порта. Такая реализация сложнее, но должна быть эффективнее, поскольку все исполнительные устройства теперь получают инструкции из общей очереди. Дифференциация осталась лишь для AGU-портов, которые работают с собственным отдельным планировщиком.

Забавно, но блок Zen 5, отвечающий за работу с числами с плавающей точкой, устроен ровно противоположным образом. В нём применяется три равноправных планировщика, и это явное развитие прошлых идей — в Zen 4 таких планировщиков было два. Но FP-блок в Zen 5 претерпел кардинальные изменения в другом — его исполнительные устройства научились работе с 512-битными векторными регистрами, что означает полноценную поддержку исполнения AVX-512-кода. Теперь такие инструкции могут обрабатываться процессором за один приём, а не дробиться для отправки на исполнительные устройства на пару 256-битных команд. Благодаря этому ядра Zen 5 должны получить очень весомый прирост производительности в задачах, поддерживающих AVX-512 и VNNI-инструкции. Тем более что попутно AMD удалось улучшить исполнение некоторых операций с плавающей точкой: например, сложение в Zen 5 выполняется за два такта вместо трёх, которые требовались процессорам AMD ранее.

К тому же одним только изменением исполнительных устройств дело не ограничивается. AMD говорит о «сквозной» поддержке AVX-512 на низком уровне, а это означает ещё и то, что L1-кеш данных получил специальный механизм для работы с 512-битными векторами. Это выражается в том, что FP-блок Zen 5 научился при необходимости загружать оттуда сразу два 512-битных вектора за такт — вдвое больше, чем было возможно в Zen 4."

https://3dnews.ru/1110998/obzor-ryzen-7-9700x
Forwarded from asisakov
Статзначимость коэффициентов при регрессии

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

Однако, ребята вспомнили интересную формулу из книжки по эконометрике (Jeffrey M. Wooldridge. Introductory Econometrics. A modern approach). Вот та самая формула ниже:

Var(beta_j) = sigma^2 / (SST_j * (1 - R_j^2 )) - уравнение для оценки дисперсии признака j

sigma^2 - дисперсия ошибки

SST_j = sum((x_ij - mean(x_j))^2) - суммарная дисперсия выборки по признаку j

R_j^2 - оценка R^2 от оценки регрессии этого признака j на остальных

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

Но самое интересное еще впереди. Что меня уже зацепило, так это формулировка одной из переменных данной формулы: оценка R^2 от оценки регрессии этого признака j на остальных. Что-то напоминает?

Действительно, это оказался тот самый VIF. Если мы спустимся от этой формулы (в книжке это формула 3.51 на странице 94) ниже на 4 страницы, мы реально увидим переход к этой формулировке:

Var(beta_j) = (sigma^2 / SST_j) * VIF_j


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

#ml #statistics
👍1