R 与 Python 决策树

数据挖掘 机器学习 Python r 决策树
2021-10-11 17:08:48

根据我的经验,R 决策树返回的结果比 python 决策树更准确。可以再确认这个假设并且可能知道原因吗?

3个回答

决策树涉及很多超参数——

  • 最小/最大休假

  • 尺寸

  • 树的深度
  • 分裂标准(基尼/熵)等

现在不同的包可能有不同的默认设置。即使在内部Rpython如果您使用多个包并比较结果,它们也很可能会有所不同。

R没有什么表明“更好”

如果您想获得相同的结果,则需要确保隐式默认值相似。例如,尝试运行以下命令:

fit <- rpart(y_train ~ ., data = x_train,method="class",
             parms = list(split = "gini"), 
             control = rpart.control(minsplit = 2, minbucket = 1, xval=0, maxdepth = 30))

(predicted5= predict(fit,x_test))
    setosa versicolor virginica
149      0  0.3333333 0.6666667

在这里,参数minsplit = 2, minbucket = 1, xval=0maxdepth = 30被选择为与sklearn-options 相同,请参见此处是让你拥有maxdepth = 30的最大价值;rpart

sklearn另一方面,这里没有界限。如果你想probabilities保持相同,你可能也想玩弄这个cp参数。

同样,与

model = tree.DecisionTreeClassifier(criterion='gini', 
                                    min_samples_split=20, 
                                    min_samples_leaf=round(20.0/3.0), max_depth=30)
model.fit(iris.data, iris.target)

我明白了

print model.predict([iris.data[49]])
print model.predict([iris.data[99]])
print model.predict([iris.data[100]])
print model.predict([iris.data[149]])
print model.predict([[6.3,2.8,6,1.3]])

[0]
[1]
[2]
[2]
[1]

这看起来类似于您的初始R输出。

总而言之,我相信默认值R更适合您正在处理的数据集,因此“更好”的结果。但请放心,鉴于参数是明确且相等的,它们是相似的。

希望这可以帮助!

主要区别在于 R/rpart 实现有后修剪,而 scikit learn 没有。在 scikit learn 的情况下,我可能会导致很多过度拟合。

它看起来也像 rpart 直接处理分类变量,但scikit-learn没有。

与其他工具相比,为什么分类变量需要在 scikit-learn 中进行预处理? 大多数 scikit-learn 假设数据位于 NumPy 数组或单个数字 dtype 的 SciPy 稀疏矩阵中。这些目前没有明确表示分类变量。因此,与 R 的 data.frames 或 pandas.DataFrame 不同,我们需要将分类特征显式转换为数值,如编码分类特征中所述。有关使用异构(例如分类和数字)数据的示例,另请参阅具有混合类型的列转换器。