2017-02-22 4 views
1

私はscikit-学ぶWebサイトから次のコードを持っている:CITアルゴリズムはscikit-learnによって使用されていますか?

import numpy as np 
from sklearn.datasets import load_iris 
from sklearn.model_selection import cross_val_score 
from sklearn.tree import DecisionTreeClassifier 
iris = load_iris() 
for i in range(10): 
    clf = DecisionTreeClassifier()  
    a = cross_val_score(clf, iris.data, iris.target, cv=10) 
    clf2 = DecisionTreeClassifier()  
    b = cross_val_score(clf2, iris.data, iris.target, cv=10) 
    if not np.array_equal(a,b): 
     print 'diff' 
     print a 
     print b 
     break 

をその時々の違いを出力しますので、私は非常に奇妙であるその決定論的ではないと思います。

答えて

0

決定木は確定的であり、同じ生データセットの葉/確率を計算します。ランダムなフォレストのようなものを使用する場合は、変数をランダムに選択しているため決定的ではありません。問題は、あなたの平等のためのテストです。あなたはネイティブDecisionTreeClassifierの種類を比較する方法を知らない

object1 == object2

のPythonを使ってテストしています。そのプロパティに同じ値が割り当てられているかどうかを確認していますか?メモリサイズが同じかどうかを知りたいですか? dtとdt2ポインタは同じオブジェクトを参照していますか?あなたが書いたことから知る方法はありません。より良いテストは、モデルをトレーニングし、同じデータに対して.predict()メソッドを使用することです。毎回すべての結果が同じですか?それからあなたはおそらく決定的な分類子を持っています。

"pythonic"の方法は、クラスファイルに__ eq __メソッドを定義することです。 hereを見ると、ツリークラスに1つもないことがわかります。私はそれ以上見ていませんが、そのメソッドを定義しているかどうかは疑問です。 (2つのクラシファイアモデルが同等かどうかを確認することは一般的なことではありません)。

+0

あなたが正しいです、私はそれに応じて例を変更します –

1

[OK]をhere述べたように、私は、random_stateパラメータが指定されていない場合DecisionTreeClassifierはランダムシードを使用していることを発見した:

random_state:int型、RandomStateインスタンスまたはNoneを、オプションの (デフォルト=なし) intの場合、random_stateは乱数 番号ジェネレータによって使用されるシードです。 RandomStateのインスタンスの場合、random_stateはランダム 番号ジェネレータです。 Noneの場合、乱数ジェネレータはnp.randomによって使用される RandomStateインスタンスです。

固定コード:(私はrandom_state=0DecisionTreeClassifierにコンストラクタを追加した)

import numpy as np 
from sklearn.datasets import load_iris 
from sklearn.model_selection import cross_val_score 
from sklearn.tree import DecisionTreeClassifier 
iris = load_iris() 
for i in range(10): 
    clf = DecisionTreeClassifier(random_state=0)  
    a = cross_val_score(clf, iris.data, iris.target, cv=10) 
    clf2 = DecisionTreeClassifier(random_state=0)  
    b = cross_val_score(clf2, iris.data, iris.target, cv=10) 
    if not np.array_equal(a,b): 
     print 'diff' 
     print a 
     print b 
     break 

これは期待どおりに動作し、常にnp.array_equal(a,b)==True

+1

ジャック、私は 'random_state'パラメータを見つけられてうれしいですが、私が知っている限り、メソッドには' max_features == None' 'splitter!= 'random''となります。デフォルトではこれが当てはまるので、デフォルトのCARTが確定的でなければならないので、ランダム性がどこから来ているのか混乱しています。この問題を解決するには、sklearn githubページに問題を公開する必要があります。 –

+1

私は問題をここで開けました:https://github.com/scikit-learn/scikit-learn/issues/8443 –

関連する問題