- Видео 22
- Просмотров 13 139
Алгоритмы ML с нуля на Python
Россия
Добавлен 26 янв 2021
defa7e01-8806-439d-bf3a-e1f0abb36fd6
Истребитель Fw190 A-8. Бумага, сборка.
Сборка из бумаги немецкого истребителя времён Второй мировой войны и фотосессия с другими моделями истребителей. В процессе начитываю рассказ немецкого лётчика об его последнем вылете на этом самолёте.
Рассказ немного мною переработан.
0:00 Что делать, если половина коллектива отвалилось с проекта.
3:15 От винта!
4:35 Кто изобрёл Бутстрап?
6:32 Атака!
8:15 Про парочку статистических методов.
Рассказ немного мною переработан.
0:00 Что делать, если половина коллектива отвалилось с проекта.
3:15 От винта!
4:35 Кто изобрёл Бутстрап?
6:32 Атака!
8:15 Про парочку статистических методов.
Просмотров: 191
Видео
Истребитель Bf109E-4 Бумага, сборка. +Сказка на ночь
Просмотров 5338 месяцев назад
Модель немецкого истребителя в масштабе 1 к 33 из бумаги. Процесс сборки под задорные песни. Далее идёт короткий расказ с диалогами. На 10:20 у командира эскадрильи в кислородном баллоне оказался гелий. Поэтому можно поржать. 0:00 Эпическое начало 3:00 Делаем крылышки 5:45 Взлёт пары "Цвайн идиотен" 8:20 Полёт эскадрильи над Средиземным морем. Несчастный ублюдок Макс.
Истребитель Як 1. Бумага, сборка.
Просмотров 91010 месяцев назад
Модель советского истребителя в масштабе 1 к 33. Процесс сборки под песню Высоцкого - Як истребитель.
Напишеи алгоритм Probability Calibration Tree
Просмотров 245Год назад
Напишем алгоритмы дерева калибровки вероятности и построения диаграммы надежности (reliability). В листовых узлах дерева обучим логистические регрессии и вычислим ожидаемую ошибку калибровки. Проверим работу дерева на несбалансированной выборке. В конце видео расскажу про более продвинутое решение - класс Probability Calibration Tree. 0:00 Начнём с шутки, которую еще никто не понял 1:00 Импорти...
AB тесты, мощность, ROC кривая p-values.
Просмотров 496Год назад
Проведём статистические тесты на остутствие тренда в данных и сравним выборки. Используя метод Монте Карло узнаем распределение p-values, построим ROC кривую p-values и определим мощности тестов. 0:00 Что будем делать. 1:05 Начнём с чистого листа. Импортируем библиотеки. 2:08 Считываем данные. Описание признаков. 4:33 Тест на отсутствие тренда в данных. 6:12 Когда отвергаем основную гипотезу - ...
Не глядя на клавиатуру напишем алгоритм SoftMax Regression для многоклассовой классификации.
Просмотров 6032 года назад
На Python с нуля напишем линейный алгоритм для многоклассовой классификации. Узнаем, как выглядит функция потерь Log-loss и SoftMax функция и как вычисляется градиент весов. На рисунках увидем результат работы алгоритма. 0:42 Давайте это сделаем. 3:54 Не глядя на клавиатуру пишем класс алгоритма SoftMax Regression 13:00 Написали. Дописываем методы predict и score 14:42 Проверяем. Добавляем вычи...
Напишем алгоритм AdaBoost для регрессии с нуля на Python.
Просмотров 2312 года назад
По статье - "AdaBoost.RT: a boosting algorithm for regression problems" напишем два алгоритма адаптивного бустинга для регресии - RT и R2. Узнаем особенности, проведем их сравнение. 0:30 Статья про алгоритм 2:18 Начинаем писать класс AdaBoost для алгоритма RT 16:35 Кажется всё. Нет, не всё. Дописывем методы, исправляем опечатки. 21:56 Проверяем. Любуемся результатами работы каждой модели в комп...
Напишем алгоритм AdaBoost для классификации
Просмотров 2792 года назад
С нуля напишем алгоритм. В качестве базовой модели будем использовать дерево глубиной 1 (пенёк). Узнаем как пни меняют веса наблюдений. Сравним качество с глубоким деревом решений. Переделаем алгоритм на задачу регрессии - AdaBoost.RT по статье D.P. Solomatine и D.L. Shreshta в следующем видео ролике. 0:14 Вспомнили про нашего коллегу по увлечению 2:08 Что будем использовать в качестве базовой ...
Напишем алгоритм Gradient Boosting Machine по идее Жерома Фридмана
Просмотров 4572 года назад
Напишем с нуля алгоритм композиции GBM на самодельных неглубоких деревьях. Узнаем что такое остатки и как на них обучать модели. Посмотрим как уменьшается (!) ошибка композиции при росте числа базовых моделей. Побыстрому переделаем алгоритм из регрессии в классификацию. Напишем алгоритмы вычисления и построения ROC и PRC кривых. Сравним скорости сходимости Random Forest и Gradient Boosting. 0:0...
Расскажу про алгоритм Случайного поиска с адаптацией для поиска информативных признаков.
Просмотров 2112 года назад
Расскажу про алгоритм Случайного поиска с адаптацией для поиска информативных признаков.
Расскажу про применение генетического алгоритма для выбора информативных признаков.
Просмотров 2222 года назад
Расскажу про применение генетического алгоритма для выбора информативных признаков.
Напишем алгоритм Linear Regression и Logistic Regression. Закодируем градиентный спуск.
Просмотров 8032 года назад
Напишем алгоритм Linear Regression и Logistic Regression. Закодируем градиентный спуск.
Напишем алгоритм Random Forest со слов Лео Бреймана.
Просмотров 3842 года назад
Напишем алгоритм Random Forest со слов Лео Бреймана.
Напишем алгоритм k-nearest neighbors с нуля на Python
Просмотров 8902 года назад
Напишем алгоритм k-nearest neighbors с нуля на Python
Не глядя на клавиатуру напишем алгоритм Decision Tree с нуля на языке Python
Просмотров 2,2 тыс.2 года назад
Не глядя на клавиатуру напишем алгоритм Decision Tree с нуля на языке Python
Змейка под управлением k-nearest neighbors
Просмотров 2702 года назад
Змейка под управлением k-nearest neighbors
Здравствуйте. Точно ли, что в методе Моте-Карло именно replase = True делает независимые выборки? Мне кажется независимость достигается сэмплированием без возвращения, это replase = False?
Как раз когда не возвращаете взятое значение из выборки, выборка уменьшается в размере, а значит следующее значение, взятое из выборки, будет зависеть от её уменьшенного объёма. А этого нельзя допускать. Поэтому нужно возвращать взятое значение.
@@mlpython1089 спасибо! теперь понятно!
@@mlpython1089 поясните еще, пж. какой вывод делать (в конце видео), когда мы не отвергаем нулевую гипотезу, а гистограмма неравномерна, FPR показывает 27%...
Выводы делаем по р значению, а гистограмма и рок кривая чисто для красоты и понимания где искать мощность в случае отвергания нулевой гипотезы.
Сборка модели однозначно оживает при таком звуковом сопровождении! Понравилось)
Как можно приобрести этот журнал я гаворю о ме 109
Раньше их было полно на сайте navarin ru, если вы говорите именно об этом журнале (халински). Теперь там таких нет. Но есть другие издательства.
Хорошая работа !
Отличая модель, интересное сопровождение)
Доброго времени суток! Как исправить ошибку?
AttributeError Traceback (most recent call last) Cell In[9], line 8 1 rs = RSwA(X, y, # передаем признаки и целевую переменную 2 iterations=250, # число итераций 3 manipulations="1000", # какие манипуляции над признаками пробовать 4 model=model, # модель 5 desired_score=None) # желаемое качество 7 for i in tqdm.tqdm(range(rs.iterations)): ----> 8 rs.go_search() 10 if rs.desired_score is not None and rs.desired_score >= rs.score: 11 break Cell In[4], line 110, in RSwA.go_search(self) 107 return 109 if self.cv_all_scores[-1] > self.cv_all_scores[-2] * 1.01: --> 110 self.change_weights(1.1) 111 elif self.cv_all_scores[-1] < self.cv_all_scores[-2] * 0.99: 112 self.change_weights(0.9) Cell In[4], line 94, in RSwA.change_weights(self, adapt) 91 self.weights = np.reshape(a, self.weights.shape) 93 temporary = pd.DataFrame([a], columns=self.d_weights.columns) ---> 94 self.d_weights = self.d_weights.append(temporary, ignore_index=True) File ~\anaconda3\Lib\site-packages\pandas\core\generic.py:5989, in NDFrame.__getattr__(self, name) 5982 if ( 5983 name not in self._internal_names_set 5984 and name not in self._metadata 5985 and name not in self._accessors 5986 and self._info_axis._can_hold_identifiers_and_holds_name(name) 5987 ): 5988 return self[name] -> 5989 return object.__getattribute__(self, name) AttributeError: 'DataFrame' object has no attribute 'append'
Ты крут дядька. Очень мощно.
Да, мы - дядьки, сама крутость,
Мир нашему дому!... Хорошая, аккуратная работа👍
Вы очень круто разбираете ml алгоритмы, я очень хочу чтобы вы продолжили эту рубрику, можете разобрать K-means
Спасибо за оценку. Новые ролики про МЛ не планирую в ближайшее время.
Спасибо! Очень понравилось видео!
я тоже сейчас пишу ml-алгоритмы с нуля и кайфую. С удовольствием посмотрел ваши видео)
у вас немного не так выполняется предсказание для AdaBoostR2: нужно использовать взвешенную медиану как в формуле
При взвешивании ответ точнее получается?
@@mlpython1089 да, получается немного точнее. Вот код для метода predict n_samples = len(samples) predictions = np.array([est.predict(samples) for est in self.stumps]).T # Sort the predictions sorted_idx = np.argsort(predictions, axis=1) # Find index of median prediction for each sample weight_cdf = np.array(self.betas)[sorted_idx].cumsum(axis=1) median_or_above = weight_cdf >= 0.5 * np.sum(self.betas) median_idx = median_or_above.argmax(axis=1) median_estimators = sorted_idx[np.arange(n_samples), median_idx] # Return median predictions return predictions[np.arange(n_samples), median_estimators]
аахахахахахахха)))))
Пятикилограммовая гантель добавляет веса этому видео
хех)
Классное видео! Спасибо! От себя скажу, что вроде бы данную реализацию можно сделать эффективнее. При построении дерева регрессии, перебирая пороги и признаки, мы каждый раз пересчитываем среднее по всем значениям. Среднее можно пересчитывать за o(1), а не за o(n), запоминая прошлые значения среднего. Просто для регрессии даже для небольшой выборки ваша реализация отрабатывала весьма долго, если сравнивать со скоростью работы реализации из sklearn.
Может ли кто-то пояснить, для чего в начале функции fit() к набору признаков добавляется столбец единичек?
Иначе пришлось бы работать со смещением (self.bias) - искать ему производную db. class LinearRegression(): def __init__(self): self.weights = None self.bias = None self.y_train = None def fit(self, X, y): self.y_train = y self.weights = np.zeros(X.shape[1]) self.bias = 0 for _ in range(0, 1000): predict = X.dot(self.weights) + self.bias dw = X.T.dot(predict - y) / len(y) db = np.sum(predict - y) / len(y) self.weights -= 0.1 * dw self.bias -= 0.1 * db def predict(self, X): return X.dot(self.weights) + self.bias def r2(self, predict, y): return 1 - np.sum((predict - y)**2) / np.sum((y_train.mean() - y)**2)
@@mlpython1089 спасибо, понял. Отличные видео на канале! С полгода назад, когда только начинал изучать эти вещи, ничего не понял, подумал, что канал плохой. А сейчас этот материал отлично воспринимается.
Очень крутые и полезные видео для подготовки и углубления понимания разных алгоритмов. Спасибо большое автору канала!
Спасибо.
Круто👍👍👍👍
Проблема автора в сухости подхода. Просьба обьяснять не только алгоритмы но и их суть. Какие проблемы решает..+сы и -сы. Сам код можно и гитхабе найти. И былобы здорово алгоритмы на реальных задачах.. не сферических коней в вакууме рассматривать а чтото жизненное. Цель ваших ролков обучать? А не под камеру набирать код.
На просторах есть много ресурсов, которые отлично справляются с задачей - научить. Мне их не переплюнуть. Поэтому цели кого то научить я и не ставил. Открыл канал чтобы узнать на сколько это сложно и начать относиться к другим авторам более лояльно. А на практике ML, в основном, не про алгоритмы ML, а про сбор, подготовку и анализ данных тестами.
@@mlpython1089 Я не с целью вас задеть написал. Я даже подписался на вас. Обязательно продолжайте. Я люблю самописные алгоритмы. Просьба развернутее описывать задачу и сами алгоритмы. И если есть возможность то используйтеи не синтетические датасеты в ближе к реальной жизни.
Шикарно👍👍👍👍👍
За видео, конечно, спасибо, но уже видел один в один такой алгоритм на разных каналах и кэггл. У данной реализации есть 2 недостатка: 1) нужно сделать функцию чтобы определять непрерывные и категориальные переменные т.к. у них порог берется по-разному, 2) обычно порог берется не по всем уникальным значениям признака, а по среднему арифметическому между уникальными соседними значениями признака. Также вы сказали, что реализуете коэффициент Джини, но сделали информационный прирост. Хоть у них и схожие результаты, но все же это разные вещи.
Это очень круто) и полезно Спасибо! Надо тоже попрактиковаться
Спасибо
Пожалуйста.
ахахаххахахахахха
Спасибо большое за урок, очень доходчиво буквально на пальцах разобрали тему. Хотел спросить по поводу АА -теста, вроде кажется очевидным что проводя тест на одной и той же выборке мы не получим статистического отличия, тем не менее он проводится, можете также буквально на пальцах пояснить почему и привести пример когда АА тест проваливается. Спасибо!
Спасибо. АА тест может провалиться если случайная величина распределена крайне несимметрично. В таких случаях говорят, что у распределения тяжелые хвосты или выбросы. Обычно проблема решается усечением выборки, т.е. удалением, например, 1% наблюдений с минимальными и максимальными значениями. Но если это не помогает и АА тест всеравно проваливается (roc кривая р значений не диагональ), то, возможно, в данных есть кластеры или тренд.
Гироскоп надо
Не очень понятно почему в производной берем X.T
Развернуть надо матрицу Х перед умножением на остатки чтобы получить веса. Иначе не получиться - размерности не сойдутся.
Владимир, спасибо за ответ. То что размерности не совпадут если не транспонировать это понятно. Просто смутило, что при перевороте матрицы мы уже перемножаем значения конкретной фичи на вероятности, которые соответствуют примерам.
Подскажите, пожалуйста, а новые видео планируются?
Подготовиться и записать это очень много времени нужно потратить. Да и формат изложения не популярный. Аналитика просмотров говорит, что на просмотр видео тратят минуту, две. Но, вот есть идея записать про алгоритм калибровки вероятностей с использованием стриженных деревьев решений. Будет интересно?
@@mlpython1089 Да, я понимаю, что это трудоёмкий процесс. Возможно, стоит вложиться в рекламу на каких-нибудь русскоязычных каналах про DS/ML, чтобы увеличить число подписчиков. Формат сам по себе полезный, интересно наблюдать, как всё работает "под капотом", а не просто накатывать готовые sklearn-модельки через fit/predict. Для меня это ещё один способ время от времени освежить математику) Да, интересно, хотелось бы посмотреть.
Это был хитрый план с комментарием под лекцией МФТИ с Суффиксным Автоматом) Успехов Вам! Я сам пару лет назад осваивал МЛ - именно по этой книге. Знания и практика - наше все!
Хотелось бы высказать небольшое замечание, что когда считают R^2 коэффициент для задачи регрессии, среднее значение считают именно по обучающей выборке, но это мелочи)
Почему Вы так решили?
Когда пишем знаменатель, то говорим о модели среднего. А модель строим по тренировочному набору данных. Понял. Спасибо.
Блин, это же надо так сходу писать код рабочий, круто реально)
Неделю потратил на изучение этого алгоритма. Недели две писал и переписывал видео. До этого, с нуля, пару месяцев тренировал слепую печать.
Отличный видос, спасибо!
Подскажите, 7:17 какая книга?
Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Edition, Kindle Edition
@@mlpython1089 спасибо❤️
Добрый день! Учусь по вашим урокам. Очень помогают. А как в данном алгоритме рассчитать значимость признаков на итоговый результат? (Аналог feature_importances_. из sklearn, что бы в таблицу вывести название признака и его влияние). Если вам не трудно, не могли бы помочь с этим делом 🙏Буду очень благодарен за помощь! (Гугл диск: drive.google.com/drive/folders/19vlAf684MpUo8xP1HHUR_JzTl9-uXinq?usp=sharing , так же скиньте туда реквизиты, куда вас можно будет отблагодарить☺)
Приветствую. Приятно слышать, что мои видео кому-то полезны. В случайном лесе признаки в узлах деревьев выбираются случайно. Всё это делается чтобы модели в композиции случайного леса не корелировали между собой. Поэтому важность признаков не так просто оценить и обычный подсчет использованных признаков (как в дереве решений) не сработает. Нужен специальный алгоритм - permutation importance. Он у меня есть в змейке на KNN. Могу попробовать его вставить в случайный лес.
@@mlpython1089 Если получится, было бы здорово. Сам я такое к сожалению не в силах реализовать... (А очень нужно) Остается надежда на вашу помощь...
@@zzzzzz4572 Там идея проста. По этому классу можно её понять. # класс оценки важности признаков (permutation importance) class PermutationImportance(object): def __init__(self, model, X, y, cv=5): self.model = model self.cv = cv self.importance = [] self.f_score = [] def evaluate_it(self): original_score = self.model.cv(X, y, cv=self.cv).mean() for i in range(X.shape[1]): X_new = X.copy() np.random.shuffle(X_new[:, i]) feature_score = self.model.cv(X_new, y, cv=self.cv).mean() self.f_score.append(feature_score) self.importance.append(feature_score - original_score) return self.importance CV = 3 clf = KNN() cv = clf.cv(X, y, cv=CV) print("Cross validation score:", cv, " Its mean:", str(cv.mean())[:4]) print("Starting evaluate feature importance... ") imp = PermutationImportance(clf, X, y, cv=CV) imp_per_feature = imp.evaluate_it() print("Feature importance by Permutation:") for i, score in enumerate(imp_per_feature): if score < 0: print("feature", i, "its importance", str(score * (-1.0))[:4])
Информативное видео! Спасибо за урок. А можно с вами как то связаться? Хотелось бы попросить совет, как использовать свой набор данных для этого алгоритма. Я новичок в этом деле. Как не пробую подключить свои данные - либо ошибки, либо в предикте все 0 0 0 0... Хотя на данных из урока все работает 😞
Нужно на данные посмотреть. Они должны быть все числовые. Скинте часть данных в облако, а ссылку оставьте здесь.
@@mlpython1089 drive.google.com/drive/folders/19vlAf684MpUo8xP1HHUR_JzTl9-uXinq?usp=sharing Ссылка на диск. Туда же можно прикрепить ответ
Скинул туда исправления. 1. Нужно тип целевой переменной изменить: ytall = tall[clDrop].values.astype("int32") 2. И добавить выход из из метода grow_tree после определения индексов: left_indexes = np.argwhere(X[:, best_feature] <= best_threshold).flatten() right_indexes = np.argwhere(X[:, best_feature] > best_threshold).flatten() # добавил выход if len(left_indexes) == 0 or len(right_indexes) == 0: return Node(value=self.most_comon(y))
Можете, пожалуйста, подсказать, как построить GBM над логистическими регрессиями?
Также как и на деревьях. Алгоритм логистической регрессии описан в другом видео. Его можно использовать в GBM в качестве базового алгоритма. Только в методе predict класса GBM нужно задать threshold=0.5, а из метода predict класса LogisticRegression вернуть сигмоиду от предсказания.
@@mlpython1089 но в GBM мы же на каждом шаге решаем задачу регрессии? Как ее решать с помощью логистической регрессии?
@@ВладиславГаджиханов-ъ7к на каждом шаге мы используем базовую модель, которую обучаем на остатки. Логистическую регрессию тоже можно использовать в качестве базовой модели. Только что сам попробовал. Результат хороший.
Понял, спасибо. Подскажите еще, пожалуйста, GBM в случае экспоненциальной ф-ии потерь в задачи классификации полностью эквивалентентен AdaBoost. Происходит ли то же самое для задачи регрессии?
Ничего не могу сказать про эквивалентность данных алгоритмов при экспоненциальной функции потерь.
Классно! В теории можно еще добавить к примеру среднее кол-во очков за 10 запусков каждой змейки , чтобы потом сравнить все Ваши подходы или на одну площадку запускать разных) Классно оформлено, где-то обучались или сами?)
Спаисбо. Все же я думаю, что KNN слабоват для такой задачи. Нужен другой алгоритм и обучение с подкреплением. Да, сам изучаю - по лекциям Евгения Соколова, StatQuest и многое другое.
Очень классно сделано. Хорошо оформлен ноутбук. Видно, что вы действительно уже много времени занимаетесь ML. Порадовал ваш способ генерации обучающего подмножества) Надо определенно брать на вооружение :)