2013-01-09 82 views
5

Tôi đang cố gắng tải dữ liệu đào tạo và kiểm tra từ một csv, chạy bộ hồi quy rừng ngẫu nhiên trong scikit/sklearn, và sau đó dự đoán đầu ra từ tệp thử nghiệm.Python Scikit Random Forest Regressor Lỗi

Tệp TrainLoanData.csv chứa 5 cột; cột đầu tiên là đầu ra và 4 cột tiếp theo là các tính năng. TestLoanData.csv chứa 4 cột - các tính năng.

Khi tôi chạy mã, tôi nhận được lỗi:

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

này có nghĩa là gì?

Đây là mã của tôi:

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() 

Trả lời

5

Giá trị trả về từ một RandomForestRegressor là một mảng phao:

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]) 

Vì vậy, bạn đang cố gắng index một phao như (-0.6)[1], đó là không thể.

Lưu ý phụ, mô hình không trả về xác suất.

2

Thứ nhất, nó luôn luôn hữu ích cũng có dữ liệu mẫu để tái tạo và gỡ lỗi vấn đề của bạn. Nếu chúng quá lớn hoặc bí mật, bạn có thể trích ra phần thú vị của chúng.

Nội dung của biến số predicted_probs dường như không giống như bạn mong đợi. Nó có vẻ là một danh sách (hoặc mảng) của các số nguyên, và đây cũng là những gì tôi mong đợi.

Trong sklearn, phương pháp X.train() luôn lấy lớp đào tạo và các lớp chỉnh sửa của chúng (thường là số nguyên hoặc chuỗi). Phương thức X.predict() sau đó chỉ lấy dữ liệu xác thực và trả về kết quả dự đoán, tức là, đối với mỗi tập hợp trong một lớp dữ liệu xác nhận (một số nguyên hoặc chuỗi).

Nếu bạn muốn biết độ chính xác của trình phân loại được đào tạo, bạn không được chỉ đào tạo và dự đoán, nhưng bạn phải thực hiện xác thực chéo, tức là liên tục đào tạo và xác thực và mỗi lần kiểm tra xem có bao nhiêu dự đoán là chính xác . sklean có một tài liệu tuyệt vời, tôi chắc chắn bạn sẽ tìm thấy phần tương ứng. Nếu không, hãy hỏi tôi.

+0

Thực ra, kết quả từ 'dự đoán' là một mảng nổi. Một 'RandomForestRegressor' là một mô hình hồi quy, không phải là một trình phân loại. –

+0

Chắc chắn, bạn nói đúng. –

1

Hãy thử sử dụng "genfromtxt" của numpy thay vì "csv_io.read_data" để tải tập dữ liệu - nó sẽ tự động chuyển đổi dữ liệu của bạn thành csv thành mảng có nhiều mảng. Và đọc Getting Started With Python For Data Science bài viết sẽ hữu ích cho bạn ...

Các vấn đề liên quan