Можно ли модифицировать / обрезать изученные деревья в scikit-learn?

Доступ к параметрам дерева в sklearn можно получить с помощью

tree.tree_.children_left tree.tree_.children_right tree.tree_.threshold tree.tree_.feature 

и так далее

Тем не менее, при попытке записи в эти переменные возникает исключение, недоступное для записи

Есть ли способ изменить изученное дерево или обойти атрибут AttributeError, недоступный для записи?

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

 children_left : array of int, shape [node_count] children_left[i] holds the node id of the left child of node i. For leaves, children_left[i] == TREE_LEAF. Otherwise, children_left[i] > i. This child handles the case where X[:, feature[i]] <= threshold[i]. children_right : array of int, shape [node_count] children_right[i] holds the node id of the right child of node i. For leaves, children_right[i] == TREE_LEAF. Otherwise, children_right[i] > i. This child handles the case where X[:, feature[i]] > threshold[i]. feature : array of int, shape [node_count] feature[i] holds the feature to split on, for the internal node i. threshold : array of double, shape [node_count] threshold[i] holds the threshold for the internal node i. 

Чтобы обрезать DecisionTree по количеству наблюдений в узлах, я использую эту функцию. Вам нужно знать, что константа TREE_LEAF равна -1.

 def prune(decisiontree, min_samples_leaf = 1): if decisiontree.min_samples_leaf >= min_samples_leaf: raise Exception('Tree already more pruned') else: decisiontree.min_samples_leaf = min_samples_leaf tree = decisiontree.tree_ for i in range(tree.node_count): n_samples = tree.n_node_samples[i] if n_samples <= min_samples_leaf: tree.children_left[i]=-1 tree.children_right[i]=-1 

Вот пример, который выводит вывод graphviz до и после:

 [from sklearn.tree import DecisionTreeRegressor as DTR from sklearn.datasets import load_diabetes from sklearn.tree import export_graphviz as export bunch = load_diabetes() data = bunch.data target = bunch.target dtr = DTR(max_depth = 4) dtr.fit(data,target) export(decision_tree=dtr.tree_, out_file='before.dot') prune(dtr, min_samples_leaf = 100) export(decision_tree=dtr.tree_, out_file='after.dot')][1]