Комментарии 50
а где что-либо говорится про "минимальность глубины дерева для шариков"?
Можно убедиться в том, что построенное в предыдущем примере дерево является в некотором смысле оптимальным – потребовалось только 5 «вопросов» (условий на признак x), чтобы «подогнать» дерево решений под обучающую выборку, то есть чтобы дерево правильно классифицировало любой обучающий объект. При других условиях разделения выборки дерево получится глубже.
здесь раньше были не 5 вопросов, а глубина. поэтому и последнее процитированное предложение про глубину теперь выглядит вырванным из контекста. Спасибо, что поправили. Обидно, что сделали это тихо, отчего появились вопросы ;)
я ничего не правил. Если что-то серьезное правлю, ставлю UPD
В репозитории в ipynb-файле та же фраза, что и сейчас.
Если вы по какой-то причине набираете ручками всё вышеизложенное, да ещё и на производной от 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, не выполнится и команда.
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())
- Устанавливаем пакет в запущенный контейнер
sudo docker exec -u 0 -i -t mlcourse_open /usr/bin/apt install graphviz
- Конвертируем командой в jupyter-notebook
!dot -Tpng '../../img/small_tree.dot' -o 'small_tree.png'
- Отрисовываем в Markdown-ячейке jupyter-notebook

В файле настроек (Dockerfile) предлагаемого в курсе докер-контейнера уже прописана установка pydot. Graphviz не обязательно ставить, тут это будет из пушки по воробьям.
/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-у незачет.
# используем .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 балла выставлено)
Стали больше откладывать на последний момент :) может быть связано с тем, что задание сложнее и вызвало большее оживление на форуме.
Ко второй домашке присоединились 26 новых участников, 107 "старых" – забили (из начальных 519 участников)
В документации Xgboost Вы опять же встретите CART.
Так что, мягко говоря, Вы поспешили заявить, что «На практике CRT используется крайне мало», а если не мягко, то надо порой отвлечься от того, что в твоей задаче происходит, и посмотреть немного вокруг.
Интересно было бы прочитать статьи по реализации CHAID в Питоне
А написать про CHAID, случаем, вам не было бы интересно? :)
лучше всего я об этом в своей книге изложил, ссылку на которую дал вам в личке.
Про книгу многим может быть интересно. «Прогнозное моделирование в IBM SPSS Statistics и R. Метод деревьев решений» имеется в виду?
Очень интересная книга у вас (сужу по оглавлению).
По CHAID'у в открытом доступе есть хорошая обзорная статья — CHAID and Earlier Supervised Tree Methods.
Все p-value умножатся на 10 тыс., и тогда из п. 3 мы всегда переходим в п. 4. Там в п. 4 тоже поправка Бонферрони?
В-общем, как мы выберем первый признак, если таковых очень много, и все поправки Бонферрони привели к p-value 1 (после округления вниз). Другие поправки используются? Может, какие-то эвристики, чтоб не проверять все исходные признаки?
Или просто такой подход используется, когда признаков до нескольких сотен, не больше?
В целом да, в реализации деревьев R обгоняет питон. То же можно сказать и про визуализацию и линейные модели.
Видеозапись лекции по мотивам этой статьи в рамках нового запуска открытого курса (сентябрь-ноябрь 2017). Слегка коряво, правда, вышло с кадрированием, но будет лучше)
Лучше бы автор сделал реализацию CART с нуля с нормальным объяснением, а так получилось, что тема до конца не освящена: зачем мне использовать фит/ предикт без полного понимая как оно работает изнутри?
Желание реализовать все с нуля похвально (правда), такое задание есть в списке дополнительных. Если сразу в CART погружаться, распугнешь 90% читателей. Так что уж простите, тут все проще подается (популизм), а желающие могут погрузиться в детали.
Также могу посоветовать две статьи своего бывшего коллеги из мэйла, они как раз про деревья https://habr.com/ru/company/vk/blog/438560/ и бустинг https://habr.com/ru/company/vk/blog/438562/
Честно говоря, я как-то пропустил ваш ответ. Прошу прощения, что отвечаю спустя год. Спасибо большое за дополнительные материалы, однако я уже за это время реализовал все ML-алгоритмы с нуля :)
Если вам будет интересно, можете ознакомиться с этим здесь.
Открытый курс машинного обучения. Тема 3. Классификация, деревья решений и метод ближайших соседей