2013-01-09 121 views
5

我想從csv加載訓練和測試數據,在scikit/sklearn中運行隨機森林迴歸器,然後預測測試文件的輸出。Python Scikit隨機森林迴歸錯誤

TrainLoanData.csv文件包含5列;第一列是輸出,接下來的4列是特徵。 TestLoanData.csv包含4列 - 特徵。

當我運行代碼,我得到錯誤:

predicted_probs = ["%f" % x[1] for x in predicted_probs] 
IndexError: invalid index to scalar variable. 

這是什麼意思?

這裏是我的代碼:

import numpy, scipy, sklearn, csv_io //csv_io from https://raw.github.com/benhamner/BioResponse/master/Benchmarks/csv_io.py 
from sklearn import datasets 
from sklearn.ensemble import RandomForestRegressor 

def main(): 
    #read in the training file 
    train = csv_io.read_data("TrainLoanData.csv") 
    #set the training responses 
    target = [x[0] for x in train] 
    #set the training features 
    train = [x[1:] for x in train] 
    #read in the test file 
    realtest = csv_io.read_data("TestLoanData.csv") 

    # random forest code 
    rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1) 
    # fit the training data 
    print('fitting the model') 
    rf.fit(train, target) 
    # run model against test data 
    predicted_probs = rf.predict(realtest) 
    print predicted_probs 
    predicted_probs = ["%f" % x[1] for x in predicted_probs] 
    csv_io.write_delimited_file("random_forest_solution.csv", predicted_probs) 

main() 

回答

5

RandomForestRegressor的返回值是float數組:

In [3]: rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1) 

In [4]: rf.fit([[1,2,3],[4,5,6]],[-1,1]) 
Out[4]: 
RandomForestRegressor(bootstrap=True, compute_importances=False, 
      criterion='mse', max_depth=None, max_features='auto', 
      min_density=0.1, min_samples_leaf=1, min_samples_split=2, 
      n_estimators=10, n_jobs=-1, oob_score=False, 
      random_state=<mtrand.RandomState object at 0x7fd894d59528>, 
      verbose=0) 

In [5]: rf.predict([1,2,3]) 
Out[5]: array([-0.6]) 

In [6]: rf.predict([[1,2,3],[4,5,6]]) 
Out[6]: array([-0.6, 0.4]) 

所以你想指數浮動像(-0.6)[1],這是不可能的。

作爲一個方面說明,該模型不返回概率。

2

首先,它總是有幫助的也有樣本數據來再現和調試問題。如果它們太大或太密,可以提取它們中有趣的部分。

變量predicted_probs的內容似乎不像您期望的那樣。它似乎是一個整數列表(或數組),這也是我所期望的。

在sklearn中,X.train()方法總是接受訓練數據及其相關類(通常是整數或字符串)。然後X.predict()方法僅採用驗證數據並且返回預測結果,即,對於驗證數據中的每個集合一個類別(再次爲整數或字符串)。

如果你想知道訓練好的分類器的精度有多好,你不能僅僅訓練和預測,但是你必須做一個交叉驗證,即重複訓練和驗證,並且每次檢查有多少預測是正確的。 sklean有一個很好的文檔,我相信你會找到相應的部分。如果沒有,問我。

+0

其實,'predict'的結果是一個浮點數組。 RandomForestRegressor是一個迴歸模型,而不是分類器。 –

+0

當然,你是對的。 –