在使用相同的RandomForest技术和相同的数据集时,我在WEKA和scikit之间的结果上有着特殊的差异。使用scikit,我的AUC大约为0.62(因为我做了大量的测试)。然而,随着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随机森林的实现。
您的帮助将受到高度赞赏!!
非常感谢!
答案 0 :(得分:3)
在scikit-learn问题跟踪器上发布问题后,我得到的反馈是问题出在我使用的“预测”功能中。应该是“pred_test = clr.predict_proba(X_test)[:,1]”而不是“pred_test = clr.predict(X_test)”,因为分类问题是二进制:0或1。
实施变更后,结果对于WEKA和scikit的随机森林来说是相同的:)