Pull to refresh

Comments 49

про минимальность глубины дерева для шариков не верно. например, на втором уровне вместо 8 можно было взять 4 и на следующем уровне уже закончить. для одномерного множества количество условий очевидно считается и минимальная глубина достигается, в том числе, на максимально сбалансированном дереве. но так как важна целая часть логарифма, а общее число разбиений далеко не степень двойки, то и другие деревья могут быть «оптимальны» с точки зрения глубины. Дерево из статьи оптимально в том плане, что мы «отщипили» самую большую группу наиболее быстро

а где что-либо говорится про "минимальность глубины дерева для шариков"?

уже частично поправили:
Можно убедиться в том, что построенное в предыдущем примере дерево является в некотором смысле оптимальным – потребовалось только 5 «вопросов» (условий на признак x), чтобы «подогнать» дерево решений под обучающую выборку, то есть чтобы дерево правильно классифицировало любой обучающий объект. При других условиях разделения выборки дерево получится глубже.

здесь раньше были не 5 вопросов, а глубина. поэтому и последнее процитированное предложение про глубину теперь выглядит вырванным из контекста. Спасибо, что поправили. Обидно, что сделали это тихо, отчего появились вопросы ;)

я ничего не правил. Если что-то серьезное правлю, ставлю UPD
В репозитории в ipynb-файле та же фраза, что и сейчас.

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

как я написал выше, может получится и менее глубоким.
В любом случае, хорошо что пишите, а то народ играет в «кубики», меняя параметры, а что за этим стоит не всегда понимают
Зануда-mod on

Если вы по какой-то причине набираете ручками всё вышеизложенное, да ещё и на производной от ubuntu16(не знаю как там на других дистрах), то с удивлением можете обнаружить, что графы нифига не рисуются. И дело тут вовсе не в вашей криворукости или криворукости авторов, а в неустановленном по умолчанию graphviz. И это не тот graphviz, который можно поставить через pip, а пакет утилит, для установки которого надо юзать apt

Зануда-mod off

graphviz не обязателен. Достаточно создать dot-файл методом export_graphviz из sklearn.tree и дальше отрендерить этот dot-файл либо c помощью pydot (pip install pydot) либо онлайн-ковертером.

Конечно можно. Но это никак не поможет запуститься
!dot -Tpng '../../img/age_sal_tree.dot' -o '../../img/age_sal_tree.png'

А комментарий был именно про это.

Именно поэтому первый раз, когда в коде появляется вызов dot (в спойлере "Код для отображения дерева"), я пишу


# для этого понадобится библиотека pydot (pip install pydot)
!dot -Tpng '../../img/small_tree.dot' -o '../../img/small_tree.png'

Очевидно, если не установить pydot, не выполнится и команда.

Установка pydot не помогла. Нашел другой вариант для Windows: и посмотреть и сохранить дерево:

from sklearn.tree import DecisionTreeClassifier
clf_tree = DecisionTreeClassifier(criterion='entropy', max_depth=10, random_state=17)
clf_tree.fit(df_train, y)

from sklearn import tree
from IPython.display import Image
import pydotplus

dot_data = tree.export_graphviz(clf_tree, feature_names=df_train.columns, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf('df_train.pdf')
graph.write_png('df_train.png')
Image(graph.create_png())
Как вариант для пользующихся docker

  1. Устанавливаем пакет в запущенный контейнер
    sudo docker exec -u 0 -i -t mlcourse_open /usr/bin/apt install graphviz
    
  2. Конвертируем командой в jupyter-notebook
    !dot -Tpng '../../img/small_tree.dot' -o 'small_tree.png'
    
  3. Отрисовываем в Markdown-ячейке jupyter-notebook
    ![title](../../img/small_tree.png)
    

В файле настроек (Dockerfile) предлагаемого в курсе докер-контейнера уже прописана установка pydot. Graphviz не обязательно ставить, тут это будет из пушки по воробьям.

Мне кажется, вы заблуждаетесь. Выполняя !dot получаем вывод:
/bin/sh: 1: dot: not found


И и при этом
pip show pydot
Name: pydot
Version: 1.2.3
Summary: Python interface to Graphviz's Dot
Home-page: https://github.com/erocarrera/pydot
Author: Ioannis Filippidis
Author-email: jfilippidis@gmail.com
License: MIT
Location: /usr/local/lib/python3.5/dist-packages
Requires: pyparsing


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

Согласен, GraphViz указан как dependency в репозитории pydot. Значит, он у меня уже был установлен, а я не заметил.
С путем к pydot тоже приходилось повозиться, в случае Windows вообще не берусь комментировать, в случае *nix помогает StackOverflow, хотя если вдруг установлены 2 версии питона (2.x и 3.x), тоже могут быть осложнения.


Пути решения:


  • проверить установку pydot в докер-контейнере festline/mlcourse_open – инструкции в репозитории нашего курса
  • установить pydot самостоятельно, StackOverflow в помощь :)
  • накрайняк, использовать онлайн-конвертер из dot в png

А в целом, да, за отрисовку деревьев, sklearn-у незачет.

Код, который работал в jp notebook для меня после установки библиотек:

# используем .dot формат для визуализации дерева
from sklearn.tree import export_graphviz
export_graphviz(
    clf_tree,
    feature_names=['x1', 'x2'],
    out_file='/small_tree.dot',
    filled=True)
# для этого понадобится библиотека pydot (pip install pydot)


