【发布时间】:2019-07-07 19:32:56
【问题描述】:
我正在创建一个决策树算法
我有 4 个特征,每个特征有 4 个可能的值('a'、'b'、'c'、'd')
Y(预测值)可以是 0 或 1 或 2
我有一个函数来构建树然后我使用预测函数(我正在构建它,所以我不发布代码)来预测基于该决策树的值。
这是我的函数原型
def dt_predict(x, features_label, tree):
地点:
-
x是包含所有数据的 pandas DataFrame(4 列,每列 4 个可能的值) -
features_label是每个数据列的标题 -
tree是训练好的决策树a(一种节点类的链表)
node类:
class node:
def __init__(self):
self.level = 0
self.option = ""
self.feature = ""
self.is_leaf_node = False
self.is_pure_node = False
self.max_value_item = ""
self.max_value = 0
self.possible_values_names = []
self.possible_values_nodes = []
所有这些都是为了让您对问题有一个整体的了解。 现在我的问题不是如何预测这个或那个值,而是如何跟踪索引。
在我的预测函数中,我将遍历所有树(节点)并连续减少 x 我作为参数传递的 DataFrame。所以我总是有每行数据的索引,但不知道如何在新的 pandas dataFrame 上创建和粘贴 y 和索引值。
def dt_predict(x, features_label, tree):
if tree.is_leaf_node == True:
#return new pandas dataframe with x indexes and tree.max_value_item (in this case 0 or 1 or 2)
#loop through possible values, filter x and call dt_predict recursively
...
如果不清楚,请告诉我。
编辑:
更清楚地想象我有
index | x1 | x2 | x3 | x4 |
123 | a | c | a | b |
...
35 | b | d | a | a |
我希望它是:
index | Y |
123 | 2 |
...
35 | 2 |
【问题讨论】:
-
如果您的 predict 函数设置为仅输出预测,那么您是否可以使用
df.apply()将其应用于 df 中的所有行? -
@G.Anderson 首先感谢您的回答。你能否给我看一个例子还有一件事我在帖子中告诉过但没有要求,因为我的预测运行X减少到我需要将返回合并到一个最终数据帧中的选项数量.非常感谢提前
-
我很抱歉,但我不太明白你的措辞。您的意思是您正在修改原始 DF 作为模型训练过程的一部分?因为那可能不是最好的选择。例如,sklearn 决策树模型将基于数据的拟合决策树存储为对象,然后
predict方法仅将特征作为输入,并输出单个预测(X in, y out) -
@G.Anderson 哈哈,轮到我不明白了。让我解释。我所做的是创建一棵树(具有特定逻辑的节点的链接列表),因此如果在
x1上拆分后得到a,那么我将转到叶节点或另一个拆分。不确定 sklearn 是否做同样的事情,但你知道这就是我构建整个事情的方式。看起来和你描述的很相似 -
添加了可能的答案,可能是也可能不是你要找的!
标签: python pandas machine-learning decision-tree