3

同じ RandomForest 手法と同じデータセットを使用しているときに、WEKA と scikit の結果に独特の違いがあります。scikit を使用すると、約 0.62 の AUC が得られます (常に、広範なテストを行ったため)。ただし、WEKA を使用すると、0.79 に近い結果が得られます。それは大きな違いです!

アルゴリズムをテストしたデータセットは KC1.arff で、そのコピーをパブリック ドロップボックス フォルダーhttps://dl.dropbox.com/u/30688032/KC1.arffに置きました。WEKA の場合、単純にhttp://www.cs.waikato.ac.nz/ml/weka/downloading.htmlから .jar ファイルをダウンロードしました。WEKA では、交差検証パラメーターを 10 倍、データセットを KC1.arff、アルゴリズムを "RandomForest -l 19 -K 0 -S 1" に設定しました。次に、コードを実行しました!WEKA で結果を生成したら、ファイル、.csv または .arff として保存する必要があります。そのファイルを読み、「Area_under_ROC」列を確認すると、0.79 に近いはずです。

以下は、scikit の RandomForest のコードです。

import numpy as np
from pandas import *
from sklearn.ensemble import RandomForestClassifier

def read_arff(f):
    from scipy.io import arff
    data, meta = arff.loadarff(f) 
    return DataFrame(data)

def kfold(clr,X,y,folds=10):
    from sklearn.cross_validation import StratifiedKFold
    from sklearn import metrics
    auc_sum=0
    kf = StratifiedKFold(y, folds)
    for train_index, test_index in kf:
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        clr.fit(X_train, y_train)
        pred_test = clr.predict(X_test)
        print metrics.auc_score(y_test,pred_test)
        auc_sum+=metrics.auc_score(y_test,pred_test)

    print 'AUC: ',  auc_sum/folds
    print  "----------------------------" 



#read the dataset
X=read_arff('KC1.arff')
y=X['Defective']

#changes N, and Y to 0, and 1 respectively
s = np.unique(y)
mapping = Series([x[0] for x in enumerate(s)], index = s)  
y=y.map(mapping) 
del X['Defective']

#initialize random forests (by defualt it is set to 10 trees)
rf=RandomForestClassifier()

#run algorithm
kfold(rf,np.array(X),y)

#You will get an average AUC around 0.62 as opposed to 0.79 in WEKA

関連論文の実験結果に示されているように、実際の auc 値は約 0.79 であるため、問題は scikit ランダム フォレストを使用する実装にあることに注意してください。

あなたの親切な助けは非常に高く評価されます!!

どうもありがとうございました!

4

1 に答える 1

4

scikit-learn Issue Trackerに質問を投稿した後、問題は使用した「予測」機能にあるというフィードバックを受け取りました。分類問題はバイナリ(0または1)であるため、「pred_test = clr.predict(X_test)」ではなく、「pred_test = clr.predict_proba(X_test)[:,1]」である必要があります。

変更を実装した後、結果はWEKAとscikitのランダムフォレストで同じであることが判明しました:)

于 2013-02-21T07:28:53.210 に答える