ทำความเข้าใจกับ predict_proba จาก MultiOutputClassifier


28

ฉันกำลังติดตามตัวอย่างนี้ในเว็บไซต์ scikit-Learn เพื่อทำการจัดประเภทมัลติเอาท์พุทด้วยโมเดล Random Forest

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

จากนี้predict_probaฉันได้รับ 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]])]

ฉันถูกจริงๆคาดหวังว่าn_sampleจากn_classesเมทริกซ์ ฉันพยายามที่จะเข้าใจว่าสิ่งนี้เกี่ยวข้องกับความน่าจะเป็นของชั้นเรียนที่มีอยู่

เอกสารสำหรับpredict_probaรัฐ:

array of shape = [n_samples, n_classes] หรือรายการ n_outputs อาร์เรย์ดังกล่าวหาก n_outputs> 1

ความน่าจะเป็นของคลาสของตัวอย่างอินพุต ลำดับของคลาสสอดคล้องกับที่อยู่ในแอ็ตทริบิวต์ Class_

ฉันเดาว่าฉันมีคำอธิบายหลัง แต่ฉันยังคงดิ้นรนที่จะเข้าใจว่าสิ่งนี้เกี่ยวข้องกับความน่าจะเป็นในชั้นเรียนของฉันอย่างไร

นอกจากนี้เมื่อฉันพยายามที่จะเข้าถึงclasses_แอตทริบิวต์สำหรับforestรุ่นที่ผมได้รับและแอตทริบิวต์นี้ไม่ได้อยู่ในAttributeError MultiOutputClassifierฉันจะเชื่อมโยงคลาสกับเอาต์พุตได้อย่างไร?

print(forest.classes_)

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

คำตอบ:


31

สมมติว่าเป้าหมายของคุณคือ (0,1) จากนั้นตัวแยกประเภทจะแสดงเมทริกซ์ความน่าจะเป็นของมิติ (N, 2) ดัชนีแรกอ้างถึงความน่าจะเป็นที่ข้อมูลเป็นของคลาส 0 และที่สองหมายถึงความน่าจะเป็นที่ข้อมูลนั้นเป็นของคลาส 1

ทั้งสองนี้จะรวมเป็น 1

จากนั้นคุณสามารถส่งออกผลลัพธ์โดย:

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

หากคุณมีคลาส k เอาต์พุตจะเป็น (N, k) คุณจะต้องระบุความน่าจะเป็นของคลาสที่คุณต้องการ


2
หากเป็นกรณีนี้ฉันยังคงสับสนว่าทำไมแต่ละคอลัมน์มีสองคอลัมน์ หากแต่ละคลาสมีรายการของตนเองไม่ควรแต่ละเมทริกซ์เป็น (N, 1) เมทริกซ์เพื่อแสดงความน่าจะเป็นของคลาสนั้น
Harpal

2
สองคอลัมน์สำหรับสองคลาสโปรดจำไว้ว่าเมื่อคุณกำหนดเป้าหมาย (0,1) จะมีสองคลาส แต่ละแถว / datapoint จะต้องมีการทำนายทั้ง 0 และ 1 ตัวอย่างเช่น datapoint1 มีความเป็นไปได้ 80% ที่จะเป็น 0 และ 20% ที่เป็นของ 1 ผลผลิตจะเป็น (0.8,0.2) คุณจำเป็นต้องเข้าถึง prediciton [:, 1] เพื่อรับคอลัมน์ที่สองหากคุณต้องการคำทำนายสำหรับ 1 ในการทำนายการเข้าถึงทั่วไป [:, k] ถ้าคุณต้องการความเป็นไปได้ของคลาส k th
chrisckwong821

1
ดูเหมือนว่าจะไม่สนใจคำถามนี้เกี่ยวกับรูปแบบการแสดงผลหลาย
Ben Reiniger

2

ในMultiOutputClassifier, คุณกำลังปฏิบัติต่อทั้งสองเอาต์พุตเป็นภารกิจการแยกประเภท จากเอกสารที่คุณเชื่อมโยง:

กลยุทธ์นี้ประกอบด้วยตัวแยกประเภทหนึ่งต่อเป้าหมายที่เหมาะสม

ดังนั้นสองอาร์เรย์ในรายการผลลัพธ์จึงแสดงถึงตัวแยกประเภท / ตัวแปรตามแต่ละตัว จากนั้นอาร์เรย์คือเอาต์พุตการจำแนกประเภทไบนารี (คอลัมน์ที่น่าจะเป็นของคลาส 0, ความน่าจะเป็นของคลาส 1) ที่ @ chrisckwong821 พูดถึง แต่หนึ่งรายการสำหรับแต่ละปัญหา

กล่าวอีกนัยหนึ่งค่าส่งคืนของpredict_probaจะเป็นรายการที่มีความยาวเท่ากับความกว้างของคุณyเช่นn_outputsในกรณีของคุณ 2 การอ้างอิงของคุณจากการpredict_probaอ้างอิงเอกสารn_outputsซึ่งนำมาใช้ในเอกสารประกอบสำหรับfit:

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

y : (กระจัดกระจาย) รูปร่างเหมือนอาร์เรย์ (n_samples, n_outputs)


ผมเห็นด้วยกับความคิดเห็นของคุณคำตอบมากที่สุด upvoted ไม่ตอบคำถามที่ไม่ได้อธิบายว่าทำไมมีอาร์เรย์ของ (N, 2) รูปทรง คำตอบของคุณไม่ตอบคำถาม:n_outputs
สีแดงถั่ว

1
ขอขอบคุณฉันรู้สึกประหลาดใจที่พบคำตอบอื่น ๆ และขอขอบคุณสำหรับการแก้ไข!
Ben Reiniger

0

สำหรับคำถามแรก:

อาร์เรย์ 5x2 ชุดแรกให้ความน่าจะเป็นของตัวอย่างทดสอบ 5 รายการที่จัดอยู่ในชั้นหนึ่ง นอกจากนี้คอลัมน์แรกของอาร์เรย์ 5x2 นี้จะบอกคุณว่า "ความน่าจะเป็นที่ตัวอย่างการทดสอบไม่ได้ถูกจัดประเภทเป็นชั้นหนึ่ง" และคอลัมน์ที่สองของอาร์เรย์ 5x2 นี้จะบอกคุณ "ความน่าจะเป็นที่กลุ่มตัวอย่างทดสอบจัดเป็นชั้นหนึ่ง "

ในทำนองเดียวกันอาร์เรย์ 5x2 อันที่สองให้ความน่าจะเป็นในการจำแนกประเภทของตัวอย่างทดสอบในชั้นสอง

หากคุณต้องการตรวจสอบสิ่งนี้คุณสามารถเปรียบเทียบค่าในอาร์เรย์เหล่านั้นกับผลลัพธ์predictได้

บางครั้งการส่งคืนpredict_probaอาจให้รายการที่มีอาร์เรย์ Nx1 และอาร์เรย์ Nx2 หากเป็นเช่นนั้นจะไม่มีการทดสอบข้อมูลใด ๆ ที่จัดอยู่ในอาร์เรย์ Nx1 ที่เป็นตัวแทนของคลาส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.