Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么用python编写的决策树代码与用R编写的代码预测结果不同?_Python_R_Decision Tree - Fatal编程技术网

为什么用python编写的决策树代码与用R编写的代码预测结果不同?

为什么用python编写的决策树代码与用R编写的代码预测结果不同?,python,r,decision-tree,Python,R,Decision Tree,我正在使用python和R中的sklearn中的load_iris数据集(在R中称为iris) 我使用“基尼”索引用两种语言构建了模型,当测试数据直接取自iris数据集时,我能够用这两种语言正确地测试模型 但是,如果我给出一个新的数据集作为测试输入,那么对于相同的python和R,将它放入不同的类别中 我不确定我在这里遗漏了什么或做错了什么,所以任何指导都将非常感谢 代码如下: Python 2.7: from sklearn.datasets import load_iris from skl

我正在使用python和R中的sklearn中的load_iris数据集(在R中称为iris)

我使用“基尼”索引用两种语言构建了模型,当测试数据直接取自iris数据集时,我能够用这两种语言正确地测试模型

但是,如果我给出一个新的数据集作为测试输入,那么对于相同的python和R,将它放入不同的类别中

我不确定我在这里遗漏了什么或做错了什么,所以任何指导都将非常感谢

代码如下: Python 2.7:

from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
model = tree.DecisionTreeClassifier(criterion='gini')
model.fit(iris.data, iris.target)
model.score(iris.data, iris.target)
print iris.data[49],model.predict([iris.data[49]])
print iris.data[99],model.predict([iris.data[99]])
print iris.data[100],model.predict([iris.data[100]])
print iris.data[149],model.predict([iris.data[149]])
print [6.3,2.8,6,1.3],model.predict([[6.3,2.8,6,1.3]])
运行3.3.2 32位的R-Rstudio:

library(rpart)
iris<- iris
x_train = iris[c('Sepal.Length','Sepal.Width','Petal.Length','Petal.Width')]
y_train = as.matrix(cbind(iris['Species']))
x <- cbind(x_train,y_train)
fit <- rpart(y_train ~ ., data = x_train,method="class",parms = list(split = "gini"))
summary(fit)
x_test = x[149,]
x_test[,1]=6.3
x_test[,2]=2.8
x_test[,3]=6
x_test[,4]=1.3
predicted1= predict(fit,x[49,]) # same as python result
predicted2= predict(fit,x[100,]) # same as python result 
predicted3= predict(fit,x[101,]) # same as python result
predicted4= predict(fit,x[149,]) # same as python result
predicted5= predict(fit,x_test) ## this value does not match with pythons result
R输出为:

> predicted1
   setosa versicolor virginica
49      1          0         0
> predicted2
    setosa versicolor  virginica
100      0  0.9074074 0.09259259
> predicted3
    setosa versicolor virginica
101      0 0.02173913 0.9782609
> predicted4
    setosa versicolor virginica
149      0 0.02173913 0.9782609
> predicted5
    setosa versicolor  virginica
149      0  0.9074074 0.09259259 --> this means it's putting the test data into versicolor bucket

请帮忙。谢谢。

决策树涉及很多参数(最小/最大休假大小、树的深度、何时拆分等),不同的包可能有不同的默认设置。如果希望得到相同的结果,则需要确保隐式默认值相似。例如,请尝试运行以下命令:

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
我明白了

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
输出非常相似


不用说,当你的预测(在训练集上)看起来“不合理的好”时,要小心,因为你可能会过度拟合数据。例如,看一看
model.predict_probabila(…)
,它给出了
sklearn
中的概率(而不是预测的类)。您应该看到,使用当前的Python代码/设置,您几乎肯定是过度拟合了

除了@coffeinjunky的答案之外,您还需要注意参数
random\u state
(这是Python参数,不确定在R中调用了什么)。树本身的生成是伪随机的,因此您需要指定两个模型具有相同的种子值。否则,您将使用相同的模型进行拟合/预测,并在每次运行时得到不同的结果,因为每个运行中使用的树都不同


查看Mueller&Guido中关于决策树的部分--“机器学习的Python”。它在直观地解释不同的参数方面做得很好,如果你只是尝试谷歌搜索,PDF就会在互联网上浮动。使用决策树和集成学习方法,您指定的参数将对预测产生有意义的影响。

您可以发布R树的树参数和值吗?这是一个非常具有描述性和信息性的回答@coffeinjunkey。非常感谢。我只想添加一件事:
min\u samples\u leaf=round(20.0/3.0)
抛出了一个
ValueError:min\u samples\u leaf必须至少为1或in(0,0.5),得到7.0
。为了解决这个问题,我用int()包装了round函数因此,从我这里更新的代码应该是:
model=tree.DecisionTreeClassifier(criteria='gini',minu-samples\u-split=20,minu-samples\u-leaf=int(round(20.0/3.0)),max-depth=30)
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]