Hiểu dự đoán_proba từ MultiOutputClassifier


28

Tôi đang theo dõi ví dụ này trên trang web scikit-learn để thực hiện phân loại đa mục tiêu với mô hình Rừng ngẫu nhiên.

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np

X, y1 = make_classification(n_samples=5, n_features=5, n_informative=2, n_classes=2, random_state=1)
y2 = shuffle(y1, random_state=1)
Y = np.vstack((y1, y2)).T

forest = RandomForestClassifier(n_estimators=10, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

print(multi_target_forest.predict_proba(X))

Từ đây predict_probatôi nhận được một mảng 2 5x2:

[array([[ 0.8,  0.2],
       [ 0.4,  0.6],
       [ 0.8,  0.2],
       [ 0.9,  0.1],
       [ 0.4,  0.6]]), array([[ 0.6,  0.4],
       [ 0.1,  0.9],
       [ 0.2,  0.8],
       [ 0.9,  0.1],
       [ 0.9,  0.1]])]

Tôi đã thực sự mong đợi một n_samplebởi n_classesma trận. Tôi đang đấu tranh để hiểu làm thế nào điều này liên quan đến xác suất của các lớp hiện tại.

Các tài liệu cho predict_probacác tiểu bang:

mảng hình dạng = [n_samples, n_groupes] hoặc danh sách các nDefputs các mảng như vậy nếu nDefputs> 1.

Các xác suất lớp của các mẫu đầu vào. Thứ tự của các lớp tương ứng với thứ tự trong các lớp thuộc tính_.

Tôi đoán tôi có phần sau trong phần mô tả, nhưng tôi vẫn đang cố gắng để hiểu điều này liên quan đến xác suất của lớp tôi như thế nào.

Hơn nữa, khi tôi cố gắng truy cập classes_thuộc tính cho forestmô hình tôi nhận được AttributeErrorvà thuộc tính này không tồn tại trên MultiOutputClassifier. Làm thế nào tôi có thể liên kết các lớp với đầu ra?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

Câu trả lời:


31

Giả sử mục tiêu của bạn là (0,1), thì bộ phân loại sẽ đưa ra ma trận xác suất có thứ nguyên (N, 2). Chỉ số đầu tiên đề cập đến xác suất dữ liệu thuộc về lớp 0 và chỉ số thứ hai đề cập đến xác suất dữ liệu thuộc về lớp 1.

Hai cái này sẽ tổng hợp thành 1.

Sau đó, bạn có thể xuất kết quả bằng cách:

probability = model.predict_proba(X)[:,1]

Nếu bạn có k lớp, đầu ra sẽ là (N, k), bạn sẽ phải xác định xác suất của lớp nào bạn muốn.


2
Nếu đây là trường hợp, tôi vẫn bối rối tại sao có hai cột cho mỗi lớp. Nếu mỗi lớp có mục nhập riêng thì mỗi mục có phải là ma trận (N, 1) để minh họa xác suất của lớp đó không?
Harpal

2
hai cột cho hai lớp, nhắc lại rằng khi bạn xác định mục tiêu (0,1), có hai lớp. Mỗi hàng / datapoint sẽ yêu cầu dự đoán trên cả 0 và 1. Ví dụ datapoint1 có 80% khả năng thuộc về 0 và 20% thuộc về 1. đầu ra sẽ là (0.8,0.2). bạn cần truy cập dự đoán [:, 1] để lấy cột thứ hai nếu bạn muốn dự đoán cho 1. Trong dự đoán truy cập chung [:, k] nếu bạn muốn khả năng của lớp thứ k
chrisckwong821

1
Điều này dường như bỏ qua rằng câu hỏi là về một mô hình đa đầu ra.
Ben Reiniger

2

Trong MultiOutputClassifier, bạn đang coi hai đầu ra là các nhiệm vụ phân loại riêng biệt; từ các tài liệu bạn liên kết:

Chiến lược này bao gồm lắp một phân loại cho mỗi mục tiêu.

Vì vậy, hai mảng trong danh sách kết quả đại diện cho mỗi trong hai biến phân loại / biến phụ thuộc. Các mảng sau đó là các đầu ra phân loại nhị phân (các cột có xác suất của lớp 0, xác suất của lớp 1) mà @ chrisckwong821 đã đề cập, nhưng mỗi cột cho mỗi vấn đề.

Nói cách khác, giá trị trả về của predict_probasẽ là một danh sách có chiều dài bằng chiều rộng của bạn y, tức là n_outputstrong trường hợp của bạn 2. Trích dẫn của bạn từ predict_probatài liệu tham khảo n_outputs, được giới thiệu trong tài liệu cho fit:

fit(self, X, y[, sample_weight])

y : (thưa thớt) giống như mảng, hình dạng (n_samples, n_outputs)


Tôi đồng ý với nhận xét của bạn, câu trả lời được đánh giá cao nhất không trả lời câu hỏi, không giải thích tại sao có một loạt các hình dạng (N, 2). Câu trả lời của bạn không trả lời câu hỏi:n_outputs
The Red Pea

1
Cảm ơn, tôi rất ngạc nhiên khi thấy câu trả lời khác được đánh giá cao như vậy. Và cảm ơn đã chỉnh sửa!
Ben Reiniger

0

Đối với câu hỏi đầu tiên:

Mảng 5x2 đầu tiên cung cấp cho bạn xác suất của 5 mẫu thử nghiệm được phân loại trong lớp đầu tiên. Ngoài ra, cột đầu tiên của mảng 5x2 này cho bạn biết "xác suất mẫu thử nghiệm không được phân loại là lớp đầu tiên" và cột thứ hai của mảng 5x2 này cho bạn biết "xác suất mẫu thử nghiệm được phân loại là lớp đầu tiên ".

Tương tự, mảng 5x2 thứ hai cung cấp cho bạn xác suất phân loại của các mẫu thử nghiệm trong lớp thứ hai.

Nếu bạn muốn kiểm tra điều này, bạn có thể đối chiếu giá trị trong các mảng đó với kết quả từ đó predict.

Đôi khi, sự trở lại của predict_probacó thể cung cấp cho bạn một danh sách chứa các mảng Nx1 và mảng Nx2. Nếu vậy, không có dữ liệu kiểm tra nào được phân loại vào các mảng Nx1 được đại diện cho các lớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.