Я следую этому примеру на веб-сайте 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_'
В результате
MultiOutputClassifier
вы рассматриваете два выхода как отдельные задачи классификации; из документов, которые вы связали:Таким образом, два массива в результирующем списке представляют каждый из двух классификаторов / зависимых переменных. Массивы - это двоичные выходные данные классификации (столбцы, которые являются вероятностью класса 0, вероятностью класса 1), о которых упоминал @ chrisckwong821, но по одному для каждой проблемы.
Другими словами, возвращаемое значение
predict_proba
будет списком, длина которого равна ширине вашегоy
, т. Е.n_outputs
В вашем случае 2. Ваша цитата изpredict_proba
ссылок на документациюn_outputs
, которая представлена в документации дляfit
:источник
n_outputs
По первому вопросу:
Первый массив 5x2 дает вам вероятности 5 тестовых образцов, классифицированных в первом классе. Кроме того, в первом столбце этого массива 5x2 указывается «вероятность того, что тестовый образец не классифицируется как первый класс», а во втором столбце этого массива 5x2 указывается «вероятность того, что тестовый образец классифицируется как первый класс». ».
Аналогично, второй массив 5x2 дает вам классификационную вероятность тестирования образцов во втором классе.
Если вы хотите проверить это, вы можете сравнить значение в этих массивах с результатами из
predict
.Иногда возвращение
predict_proba
может дать вам список, содержащий массивы Nx1 и Nx2. Если это так, никакие данные тестирования не классифицируются в эти представленные классы Nx1.источник