Python - экспортировать окончательное дерево случайных лесов для Graphviz - PullRequest
0 голосов
/ 16 мая 2018

У меня есть код Python с деревом решений и случайными лесами. Дерево решений находит наибольшего участника, используя:

contr = decisiontree.feature_importances_.max()  * 100
contr_full = decisiontree.feature_importances_  * 100

#Showing name
location = pd.to_numeric(np.where(contr_full == contr)[0][0])
result = list(df_dmy)[location + 1]

Возвращает самый большой вклад в мой набор данных и затем экспортируется в формат Graphviz с использованием:

tree.export_graphviz(rpart, out_file=path_file + '\\Decision Tree Code for Graphviz.dot', filled=True, 
                 feature_names=list(df_dmy.drop(['Reason of Removal'], axis=1).columns), 
                         impurity=False, label=None, proportion=True, 
                         class_names=['Unscheduled', 'Scheduled'], rounded=True)

В случае случайных лесов мне удалось экспортировать каждое дерево, которое там используется (100 деревьев):

i = 0
for tree_data in rf.estimators_:
with open('tree_' + str(i) + '.dot', 'w') as my_file:
    my_file = tree.export_graphviz(tree_data , out_file = my_file)
i = i + 1

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

То, что я пробовал, было:

i= 0
for tree_data in rf.estimators_:
#Feature importance
df_trees = tree_data.tree_.threshold

contr = df_trees.max()  * 100
contr_full = df_trees * 100

#Showing name
location = pd.to_numeric(np.where(contr_full == contr)[0][0])
result = print(list(df_dmy)[location + 1])

Используя это, я получаю ошибку: IndexError: список индексов вне диапазона для которого я понятия не имею, что здесь не так.

Я хотел получить таблицу данных о самых крупных участниках вместе с их факторами, чтобы отфильтровать их до фактического крупнейшего участника и самого большого вклада. Смотрите пример:

Результат (в кадре данных) =

    Result   Contribution
0   Car      0.74
1   Bike     0.71
2   Car      0.79

Python уже знает, что результат случайных лесов дал «машине» в качестве крупнейшего участника, первый фильтр должен удалить все, кроме «машины»:

Result   Contribution
0   Car      0.74
2   Car      0.79

Затем он должен найти самый большой вклад и получить индекс.

    Result   Contribution
2   Car      0.79

Затем он должен экспортировать информацию дерева, соответствующую этому индексу.

Я знаю, что это довольно длинная история, но я надеюсь, что кто-то знает, как закончить этот код.

С уважением, Ганеш

1 Ответ

0 голосов
/ 17 мая 2018
names = []
contributors = []

df = pd.DataFrame(columns=['Parameter', 'Value'])

for tree_data in rf.estimators_:
    #Feature importance
    df_trees = tree_data.tree_.threshold

    contr = tree_data.feature_importances_.max()  * 100
    contr_full = tree_data.feature_importances_ * 100

    contr_location = pd.to_numeric(np.where(contr_full == contr)[0][0])
    names.append(list(titanic_dmy.columns)[contr_location + 1])
    contributors.append(contr)

df['Parameter']=np.array(names)
df['Value']=np.array(contributors)
idx = df.index[df['Value'] == df['Value'].loc[df['Value'].idxmax()]].tolist()[0]

#Export to Graphviz
tree.export_graphviz(rf.estimators_[idx], out_file=path_file + '\\RF Decision Tree for Graphviz.dot', 
                     filled=True, max_depth=graphviz_leafs, feature_names=list(titanic_dmy.drop(['survived'], 
                     axis=1).columns), impurity=False, label=None, proportion=True, 
                     class_names=['Unscheduled', 'Scheduled'], rounded=True, precision=2)
...