OneVsRestClassifier и Forex_Proba - PullRequest
       13

OneVsRestClassifier и Forex_Proba

2 голосов
/ 21 июня 2019

У меня интересная проблема.Я работаю с проблемой MULTICLASS (~ 90 классов) и остановился на использовании оболочки OneVsRestClassifier вокруг RandomForestClassifier.

Когда я вызываю метод .predict_proba () для подогнанного объекта OVR (RF), выводвыглядит примерно так:

clf = OneVsRestClassifier(BalancedRandomForestClassifier(random_state = random_state, n_jobs = n_jobs))

pipeline = Pipeline([('nt', nt), ('ros', ros), ('rf', clf)])

pipeline.fit(X_train, y_train)

...

pipeline.predict_proba(X_test.loc[1453].to_frame().T)

OUTPUT:
array([[0.01197937, 0.01422733, 0.00283992, 0.01277443, 0.00551339,
    0.00156039, 0.00921673, 0.00887344, 0.01907149, 0.00405703,
    0.00644963, 0.01254557, 0.02502873, 0.00187247, 0.01256638,
    0.01255597, 0.00767093, 0.02044117, 0.01055867, 0.00691775,
    0.01103719, 0.01184859, 0.00530534, 0.02320306, 0.00715701,
    0.0043691 , 0.01152891, 0.00846774, 0.00894626, 0.01759085,
    0.00957042, 0.01096484, 0.00995532, 0.01261618, 0.01168562,
    0.020138  , 0.01998791, 0.01165094, 0.01651937, 0.0167304 ,
    0.00729028, 0.00530534, 0.00702177, 0.005555  , 0.00421306,
    0.01811098, 0.01156772, 0.00308958, 0.0063456 , 0.00644369,
    0.01966097, 0.00312079, 0.00837412, 0.01342459, 0.01638414,
    0.0090535 , 0.01673783, 0.01432442, 0.00865845, 0.01594723,
    0.015812  , 0.00931035, 0.01319846, 0.02122136, 0.01262805,
    0.01320614, 0.02954347, 0.02619382, 0.01372107, 0.00182446,
    0.02115181, 0.00540937, 0.0320505 , 0.02377001, 0.00942478,
    0.00674462, 0.00864172, 0.01466298, 0.00863938, 0.02129418,
    0.01645349, 0.01493818, 0.00353689]])

Что меня выделяет в этом выводе, так это то, что все эти вероятности чрезвычайно малы (и, как и ожидалось, в сумме составляют 1,0).Кажется, что между правильным и всеми другими неправильными классами существует действительно небольшая разница в вероятности.

Однако, когда я удаляю оболочку OVR из RandomForestClassifier, мой вывод выглядит так:

array([[0.00333333, 0.005     , 0.        , 0.00166667, 0.005     ,
    0.        , 0.        , 0.        , 0.268375  , 0.        ,
    0.        , 0.01766667, 0.0185    , 0.        , 0.01666667,
    0.        , 0.        , 0.02366667, 0.        , 0.        ,
    0.01166667, 0.000625  , 0.005     , 0.0725    , 0.        ,
    0.009     , 0.01      , 0.        , 0.00333333, 0.015     ,
    0.02933333, 0.01      , 0.        , 0.        , 0.008     ,
    0.04033333, 0.06833333, 0.        , 0.04666667, 0.        ,
    0.        , 0.0075    , 0.01      , 0.        , 0.        ,
    0.01      , 0.        , 0.        , 0.02      , 0.        ,
    0.01      , 0.        , 0.        , 0.01      , 0.        ,
    0.        , 0.0225    , 0.        , 0.02      , 0.01      ,
    0.0125    , 0.        , 0.        , 0.        , 0.01      ,
    0.0025    , 0.015     , 0.02      , 0.012     , 0.        ,
    0.        , 0.        , 0.03333333, 0.008     , 0.01      ,
    0.        , 0.02666667, 0.        , 0.        , 0.02783333,
    0.0025    , 0.01      , 0.        ]])

Существует явный класс с гораздо большей вероятностью, чем у остальных.

Мой вопрос: я что-то упускаю с подходом OVR?Это дает мне лучшие результаты, чем подход без OVR, но я также ожидал бы, что он произведет исключительную вероятность, как и не OVR.

То, как я это понимаю, что происходит сОболочка OVR каждого класса (из ~ 90) получает 2 классификатора (Да / Нет), и оба варианта Y / N получают среднее значение голосов от всех DecisionTrees в этом RF.Тогда функцияgnast_proba () должна выдавать более высокие голоса Y / N?

...