获取数据框中列的唯一值的计数,这些值最终出现在决策树的每个叶节点中?
Posted
技术标签:
【中文标题】获取数据框中列的唯一值的计数,这些值最终出现在决策树的每个叶节点中?【英文标题】:Getting a count of unique values for a column in data frame that end up in each leaf node of Decision Tree? 【发布时间】:2020-09-14 21:42:04 【问题描述】:我正在数据框上构建决策树模型。数据框看起来像这样:
通过这段代码,我的情节运行良好:
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 值最终出现在我的决策树的每个叶节点中。
我现在执行此操作的手动方式是为每个叶节点输入决策树的每个条件并将其应用于我的数据框以获取每个叶中的唯一 ID 值。像这样的:
id_count= df[(df['var2']>=10.5) & (df['var1']='a')]
id_count['ID'].nunique()
由于我的实际模型的深度为 10,而实际数据框有近 100 个变量(并非所有变量都被模型 ofc 使用),因此需要做很多工作,尤其是在模型经历更改和迭代的情况下.
我想知道是否有一种更简单、更快捷的方法可以将数据帧的特定列的唯一值计数合并到决策树图中的每个叶节点中?
如果这太难了,甚至只计算每个唯一叶节点中唯一 ID 的数量而没有绘图?
另外,是否也可以在每个拆分中获取唯一 ID 的计数?例如Var>=10.5 将显示 4 个唯一 ID,而 Var
【问题讨论】:
【参考方案1】:这是我穷人的解决方案,我现在用作权宜之计:
1.我打开了决策树绘图命令的节点ID功能,这样我就可以看到我的绘图中的每个节点ID:
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 是我按原样导入的原始数据框,其中包含唯一 ID 列。
我首先从 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 为我提供了每个叶节点中唯一 ID 值的列表,我只是通过使用图像编辑工具在节点 ID 上进行匹配,手动将它们绘制在包含决策树图的图像文件中。
我仍然没有计算每个拆分中的 ID 值,只有每个叶节点中的唯一 ID 值。
【讨论】:
以上是关于获取数据框中列的唯一值的计数,这些值最终出现在决策树的每个叶节点中?的主要内容,如果未能解决你的问题,请参考以下文章