2017-06-15 8 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)model.predict_proba(X)[1]

これはので、この最初の出力すべてのサンプルについて、すべてのクラスの確率

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

と同等です:

答えて

1

は分析するために、簡単なステップにそれを破ることができます。つまり、Xには5つの行と4つの機能があり、2つの異なるクラスがあります。

のでprobasは、このようなものになります。あなたのprobas出力の2列目、すなわちのための

  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]がしますちょうど出力確率を。コードのクラスの確率は1

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

他の2行は1次元配列を処理する方法の実装およびバージョンによって異なります。たとえば。 scikit v18は警告だけを表示し、それを単一の行とみなします。しかしv19(マスターブランチ)はエラーを投げます。

EDIT: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]であることを要求します。これは、前述のエラーの原因となる可能性があります。これもある

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

:これはに分けることができmodel.predict_proba(list(X[1]))

model.predict_proba(X[1].reshape(1, -1))#正しく

3に動作します:あなたはn_samplesの代わりに1を持つように指定された配列を再構築することができますほとんどの場合2ndと同じです。ちょうどX_newがnumpy配列ではなくリストになり、エラーをスローするのではなく、自動的に1行として扱われます(2番目のケースではX[1].reshape(1, -1)と同じです)。

は、したがって、上記の例を考えると、出力は

For sample2   [0.8,   0.2], 
+0

おかげで、唯一となります。私は#3がなぜ#1に対して別の答えを与えるのかについてまだ困惑している。 – ndrue

+0

@ndrue彼らは2つの異なる量です。まず、すべてのテストデータXのクラス1(クラス0、クラス0、クラス2 ...)の唯一の可能性です。3番目は、データの2番目の行(インデックス1、1行のみ)のすべてのクラスの確率です。私は例を含める答えを編集しました。 –

関連する問題