Sklearn DecisionTreeclassifier 为拆分返回不可能的值

Posted

技术标签:

【中文标题】Sklearn DecisionTreeclassifier 为拆分返回不可能的值【英文标题】:Sklearn DecisionTreeclassifier returning impossible value for split 【发布时间】:2018-11-25 06:45:05 【问题描述】:

我正在尝试使用 DataFrame (pandas) 从 sklearn 实现 DecisionTreeClassifier,但是在拆分我的数据时它会返回一些奇怪的值。我的数据集包含 3 列具有 Pearsons 相关系数的列,只能介于 -1.0 和 1.0 之间。但是,根节点已经开始在 Pearsons

在我的代码中,我尝试了 Gini 和 Entropy 标准、拆分器和其他可能参数的不同组合。现在或多或少是我的代码,但我仍在使用参数:

newtable = table_of_pickle_ptptnew.loc[:,('Pearsons Ratio', 'Pearsons 330nm', 'Pearsons 350nm', 'Ratio Space', '330nm Similarity', '350nm Similarity')]

x = newtable.values
y = table_of_pickle_ptptnew['Binding Known'].values

dtree=DecisionTreeClassifier(max_features='auto',
                             max_depth=3,
                             criterion ='entropy',
                             min_impurity_decrease=0.09
                            )
fittree = dtree.fit(x, y.astype('str'))

dot_data = tree.export_graphviz(fittree, out_file=None,
                               class_names=['No Interaction', 'Interaction'],
                               feature_names=['Pearsons Ratio', 'Pearsons 330nm', 'Pearsons 350nm', 'Ratio Space', '330nm Similarity', '350nm Similarity'],
                               filled=True) 
graph = graphviz.Source(dot_data) 
graph



          Pearsons Ratio    Pearsons 330nm  Pearsons 350nm  Ratio Space     330nm Similarity    350nm Similarity
Elem a     0.94856          0.99999         0.99999        0.000725507      0.157209             0.0572688
Elem b     0.99234          1               0.99999        0.00657003       0.0568281            0.0465139
Elem c     0.98525          0.99999         0.99999        0.0114932        0.0226809            0.133452
Elem d     0.99793          0.99999         0.99999        0.000643209      0.154585             0.0914759
Elem e     0.99849          0.99999         0.99999        0.00128532       0.0932893            0.0464462

这是树的第一个节点的样子。所以,我的意思是 False 在根节点 (Pearson 350nm 不可能 存在,因为所有样本都是

【问题讨论】:

为了澄清,皮尔逊的相关系数一般可以取-1到1之间的值,但您的数据只包含0到1之间的值? 不抱歉,我的错。它是从-1到1,正确的。我会在问题中更正它。 一个可能的想法是您重新调整了功能,但从代码 sn-p 来看似乎并非如此。顺便说一句,该图还显示了有多少样本满足给定的条件链,对于 False,这个数字真的是 0 吗? 否... True/False 的两个子节点都给出满足条件的样本。那是我的问题。如果我在我的真实代码中实现它,它不会起作用,因为我知道没有任何值可以高于 1.0。现在,它给了我 [7,53] 的 True 和 [34,7] 的 False ...:/ 你能从你的新表中发布 5 到 10 行吗? 【参考方案1】:

好的。我发现了问题所在。 树的 graphviz 可视化对十进制数有限制,如果太大则将它们四舍五入。我使用一种算法自动为我的决策树提供伪代码,并在代码输出中显示“真实值”。在 graphviz 的图形树中,根节点的 1.0 实际上是“0.9999749660491943”。

我认为,对于使用大量数字的科学数字的每个人来说,了解这一点很重要。 :) 如果您使用这样的数字,请记住从您的树中获取决策代码,而不要只为漂亮的彩色树而去。

感谢所有花时间帮助我解决问题的人。 :)

【讨论】:

以上是关于Sklearn DecisionTreeclassifier 为拆分返回不可能的值的主要内容,如果未能解决你的问题,请参考以下文章

sklearn的PCA

sklearn数据库-老鱼学sklearn

使用sklearn画二分类模型ROC曲线,PR曲线

Keras Sklearn Tuner 模块“sklearn”没有属性“管道”

导入sklearn时出现conda sklearn错误

sklearn库的安装