Scikit学习预测单一观察

时间:2017-06-15 04:13:41

标签: python scikit-learn lightgbm

这可能是一个非常愚蠢的问题,但为什么以下会给出不同的结果呢?

X == array([  7.84682988e-01,   3.80109225e-17,   8.06386582e-01,
             1.00000000e+00,   5.71428571e-01,   4.44189342e+00])

model.predict_proba(X)[1] # gives array([ 0.35483244,  0.64516756])
model.predict_proba(X[1]) # gives an error
model.predict_proba(list(X[1])) # gives array([[ 0.65059327,  0.34940673]])

Model是来自lightgbm库的LGBMClassifier

1 个答案:

答案 0 :(得分:2)

让我们把它分解成简单的分析步骤:

1)model.predict_proba(X)[1]

这相当于

probas = model.predict_proba(X)
probas[1]

因此,这首先输出所有样本的所有类的概率。所以假设你的X包含5行和4个特征,有两个不同的类。

因此,probas将是这样的:

            Prob of class 0,   prob of class 1  
For sample1         [[0.1,            0.9],
For sample2          [0.8,            0.2],
For sample3          [0.85,           0.15],
For sample4          [0.4,            0.6],
For sample5          [0.01,           0.99]]

probas[1]将只输出probas输出的第二列的概率,即。第1类概率。

Output [0.9,     0.2,   0.15,       0.6,       0.99]

其他两行代码取决于如何处理单维数组的实现和版本。例如。 scikit v18仅显示警告并将其视为单行。但是v19(主分支)会抛出错误。

编辑:针对LGBMClassifier

进行了更新

2)model.predict_proba(X[1])

这相当于:

X_new = X[1]
model.predict_proba(X_new)

在这里,您只选择导致形状[n_features, ]的第二行。但是LGBMClassifier要求2-d数据具有[n_samples, n_features]的形状。如上所述,这可能是错误的可能来源。您可以重新赋予给定数组以使1代替n_samples:

model.predict_proba(X[1].reshape(1, -1))#将正常运作

3)model.predict_proba(list(X[1]))

这可以分解为:

X_new = list(X[1])
model.predict_proba(X_new)

这也与第2次大致相同,只是X_new现在是一个列表而不是numpy数组,并自动处理为单行(与第二种情况中的X[1].reshape(1, -1)相同),而不是抛出错误。

所以考虑上面的例子,输出只是,

For sample2          [0.8,            0.2],