Розуміння передбачуваної програми від 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держав:

масив 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) матрицею, яка ілюструє ймовірність цього класу?
Гарпал

2
два стовпці для двох класів, нагадайте, що коли ви визначаєте ціль (0,1), є два класи. Кожен рядок / точка даних потребує прогнозування як на 0, так і на 1. Наприклад, у даних point1 є 80% ймовірності належати до 0, а 20%, що належать до 1., вихід буде (0.8,0.2). вам потрібно отримати доступ до Prediton [:, 1], щоб отримати другий стовпець, якщо ви хочете прогнозувати для 1. Загалом прогнозування доступу [:, k], якщо ви хочете ймовірності k-го класу
chrisckwong821

1
Це, здається, ігнорує, що питання стосується моделі з кількома виходами.
Бен Райнігер

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)


Я погоджуюся з вашим коментарем, відповідь, що найбільше відповідає, не відповідає на питання, не пояснює, чому існує масив (N, 2) фігур. Ваш відповідь робить відповідь на питання:n_outputs
Червоний Горох

1
Дякую, я здивувався, коли знайшов іншу відповідь так високо проголосованою. І дякую за редагування!
Бен Райнігер

0

Перше питання:

Перший масив 5х2 дає вам ймовірність 5 зразків тестування, віднесених до першого класу. Крім того, перший стовпець цього масиву 5x2 повідомляє вам "ймовірність того, що тестовий зразок не класифікується як перший клас", а другий стовпчик цього масиву 5x2 повідомляє вам "ймовірність того, що тестовий зразок класифікується як перший клас ".

Аналогічно, другий масив 5х2 дає класифікаційну ймовірність тестування зразків другого класу.

Якщо ви хочете перевірити це, ви можете порівняти значення в цих масивах з результатами predict.

Іноді повернення predict_probaможе дати вам список, який містить Nx1 масиви та Nx2 масиви. Якщо так, жодні дані тестування не класифікуються в ті масиви Nx1, які представлені класами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.