Получение количества уникальных значений для столбца во фрейме данных, которые попадают в каждый листовой узел дерева решений? - PullRequest
1 голос
/ 27 мая 2020

Я строю модель дерева решений на базе данных. Фрейм данных выглядит примерно так:

Sample Dataframe

У меня график отлично работает через этот код:

from sklearn import tree

fig, axes = plt.subplots(nrows =1,ncols =1,figsize = (2,2), dpi=600)

tree.plot_tree(clf,
               feature_names = x_pre, 
               filled = True);

Код показывает Мне хорошо, сколько образцов попадает в каждый из моих листов.

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

Я сейчас делаю это вручную: набираю каждое условие дерева решений для каждого листового узла и применяю его к моему фрейму данных, чтобы получить уникальные значения идентификаторов в каждом листе. Что-то вроде этого:

id_count= df[(df['var2']>=10.5) & (df['var1']='a')]

id_count['ID'].nunique()

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

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

Или даже просто получить количество уникальных идентификаторов в каждом уникальном листовом узле без графика, если это слишком сложно?

Кроме того, возможно ли получить количество уникальных идентификаторов в каждом разбиении как хорошо? Например, Var> = 10.5 покажет 4 уникальных идентификатора, а Var <= 10.5 покажет 2 уникальных идентификатора. </p>

1 Ответ

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

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

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

from sklearn import tree

fig, axes = plt.subplots(nrows =1,ncols =1,figsize = (2,2), dpi=600)

tree.plot_tree(clf,
               feature_names = x_pre, 
               filled = True,
               class_names=True,
               node_ids=True);

2. У меня есть 2 версии фрейма данных:

a) df3 - это очищенный фрейм данных с меньшим количеством столбцов, Я разделился на обучение и тестирование, а также на обучение модели. df3 не содержит столбца ID, так как он не нужен для обучения модели.

b) df - это мой исходный фрейм данных, который я импортировал как есть, который содержит столбец уникального идентификатора.

Сначала я удалил целевую переменную из df3 и применил свою модель поверх нее, чтобы получить node_ids для каждой строки моего фрейма данных.

df4=df3.drop(columns=['TargetVar'])
node_id=clf.apply(df4)

Затем я преобразовал свой node_id в фрейм данных и объединил его с моим исходным фреймом данных df, в котором было значение столбца ID.

node_id_2=pd.DataFrame(data=node_id)

node_id_2.rename(columns={0: 'node_id'}, inplace=True)

df_out = pd.merge(df,node_id_2,how = 'left',left_index = True, right_index = True)

import pandas as pd
import pandasql as ps

q2 = """SELECT count(distinct ID),node_id FROM df_out 
group by node_id"""

x=ps.sqldf(q2, locals())

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...