Классное видео! Спасибо! От себя скажу, что вроде бы данную реализацию можно сделать эффективнее. При построении дерева регрессии, перебирая пороги и признаки, мы каждый раз пересчитываем среднее по всем значениям. Среднее можно пересчитывать за o(1), а не за o(n), запоминая прошлые значения среднего. Просто для регрессии даже для небольшой выборки ваша реализация отрабатывала весьма долго, если сравнивать со скоростью работы реализации из sklearn.
За видео, конечно, спасибо, но уже видел один в один такой алгоритм на разных каналах и кэггл. У данной реализации есть 2 недостатка: 1) нужно сделать функцию чтобы определять непрерывные и категориальные переменные т.к. у них порог берется по-разному, 2) обычно порог берется не по всем уникальным значениям признака, а по среднему арифметическому между уникальными соседними значениями признака. Также вы сказали, что реализуете коэффициент Джини, но сделали информационный прирост. Хоть у них и схожие результаты, но все же это разные вещи.
Хотелось бы высказать небольшое замечание, что когда считают R^2 коэффициент для задачи регрессии, среднее значение считают именно по обучающей выборке, но это мелочи)
Информативное видео! Спасибо за урок. А можно с вами как то связаться? Хотелось бы попросить совет, как использовать свой набор данных для этого алгоритма. Я новичок в этом деле. Как не пробую подключить свои данные - либо ошибки, либо в предикте все 0 0 0 0... Хотя на данных из урока все работает 😞
Скинул туда исправления. 1. Нужно тип целевой переменной изменить: ytall = tall[clDrop].values.astype("int32") 2. И добавить выход из из метода grow_tree после определения индексов: left_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))
Это очень круто) и полезно
Спасибо!
Надо тоже попрактиковаться
Блин, это же надо так сходу писать код рабочий, круто реально)
Неделю потратил на изучение этого алгоритма. Недели две писал и переписывал видео. До этого, с нуля, пару месяцев тренировал слепую печать.
Классное видео! Спасибо! От себя скажу, что вроде бы данную реализацию можно сделать эффективнее. При построении дерева регрессии, перебирая пороги и признаки, мы каждый раз пересчитываем среднее по всем значениям. Среднее можно пересчитывать за o(1), а не за o(n), запоминая прошлые значения среднего. Просто для регрессии даже для небольшой выборки ваша реализация отрабатывала весьма долго, если сравнивать со скоростью работы реализации из sklearn.
За видео, конечно, спасибо, но уже видел один в один такой алгоритм на разных каналах и кэггл. У данной реализации есть 2 недостатка: 1) нужно сделать функцию чтобы определять непрерывные и категориальные переменные т.к. у них порог берется по-разному, 2) обычно порог берется не по всем уникальным значениям признака, а по среднему арифметическому между уникальными соседними значениями признака.
Также вы сказали, что реализуете коэффициент Джини, но сделали информационный прирост. Хоть у них и схожие результаты, но все же это разные вещи.
Хотелось бы высказать небольшое замечание, что когда считают R^2 коэффициент для задачи регрессии, среднее значение считают именно по обучающей выборке, но это мелочи)
Почему Вы так решили?
Когда пишем знаменатель, то говорим о модели среднего. А модель строим по тренировочному набору данных. Понял. Спасибо.
Информативное видео! Спасибо за урок. А можно с вами как то связаться? Хотелось бы попросить совет, как использовать свой набор данных для этого алгоритма. Я новичок в этом деле. Как не пробую подключить свои данные - либо ошибки, либо в предикте все 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()
# добавил выход
if len(left_indexes) == 0 or len(right_indexes) == 0:
return Node(value=self.most_comon(y))