2017-06-15 114 views
-1

这可能是一个非常愚蠢的问题,但为什么以下给出不同的结果?Scikit学习预测单一观察

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

允许它分成简单的步骤来分析:

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要求二维数据的形状为[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) 

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

因此,考虑上面的例子中,输出将是唯一的,

For sample2   [0.8,   0.2], 
+0

感谢。尽管#3给出了与#1不同的答案,我仍然困惑不解。 – ndrue

+0

@ndrue因为它们是两个不同的数量。首先是所有测试数据X中唯一的类别1(在0类,0类,2类......)中的可用性。第三是数据第二行(索引1,只有一行)的所有类的概率。我编辑了包含示例的答案。 –