为什么用python编写的决策树代码预测与用R编写的代码不同?
我正在使用
python中的sklearn和R中的load_iris数据集(它在R中称为iris).
我使用“gini”索引在两种语言中构建了模型,在两种语言中,当测试数据直接来自虹膜数据集时,我能够正确地测试模型. 但是,如果我将新数据集作为测试输入,则对于同一个python,R将其放入不同的类别. 我不确定我在这里错过了什么或做错了,所以我们非常感谢任何指导. 代码如下: 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,1.3]]) R-Rstudio运行3.3.2 32位: 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 我的python输出是: [ 5. 3.3 1.4 0.2] [0] [ 5.7 2.8 4.1 1.3] [1] [ 6.3 3.3 6. 2.5] [2] [ 5.9 3. 5.1 1.8] [2] [6.3,1.3] [2] -----> this means it's putting the test data into virginica bucket 和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 ~ .,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,xval = 0和maxdepth = 30这两个选项,以便与sklearn-options相同,参见here. maxdepth = 30是rpart允许的最大值; sklearn没有约束).如果您希望概率等相同,您可能也想要使用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,1.3]]) [0] [1] [2] [2] [1] 看起来与您的初始R输出非常相似. 毋庸置疑,当您的预测(在训练集上)看起来“不合理地好”时要小心,因为您可能会过度拟合数据.例如,看一下model.predict_proba(…),它给出了sklearn中的概率(而不是预测的类).您应该看到,使用您当前的Python代码/设置,您几乎肯定会过度拟合. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |