У меня интересная проблема.Я работаю с проблемой 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?