2017-06-18 1 views
3

私はpythonとRのsklearnからload_irisデータセットを使って作業しています(これはRのirisと呼ばれています)。なぜPythonで書かれたDecision Treeコードは、Rで書かれたコードとは異なった予測をしますか?

「gini」インデックスを使用して両方の言語でモデルを構築しました。両方の言語で、テストデータを虹彩データセットから直接取得するときにモデルを適切にテストすることができます。

しかし、私が新しいデータセットをテスト入力として与えると、同じpythonに対してRは別のカテゴリにそれを置きます。

私はここで何が間違っているのか間違っているのか分かりませんので、どんな指導も非常に高く評価されます。 パイソン2.7:

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, 2.8, 6, 1.3] [2] -----> this means it's putting the test data into virginica bucket 

及び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,2.8,6,1.3]]) 

R-Rstudioは3.3.2 32ビットを実行

コードは、下記出力は:

> 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 

助けてください。ありがとうございました。

+0

Rツリーのツリーパラメータと値を公開できますか? – CPak

答えて

5

ディシジョンツリーには、いくつかのパラメータ(最小/最大離脱サイズ、ツリーの深さ、分割するタイミングなど)が含まれています。また、異なるパッケージには異なるデフォルト設定があります。同じ結果を得たい場合は、暗黙のデフォルトが似ていることを確認する必要があります。たとえば、次のことを実行してみてください。

ここ
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 

hereを参照してください、sklearn -optionsと同じになるように、オプションminsplit = 2, minbucket = 1, xval=0maxdepth = 30が選択されています。 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) 

と同様に

は、私はあなたの最初の R出力にかなり似ています

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] 

を取得します。

データをオーバーフィットする可能性が高いため、(トレーニングセットの)予測が「不合理に良い」と思われるときは、言うまでもなく、注意してください。たとえば、model.predict_proba(...)を見てください。予測されるクラスではなくsklearnの確率が与えられます。あなたは、現在のPythonコード/設定では、ほぼ間違いなくオーバーフィットしているはずです。

+0

非常に説明的で有益な答え@coffeinjunkey。ありがとうございました。 'min_samples_leaf = round(20.0/3.0)' 'ValueError:min_samples_leafが少なくとも1つ、(0、0.5)、7.0があります。 'を投げてしまいました。 Pythonは次のようになります: 'model = tree.DecisionTreeClassifier(criterion = 'gini'、 min_samples_split = 20)int型のラウンド関数はint型で動作します。 、 min_samples_leaf = int(round(20.0/3.0))、max_depth = 30) ' – S4nd33p

2

@ coffeeinjunkyの答えに加えて、random_stateというパラメータに注意する必要があります(これはPythonのパラメータであり、これはRで何が呼び出されているかわかりません)。ツリー自体の生成は擬似ランダムであるため、両方のモデルのシード値が同じであるように指定する必要があります。それ以外の場合は、使用されているツリーがそれぞれ異なるため、同じモデルでフィット/予測し、実行ごとに異なる結果が得られます。

Muellerの決定木に関するセクションを確認してください。& Guido - '機械学習のためのPython'異なるパラメータを視覚的に説明するのはうまくやるが、Google検索を試してみると、インターネット上にはpdfが浮かんでいる。デシジョンツリーとアンサンブル学習方法では、指定するパラメータが予測に有意義な影響を与えます。

関連する問題