我正在数据框上构建决策树模型。数据框看起来像这样:
我可以通过此代码正常运行剧情:
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个变量(c的模型并非全部使用它们),所以特别是在模型进行更改和迭代的情况下,需要做很多工作。
我想知道是否有一种更简单,更快速的方法,可以将决策树图中每个叶节点中数据帧特定列的唯一值计数纳入其中?还是太难了,甚至只获取每个唯一叶节点中的唯一ID的数量而无需绘制图表?
这是我现在作为穷人的可怜人的解决方案:
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_id。
df4=df3.drop(columns=['TargetVar'])
node_id=clf.apply(df4)
然后,我将node_id转换为一个数据框,并将其与其中具有ID列值的原始数据框df合并。
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 ECIF),node_id FROM df_out
group by node_id"""
x=ps.sqldf(q2, locals())
x为我提供了每个叶节点中唯一ID值的列表,我只是使用图像编辑工具通过在节点ID上进行匹配,在包含决策树图的图像文件中手动绘制这些ID。
我仍然无法获得每个拆分中ID值的计数,只有最终在每个叶节点中存在的唯一ID值。