2013-01-08 42 views
5

Nói rằng tôi có một tập dữ liệu như thế này:Rắc rối tìm hiểu đầu ra từ rừng ngẫu nhiên scikit

5.9;0.645;0.12;2;0.075;32;44;0.99547;3.57;0.71;10.2;5 
6;0.31;0.47;3.6;0.067;18;42;0.99549;3.39;0.66;11;6 

nơi 11 cột 1 cho thấy tính năng (axit, clorua, vv) và cột cuối cùng chỉ ra những đánh giá được đặt cho mục (ví dụ như 5 hoặc 6.)

Tập dữ liệu được đào tạo như sau:

target = [x[11] for x in dataset] 
train = [x[0:11] for x in dataset] 

rf = RandomForestClassifier(n_estimators=120, n_jobs=-1) 
rf.fit(train, target) 

predictions = rf.predict_proba(testdataset) 
print predictions[0] 

mà in cái gì đó như

[ 0.   0.01666667 0.98333333 0.   0.   0.  ] 

Bây giờ, tại sao nó không tạo ra một phân loại đơn lẻ, ví dụ như xếp hạng 5 hoặc 6?

Tài liệu cho biết "Xác suất lớp được dự đoán của mẫu đầu vào được tính như xác suất lớp được dự đoán trung bình của các cây trong rừng" mà tôi không hiểu.

Nếu bạn sử dụng

print rf.predict(testdataset[-1]) 
[ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.] 

It in một cái gì đó giống như bạn mong muốn - ít nhất là nó trông giống như xếp hạng - nhưng tôi vẫn không hiểu tại sao có một dự đoán cho mỗi tính năng và không phải là một dự đoán đơn tham gia tính đến tất cả các tính năng?

+0

btw dữ liệu đến từ các tập dữ liệu rượu vang ở đây: http://www3.dsi.uminho.pt/pcortez/wine/ – Sofia

+0

hình dạng của testdatasets là gì? –

Trả lời

9

Ngoài Diego câu trả lời:

RandomForestClassifier là một phân loại để dự đoán phân lớp cho một số rời rạc của các lớp học mà không đặt hàng giữa các nhãn lớp.

Nếu bạn muốn đánh giá liên tục, dấu chấm động, bạn nên cố gắng sử dụng mô hình hồi quy chẳng hạn như RandomForestRegressor thay thế.

Bạn có thể phải kẹp đầu ra thành phạm vi [0, 6] vì không có bảo đảm mô hình sẽ không xuất dự đoán chẳng hạn như 6.2 chẳng hạn.

Chỉnh sửa để trả lời cho bạn điểm thứ hai, phương pháp predict mong đợi danh sách các mẫu. Do đó bạn nên cung cấp cho nó một danh sách một mẫu trong trường hợp của bạn.Hãy thử:

print rf.predict([testdataset[-1]]) 

hoặc cách khác:

print rf.predict(testdataset[-1:]) 

Tôi tự hỏi tại sao bạn không nhận được một lỗi trong trường hợp đó.

Chỉnh sửa: ouput không thực sự có ý nghĩa: hình dạng của bộ dữ liệu của bạn là gì?

>>> print np.asarray(train).shape 

>>> print np.asarray(target).shape 

>>> print np.asarray(testdataset).shape 
+0

Tôi đang làm việc ngay bây giờ. Sau đó tôi sẽ trả lời nhưng đây là bài đăng khám phá cùng một tập dữ liệu: http://fastml.com/predicting-wine-quality/ – Sofia

+0

Tôi đã thực sự là một lỗi ở đó để sử dụng rf.predict ([test [-1]]) bây giờ kết quả đầu ra hợp lý của [6]. Về các hình dạng ở đây chúng là: np.asarray (target) .shape -> (1597,), np.asarray (train) .shape -> (1597, 11), np.asarray (test) .shape -> (1599 , 11). Họ có nên như vậy không? – Sofia

+0

Các hình dạng trông đẹp. Vui vì nó đã sửa lỗi của bạn. – ogrisel

3

Từ các tài liệu, predict_proba lợi nhuận:

p: mảng hình dạng = [N_SAMPLES, n_classes], hoặc một danh sách các n_outputs mảng như vậy nếu n_outputs> 1. Xác suất lớp của các mẫu đầu vào. Các lớp học được sắp xếp theo thứ tự số học.

Mấu chốt ở đây là cụm từ cuối cùng "Lớp học được sắp xếp theo thứ tự số học". Đoán của tôi là một số mẫu đào tạo của bạn có ít hơn 5, trong đó predict_proba được gán một xác suất bằng 0, trong khi lớp 5 và 6 có xác suất 0,01666667 và 0,98333333, trong khi 3 lớp khác, tất cả> 6, cũng có xác suất số không.

+0

Xin chào, xếp hạng đi từ 3 đến 8. Vì vậy, từ những gì tôi hiểu predict_kết là xuất danh sách xác suất cho mỗi xếp hạng, sao cho trong ví dụ được cho [0. 0,01666667 0,98333333 0,3 0]. 5 với xác suất 0,983. Rõ ràng hơn bây giờ cảm ơn :) – Sofia

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