2013-10-09 34 views
0

輸入訓練或測試文件格式如下:爲什麼交叉驗證用於RandomForestRegressor失敗在scikit學習

-1 1 11.10115101|u 11.10115101 |s 2 |reason k:0.116|pv pv1000|g 2230444827 |k k3|w k:0 
-1 1 11.10115101|u 11.10115101 |s 0 |reason c:0.080|pv pv1000|g 2235873129 |k k0|w c:1 
-1 1 11.10115101|u 11.10115101 |s 1 |reason h:0.054 o:0.073|pv pv1000|g 2236879382 |k k10|w h:1 o:21 
-1 1 11.10115101|u 11.10115101 |s 0 |reason u:0.133|pv pv1000|g 2237638819 |k k5|w u:26 
-1 1 11.10115101|u 11.10115101 |s 0 |reason o:0.086|pv pv1000|g 2237694729 |k k5|w o:11 
-1 1 11.10115101|u 11.10115101 |s 2 |reason l:0.111|pv pv1000|g 2237821631 |k k3|w l:0 

的碼是作爲初級講座,所述load_data()函數加載訓練數據或測試數據進入蟒蛇字典的列表,並返回一個元組([快譯通,...],[0,1,0 ...]):

parser = argparse.ArgumentParser() 
parser.add_argument('-t', '--train', required = True, help='train file') 
parser.add_argument('-e', '--test', required = True, help='test file') 
ns = parser.parse_args(sys.argv[1:]) 
f = open(ns.train) 
inputs, targets = load_data(f) 

print >>sys.stderr, 'load finish' 
vec = DictVectorizer() 
train = vec.fit_transform(inputs) 
print >>sys.stderr, 'dict vectorizer finish' 

print >>sys.stderr, 'training' 
clf = RandomForestRegressor() 
clf.fit(train.toarray(), targets) 


print >>sys.stderr, 'testing' 
f = open(ns.test) 
test_inputs, test_targets = load_data(f) 
test = vec.transform(test_inputs) 
print cross_validation.cross_val_score(clf, test.toarray(), test_targets, scoring='roc_auc') 

培訓工作正常,但這樣做交叉驗證時,最後一行的代碼拋出異常:

File "randomforest.py", line 72, in <module> 
    print cross_validation.cross_val_score(clf, test.toarray(), test_targets, scoring='roc_auc') 
    File "/Users/jerry/pkgs/vpy/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1152, in cross_val_score 
    for train, test in cv) 
    File "/Users/jerry/pkgs/vpy/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 517, in __call__ 
    self.dispatch(function, args, kwargs) 
    File "/Users/jerry/pkgs/vpy/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 312, in dispatch 
    job = ImmediateApply(func, args, kwargs) 
    File "/Users/jerry/pkgs/vpy/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 136, in __init__ 
    self.results = func(*args, **kwargs) 
    File "/Users/jerry/pkgs/vpy/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1058, in _cross_val_score 
    y_train = y[train] 
TypeError: only integer arrays with one element can be converted to an index 

我編寫了手動示例中的代碼,但失敗了。

+2

請始終報告完整回溯。還有什麼'test_targets'?它的類型和形狀是什麼?它是否具有與'test_inputs'變量相同數量的樣本?顯然這是無效的。 最後,交叉驗證是爲了在模型選擇的開發集上運行。通常在最終評估(測試)集上運行它並不合乎情理。 – ogrisel

+0

對不起,我添加了更多的代碼。 – mike

+0

您仍然不提供有關'test_targets'變量性質的任何信息:它是一個numpy數組,是一個python列表,還有其他什麼東西?它是一個數組,'.shape'和'.dtype'是什麼? – ogrisel

回答

2

該錯誤與最近報告的issue #2508相匹配。

一種解決方法是調用添加:調用cross_val_score

test_targets = np.asarray(test_targets) 

之前。

+0

像夢一樣工作,謝謝。 – Patthebug

0

我用另一種方式來CAL AUC,如:

preds = clf.predict_proba(test) 
fpr, tpr, thresholds = roc_curve(test_targets, preds[:, 1]) 
roc_auc = auc(fpr, tpr)