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

3 投票
1 回答
2711 浏览
提问于 2025-04-17 16:15

我在使用相同的随机森林技术和相同的数据集时,发现WEKA和scikit的结果差异很大。使用scikit时,我的AUC值大约是0.62(我进行了大量测试,结果都是这样)。但是在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随机森林的实现上。

非常感谢你的帮助!!

谢谢你!

1 个回答

4

在我把问题发到scikit-learn的问题追踪器后,得到了反馈,问题出在我使用的“predict”函数上。正确的写法应该是“pred_test = clr.predict_proba(X_test)[:, 1]”,而不是“pred_test = clr.predict(X_test)”。因为这是一个二分类问题,结果只有0或1。

在我做了这个修改后,WEKA和scikit的随机森林结果是一样的 :)

撰写回答