如何应用 h2o 库提取决策树叶子(终端节点)的样本拆分(值)

数据挖掘 Python 数据 决策树 预言
2022-03-05 01:38:02

对不起,说来话长,但说来话长。:)

我正在使用 Python 的 h2o 库来构建决策树并从中提取决策规则。我正在使用一些数据进行训练,其中标签获得 TRUE 和 FALSE 值。我的最终目标是提取树的重要路径(叶子),其中 TRUE 案例的数量显着超过 FALSE 案例的数量。

treemodel=H2OGradientBoostingEstimator(ntrees = 3, max_depth = maxDepth, distribution="bernoulli")
treemodel.train(x=somedata.names[1:],y=somelabel.names[0], training_frame=somedata) 
dtree = H2OTree(model = treemodel, tree_number = 0, tree_class = False)

def predict_leaf_node_assignment(self, test_data, type="Path"):        
    if not isinstance(test_data, h2o.H2OFrame): raise ValueError("test_data 
    must be an instance of H2OFrame")
       assert_is_type(type, None, Enum("Path", "Node_ID"))
    j = h2o.api("POST /3/Predictions/models/%s/frames/%s" % (self.model_id, 
    test_data.frame_id),
        data={"leaf_node_assignment": True, "leaf_node_assignment_type": 
    type})
    return h2o.get_frame(j["predictions_frame"]["name"])
dfResLabH2O.leafs = predict_leaf_node_assignment( dtree,test_data=dfResLabH2O , type="Path")      

在 scikit-learn 中有一个选项可以使用tree.values. 我知道 h2o 没有这样的选择。取而代之的是,在 h2o 中有一个选项可以返回对叶子的预测。

当我运行时dtree.predictions,我得到了非常奇怪的结果:

dtree.predictions
Out[32]: [0.0, -0.020934915, 0.0832189, -0.0151052615, -0.13453846, -0.0039859135, 0.2931017, 0.0836743, -0.008562919, -0.12405087, -0.02181114, 0.06444048, -0.01736593, 0.13912177, 0.10727943]***

我的问题(有人已经问过了,但到目前为止还没有给出明确的答案)

  1. 负面预测是什么意思?我希望得到 TRUE 到 ALL 或 FALSE 到 ALL 的比例 p,其中 0<=p<=1。我的模型有什么问题吗?我在 scikit-learn 中运行它,可以指出某些重要的路径并提取规则。

  2. 对于正值:是 TRUE 到 ALL 还是 False 到 ALL 比例?当我提到 Class=False 时,我猜它是如此 FALSE,但我不确定。

  3. 是否有任何方法或解决方案可以让 h20 树以类似于 scikit-learn 提供的方式分别揭示 TRUE 和 FALSE 情况下某个叶子的样本大小和 [n1,n2]?

  4. 我在一些论坛中发现了一个函数 def predict_leaf_node_assignment 旨在预测数据集并返回叶节点分配(仅适用于基于树的模型),但它不返回任何输出,我找不到任何示例如何实现它。

  5. 底线:我希望能够提取叶子的样本大小值并提取到它的特定路径,实现 [n1,n2] 或有效比例。

我将不胜感激任何帮助和建议。谢谢你。

1个回答

到目前为止,我还没有看到从模型中提取训练信息的方法。可以/应该给你比例信息,H2OTree.predictions但不会给你叶子样本大小。为此,您应该能够使用predict_leaf_node_assignment,将您的训练集传入(浪费地通过模型,*耸肩*)。

predict_leaf_node_assignment应该为每个训练点返回一个带有叶子分配的数据框。(该R版本似乎支持返回路径或节点 ID,但似乎python没有它。)您可以使用它,加入原始框架,并使用组和聚合函数来生成所需的.*[n1,n2]

关于 的输出predictions,请参阅 https://stackoverflow.com/questions/44735518/how-to-reproduce-the-h2o-gbm-class-probability-calculation特别是,H2O 的 GBM 中的默认学习率为 0.1,这有助于解释您的静音结果。

最后,要获得模型树对象的更多乐趣,请参阅https://www.pavel.cool/machine%20learning/h2o-3/h2o-3-tree-api/https://novyden.blogspot。 com/2018/12/finally-you-can-plot-h2o-decision-trees.html

*编辑:用于进行分组和聚合:(
我更习惯 pandas 而不是 H2O 帧,所以我会先转换。鉴于 H2O 认为您的 FALSE 类是主类,也许那些不是布尔值的字符串?)

predicted_leaves_frame = treemodel.predict_leaf_node_assignment(data).as_data_frame()
df = data.as_data_frame()
df['binary_dep_var'] = df['dep_var'].apply(lambda x: 1 if x=='TRUE' else 0)
df['T1'] = predicted_leaves_frame['T1.C1']
print(df.groupby('T1')['binary_dep_var'].agg(['sum','count','mean'])

这应该为每个叶子提供 TRUE 样本的数量以及样本总数和比率。如果您真的需要 FALSE 样本的数量,您可以定义自己的聚合函数或只是对这个新数据帧进行后处理。