为什么Weka的随机森林算法给出的结果与Scikit的随机森林分类器不同?

3
我在使用相同的RandomForest技术和数据集时,在WEKA和scikit之间得到了奇怪的结果差异。在scikit中,我得到了大约0.62的AUC(一直如此,因为我进行了广泛的测试)。然而,在WEKA中,我得到了接近0.79的结果。这是一个巨大的差异!
我测试算法的数据集是KC1.arff,我将其副本放在我的公共Dropbox文件夹中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的随机森林代码

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 随机森林实现。您的帮助将不胜感激!非常感谢!

2
首先,您应该确保在scikit中使用相同的RF实现参数。其次,正如名称所示,结果与一些随机性相关--您提到进行了广泛测试,但可能不够充分。第三,数据的分区也会影响结果。特别是,您应该确保生成的折叠是分层的。 - Lars Kotthoff
我确实进行了非常广泛的测试!使用scikit,值从未超过0.64,而我得到的auc值始终接近0.57。使用WEKA,我也进行了大量测试,我总是得到接近0.79的值,因此我认为随机性不是这里的因素。对于两种算法,我都使用了10倍交叉验证,这也给我带来了与使用70%训练和30%测试拆分相同的结果,因此,我认为我的验证方法也不是一个因素。但是,您可能在参数方面是正确的,我尽力将它们设置为相同,这就是为什么我要问您是否可以找到缺陷的原因:) :)!谢谢! - IssamLaradji
我猜测你在scikit中的折叠没有分层。 - Lars Kotthoff
@LarsKotthoff,你可以告诉我哪里的折叠没有分层吗?我正在使用scikit中解释的相同方法。谢谢。 - IssamLaradji
1
你调整了随机森林的哪些参数?你应该检查估计器数量、每次分裂采样特征数量和最大深度是否相同(至少相同)。 - Andreas Mueller
显示剩余5条评论
1个回答

4

在scikit-learn的问题追踪器上发布问题后,我收到了反馈,问题出现在我使用的"predict"函数上。由于分类问题是二进制的(即0或1),所以应该使用"pred_test = clr.predict_proba(X_test)[:, 1]"而不是"pred_test = clr.predict(X_test)"。

实施更改后,WEKA和scikit的随机森林的结果相同 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接