2016-02-23 2 views
0

По какой-то причине, когда я бегу ensemble.RandomForestClassifier() и использовать метод .predict_proba(), он возвращает 2d-массив в форме [n_classes, n_samples] вместо [n_samples, n_classes] формы, что, как предполагается, per the docs.RandomForestClassifier дают транспонированной выход для мульти-меток классов

Вот мой пример кода:

# generate some sample data 

X = np.array([[4, 5, 6, 7, 8], 
       [0, 5, 6, 2, 3], 
       [1, 2, 6, 5, 8], 
       [6, 1, 1, 1, 3], 
       [2, 5, 3, 2, 0]]) 
»» X.shape 
    (5, 5) 

y = [['blue', 'red'], 
    ['red'], 
    ['red', 'green'], 
    ['blue', 'green'], 
    ['orange']] 

X_test = np.array([[4, 6, 1, 2, 8], 
        [0, 0, 1, 5, 1]]) 
»» X_test.shape 
    (2, 5) 

# binarize text labels 

mlb = preprocessing.MultiLabelBinarizer() 
lb_y = mlb.fit_transform(y) 

»» lb_y 
    [[1 0 0 1] 
    [0 0 0 1] 
    [0 1 0 1] 
    [1 1 0 0] 
    [0 0 1 0]] 

»» lb_y.shape 
    (5, 4) 

Все отлично до работы до этого момента. Но когда я делаю это:

rfc = ensemble.RandomForestClassifier(random_state=42) 
rfc.fit(X, lb_y) 
yhat_p = rfc.predict_proba(X_test) 

»» yhat_p 
[array([[ 0.5, 0.5], 
     [ 0.7, 0.3]]), 
array([[ 0.4, 0.6], 
     [ 0.5, 0.5]]), 
array([[ 0.7, 0.3], 
     [ 0.7, 0.3]]), 
array([[ 0.7, 0.3], 
     [ 0.6, 0.4]])] 

Мой yhat_p размер [n_classes, n_samples] вместо [n_samples, n_classes]. Может кто-нибудь сказать мне, почему мой выход транспонирован? Примечание. Метод .predict() работает отлично.

ответ

2

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

Форматирование в документации является немного странным, но он говорит:

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

Поскольку у вас есть четыре выхода, вы получаете список из четырех массивов. Каждый из этих массивов имеет форму (2, 2), потому что у вас есть два образца (т. Е. Две строки в X_test) и два класса (0 и 1) для каждого вывода. n_classes, о котором идет речь в документах, - это количество классов для одного вывода, а не общее количество классов во всех выпускаемых классификациях. (Причина, по которой он возвращает список вместо одного массива, заключается в том, что не требуется, чтобы отдельные классификации имели одинаковое количество классов. Вы могли бы выполнить классификационную задачу с несколькими выходами, где один вывод имеет два класса, а другой - 100 классов.)

например, первый элемент в списке является

array([[ 0.5, 0.5], 
     [ 0.7, 0.3]]), 

Каждая строка дает вам вероятность того, что соответствующая строка X_test принадлежит каждому из классов в первой задаче classiciation, которая является по существу " Этот элемент синий или нет? Таким образом, первая строка говорит вам, что существует 50% вероятность того, что первая строка X_test не синяя и 50% -ная вероятность, что она синяя; вторая строка говорит вам, что есть вероятность 70%, что вторая строка X_test не является синей, а вероятность 30% - синей.

+0

«В классах n_classes указано количество классов для одного вывода, а не общее количество классов во всех выводимых классификациях, которые вы делаете», - это будет сделано. благодаря – ralston