【问题标题】:How can I create an indexed dataframe after predicting values in decision tree预测决策树中的值后如何创建索引数据框
【发布时间】: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


【解决方案1】:

基于 cmets,我不确定是否有足够的信息继续下去。但是,如果您的 dt_predict 函数仅输出基于单行输入特征的单个预测,那么它可以用于将预测列添加回原始数据帧,如下所示:

def dt_predict(df_row):
    features=df_row.values
    #magic goes here to predict based on features
    return predicted_class

df['prediction']=df.apply(dt_predict, axis=1)

【讨论】:

  • 谢谢 这可以用apply创建一个新的数据框吗?
  • 不,这意味着在原始训练数据帧上使用,并维护现有索引
  • 你没有看到我怎样才能保留原始索引并创建一个新的数据帧?
  • 如果不查看整个模型训练脚本的背景情况,很难知道这一点,这超出了 stackoverflow 的范围。如果您想使用旧的索引创建一个新的 DF,那么您可以在引入数据时使用df.index 获取索引并将该索引保留为节点属性,然后将其与您的预测一起返回并pd.concat一起预测
  • 如果你有一些最有效的东西,但你想做得更好,你可以看看codereview.stackexchange.com
猜你喜欢
  • 2013-07-11
  • 2013-12-21
  • 2015-09-09
  • 2016-07-12
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2018-06-29
相关资源
最近更新 更多