import pydot
(graph,) = pydot.graph_from_dot_file('/small_tree.dot')
graph.write_png('/small_tree.png')

from IPython.core.display import Image, display
display(Image('/small_tree.png', unconfined=True))

Немного картинок по результатам 2 домашек:


2 домашка оказалась сложнее (да, формулировки менее четкие, но тут уже исправленные результаты, где за 2 вопрос – всем 2 балла выставлено)
png
png


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


png
png


Ко второй домашке присоединились 26 новых участников, 107 "старых" – забили (из начальных 519 участников)

Из тех, кто не получил 10 баллов большая часть объявила Ализара наиболее часто минусуемым, я прав?)

Возможно – не смотрел. Но этот аспект обсуждался в #mlcourse_open

А приглашение туда когда придет? Вторую неделю жду.
пришли в лс мыло, которое указал при регистрации
Там не я отвечаю за утверждение заявок – написал контакт в личку.
UFO just landed and posted this here
Вы все же имели в виду CART – Classification And Regression Trees. Реализация деревьев в Sklearn – это оптимизированная версия CART. Случайный лес в Sklearn опять же построен на деревьях CART, только усредняются не ответы, как в оригинале, а вероятности.
В документации Xgboost Вы опять же встретите CART.
Так что, мягко говоря, Вы поспешили заявить, что «На практике CRT используется крайне мало», а если не мягко, то надо порой отвлечься от того, что в твоей задаче происходит, и посмотреть немного вокруг.

mildly off-topic:
А есть концептуальная разница между CRT и CART?

Принципиальной разницы, конечно, нет, но давайте вещи называть своими именами – так, как его назвал Leo Breiman, а не товарищи из SPSS.


Интересно было бы прочитать статьи по реализации CHAID в Питоне

А написать про CHAID, случаем, вам не было бы интересно? :)

Кстати, интересно будет, если расскажете, как в деревьях с проверкой гипотез в узлах делается поправка на множественную проверку.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Правильно я понимаю, что если признаков (предикторов) много, скажем, 10 тыс, то такой подход не сработает?
Все p-value умножатся на 10 тыс., и тогда из п. 3 мы всегда переходим в п. 4. Там в п. 4 тоже поправка Бонферрони?

В-общем, как мы выберем первый признак, если таковых очень много, и все поправки Бонферрони привели к p-value 1 (после округления вниз). Другие поправки используются? Может, какие-то эвристики, чтоб не проверять все исходные признаки?

Или просто такой подход используется, когда признаков до нескольких сотен, не больше?
UFO just landed and posted this here
UFO just landed and posted this here
К.В. Воронцов описывает стрижку cost-compexity prunning (изложена вкратце у Е. Соколова тут), при которой дерево строится до макс. глубины, а затем последовательно, снизу вверх, на основе кросс-валидации удаляются лишние узлы (на CV сравнивается дерево с этим узлом и без него). Утверждают, что это работает лучше, чем подбор параметров. Но вычислительная сложность высокая. Не видел, где бы на Python было реализовано. И Conditional Inference Trees в питоне не хватает, хотя видел обсуждение, что кто-то собирался реализовать в sklearn.
В целом да, в реализации деревьев R обгоняет питон. То же можно сказать и про визуализацию и линейные модели.
Мне кажется там небольшая путиница в использовании терминов в начале. «Энтропия состояния», которая несколько раз встречается — это не совсем правильно, состояний там два исходя из исходного определения — «вытащили желтый» и «вытащили синий», а энтропия — одно единственное число. Лучше набором или группой везде называть. Ну и если уж совсем придраться — энтропия не группы шариков, а энтропия вытаскивания одного шарика из этой группы. Потому что если бы мы вытаскивали 2 шарика, то состояния, вероятности и в конечном итоге энтропия были бы уже другими. Может это буквоедство, но честно сказать сбило поначалу.
UFO just landed and posted this here
фу спам, как жеж тут призвать модератора что бы автора книги забанили
UFO just landed and posted this here

Видеозапись лекции по мотивам этой статьи в рамках нового запуска открытого курса (сентябрь-ноябрь 2017). Слегка коряво, правда, вышло с кадрированием, но будет лучше)

Новый запуск курса – 5 февраля 2018 г. Регистрация не требуется, но чтобы мы о вас знали, заполните форму. Главные новости будут в группе ВКонтакте, а жизнь во время курса будет теплиться в Slack OpenDataScience (вступить) в канале #mlcourse_open.

Проблемы с форматированием кода в пункте «Сложный случай для деревьев решений»

Новый запуск – 1 октября 2018 г., на английском. Подробности – тут.

Теперь курс можно проходить и самостоятельно – появились демо-версии заданий с решениями. Они описываются в конце каждой статьи, но есть и общий cписок. Решения доступны после отправки соотв. веб-формы.

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

Лучше бы автор сделал реализацию CART с нуля с нормальным объяснением, а так получилось, что тема до конца не освящена: зачем мне использовать фит/ предикт без полного понимая как оно работает изнутри?

Желание реализовать все с нуля похвально (правда), такое задание есть в списке дополнительных. Если сразу в CART погружаться, распугнешь 90% читателей. Так что уж простите, тут все проще подается (популизм), а желающие могут погрузиться в детали.

Также могу посоветовать две статьи своего бывшего коллеги из мэйла, они как раз про деревья https://habr.com/ru/company/vk/blog/438560/ и бустинг https://habr.com/ru/company/vk/blog/438562/

Sign up to leave a comment.