Sklearn RandomForest:predict_proba:错误的形状以及如何摆脱恭维概率

时间:2017-08-16 13:42:23

标签: python scikit-learn random-forest

在标记为9个类的6000个分量矢量上训练RForest之后,我尝试获得以前看不见的矢量形状的类概率:

clf = RandomForestClassifier( n_estimators = 100 )    
probs = clf.predict_proba(X)

使用:

[array([[ 0.61,  0.39],
        [ 0.62,  0.38],
        [ 0.24,  0.76],
        ..., 
        [ 0.96,  0.04],
        [ 0.49,  0.51],
        [ 0.91,  0.09]]), array([[ 0.91,  0.09],
        [ 0.94,  0.06],
        [ 0.93,  0.07],
        ..., 
        [ 1.  ,  0.  ],
        [ 0.96,  0.04],
        [ 0.99,  0.01]]), array([[ 0.95,  0.05],
        [ 0.9 ,  0.1 ],
        [ 0.95,  0.05],
        ..., 

结果我得到一个清单:

predict_proba

有恭维概率。有没有办法摆脱[ 0.96, 0.04]中的赞美概率,所以这个方法的输出而不是0.96只包含predictions = np.array(probs) 而没有自己编码?

*重大更新*

将RForest返回的概率列表转换为numpy数组后:

predictions.shape
(9, 15091, 2)

看看它的形状:

predict_proba

显示主要问题:我有9个类和15091个样本,因此WebRequest()应该返回15091个列表,其中每个列表依次包含9个两个概率元素的列表(赞美)。相反,我得到9个列表,每个15091个元素长,其中每个元素是一个赞美概率列表。

简而言之,为什么不是:

(15091,9,2)

我明白了:

(9,15091,2)

出了什么问题?

2 个答案:

答案 0 :(得分:1)

只需一个简单的切片即可

probs = clf.predict_proba(X)[:, 0] #0 in your case since you need the first one

答案 1 :(得分:0)

据我所知,你不能开箱即用,但为什么不扩展课程呢?

from sklearn.ensemble import RandomForestClassifier
import numpy as np

class RandomForestClassifier2(RandomForestClassifier):
    def predict_proba(self,X,drop_compliment=False):
        result = super().predict_proba(X)
        if drop_compliment:
            result = np.array([p for p,_ in result])
        return result

使用示例:

# Generate some dummy data
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)
clf = RandomForestClassifier2(max_depth=2, random_state=0)
clf.fit(X, y)

您可以通过以下方式获得“默认”RandomForestClassifier结果:

clf.predict_proba(X,drop_compliment=False)

Out[13]:
array([[ 0.88724838,  0.11275162],
       [ 0.73563529,  0.26436471],
       [ 0.88724838,  0.11275162],
       ..., 
       [ 0.16937022,  0.83062978],
       [ 0.14297294,  0.85702706],
       [ 0.14297294,  0.85702706]])

或您想要的输出:

clf.predict_proba(X,drop_compliment=True)

Out[14]:
array([ 0.88724838,  0.73563529,  0.88724838, ...
        0.16937022,  0.14297294,  0.14297294])