2017-06-15 53 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,只有一行)的所有類的概率。我編輯了包含示例的答案。 –