Понимание Forex_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государств:

массив формы = [n_samples, n_classes] или список из n_outputs таких массивов, если n_outputs> 1.

Класс вероятностей входных выборок. Порядок классов соответствует таковому в атрибуте classes_.

Я предполагаю, что у меня есть последнее в описании, но я все еще пытаюсь понять, как это связано с вероятностями моего класса.

Кроме того, когда я пытаюсь получить доступ к classes_атрибуту для forestмодели, я получаю, AttributeErrorи этот атрибут не существует в MultiOutputClassifier. Как я могу связать классы с выходом?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'
Harpal
источник

Ответы:

31

Предполагая, что ваша цель (0,1), тогда классификатор выведет матрицу вероятности измерения (N, 2). Первый индекс относится к вероятности того, что данные принадлежат классу 0, а второй относится к вероятности того, что данные принадлежат классу 1.

Эти два будут в сумме 1.

Затем вы можете вывести результат:

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

Если у вас есть k классов, результат будет (N, k), вам нужно будет указать вероятность того, какой класс вы хотите.

chrisckwong821
источник
2
Если это так, я все еще не понимаю, почему для каждого класса есть два столбца. Если у каждого класса есть собственная запись, не должна ли каждая запись быть (N, 1) матрицей, чтобы проиллюстрировать вероятность этого класса?
Harpal
2
два столбца для двух классов, напомним, что когда вы определяете цель (0,1), есть два класса. Каждая строка / точка данных потребует прогнозирования как 0, так и 1. Например, datapoint1 имеет 80% вероятности принадлежать 0, а 20% - 1. Выход будет (0.8,0.2). вам нужно получить доступ к Foregniton [:, 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

По первому вопросу:

Первый массив 5x2 дает вам вероятности 5 тестовых образцов, классифицированных в первом классе. Кроме того, в первом столбце этого массива 5x2 указывается «вероятность того, что тестовый образец не классифицируется как первый класс», а во втором столбце этого массива 5x2 указывается «вероятность того, что тестовый образец классифицируется как первый класс». ».

Аналогично, второй массив 5x2 дает вам классификационную вероятность тестирования образцов во втором классе.

Если вы хотите проверить это, вы можете сравнить значение в этих массивах с результатами из predict.

Иногда возвращение predict_probaможет дать вам список, содержащий массивы Nx1 и Nx2. Если это так, никакие данные тестирования не классифицируются в эти представленные классы Nx1.

johnhery
источник