Python Сохранение состояния переменной точки останова в файле Cython - sklearn - PullRequest
1 голос
/ 06 мая 2020

Я хочу сделать снимки нескольких переменных, когда sklearn.tree был собран, но мне было трудно заставить его работать.

Например, за этими следующими строками кода.

from sklearn.datasets import load_iris
from sklearn import tree
X, y = load_iris(return_X_y=True)
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, y)   <-- tree builder recursively build the tree

Однако точная реализация этой части выполняется в Cython (скорость). Обычно я использую такие инструменты, как pdb, для установки точки останова в моем коде и, возможно, использую команду display для отслеживания переменных, которые меня интересуют. Однако такой подход не выглядит реалистично c, так как я легко заблудился при навигации по файлам.

(python37) $ python script.py 
> /private/tmp/test/script.py(6)<module>()
-> clf = clf.fit(X, y)
(Pdb) s
--Call--
> /Users/a59347/Desktop/scikit-learn/sklearn/tree/tree.py(852)fit()
-> def fit(self, X, y, sample_weight=None, check_input=True,
(Pdb) 
> /Users/a59347/Desktop/scikit-learn/sklearn/tree/tree.py(888)fit()
-> super().fit(
(Pdb) 
...      <- I easily got lost and ended up in a very low level utility library

Есть ли способ добавить точку останова к этой строке кода в Python? Меня буквально интересует, как весь стек изменился в процессе построения дерева:

 while not stack.is_empty():
     stack.pop(&stack_record)
     start = stack_record.start
     ....

1 Ответ

0 голосов
/ 06 мая 2020

Решением было бы получить исходный код scikit-learn из их репозитория Github, импортировать библиотеку локально, используя, возможно, PYTHONPATH, а затем использовать стандартные инструменты отладки Cython для отладки .

Честно говоря, я думаю, что вы получите больше пользы, изучив алгоритм и задав вопрос в репозитории sklearn devlist / Github, если вам интересно.

Если бы я угадал, что происходит там, поскольку вы смотрите на алгоритм роста в глубину:

  • Поместите все данные в один узел, root.
  • Найдите лучший критерий разделения для разделить данные, используя метрику c как информационное усиление.
  • Разделить данные на две части, используя критерий. Создайте правого и левого дочерних элементов, каждый получит одно разделение данных.
  • Рекурсивный алгоритм выше в правый дочерний элемент, затем в левый.

Это рекурсивный процесс, и разработчики использовали стек, чтобы сделать его итеративным.

...