OneVsRestClassifier和predict_proba

时间:2019-06-21 06:32:01

标签: python scikit-learn random-forest

我有一个有趣的问题。我正在处理MULTICLASS问题(约90个类),并且决定在RandomForestClassifier周围使用OneVsRestClassifier包装器。

当我在合适的OVR(RF)对象上调用.predict_proba()方法时,输出如下所示:

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)。正确的和所有其他错误的类之间的概率差异似乎很小。

但是,当我从RandomForestClassifier中删除OVR包装器时,我的输出如下所示:

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案例均获得该RF中所有DecisionTrees的投票平均值。那么predict_proba()应该产生这些Y / N票中较高的一个?

0 个答案:

没有答案