2017-08-01 1 views
0

sklearn.naive_bayes.GaussianNBモデルをpartial_fitで実行しようとしています。scikit-learnでpartial_fitを返します。ValueError:priorsの合計が1である必要があります。

unique_lbls, counts = np.unique(labels, return_counts=True) 
counts = counts.astype(float) 
priors = counts/counts.sum() 
model = GaussianNB(priors=priors) 
model.partial_fit(X, y, classes=unique_lbls) 

私は `とValueErrorが得る:このために私はこのようなpriorsを計算する事前確率の合計は1でなければなりませんが、私がチェックしていると事前確率は1.0にまとめるん:

print priors.sum() 
> 1.0 

私は、以下のバージョンを使用しています:

Python 2.7.12 
scikit-learn 0.18.2 
numpy 1.13.1 

私はそれが加算された値の感度にまで来ていることを想像することができますが、私はで再び事前分布を正規化しようとしていますと同じエラーを返します。

プリオーサーの公差が1.0になっているかどうかを確認する別の方法がありますか、それともうまくいかない理由がありますか?

編集:labelsは、データセットのラベル全体を整数で表したnumpy配列です.XとYは完全なデータセットのバッチです。 yおよびlabelsには、両方とも各クラスの100以上の例があります。

+0

Python 2.7.10、sklearn 0.18.2、およびnumpy 1.13.1ではうまくいきません。 Pythonのことは起こりそうにありませんが、可能性があります。データを投稿して、自分のデータで再作成できるかどうか確認できますか? – ncfirth

+0

'y'に' unique_lbls'にない値がありますか? ([partial_fit'](http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB.partial_fit)のドキュメントに従って) – kazemakase

+0

私は代わりに 'X = numpy.random.rand(10000,100)'と 'y = numpy.random.int(10000)'として作成された一連の乱数を使ってエラーを再現しようとしました。私は上記と同じ手順を実行し、これは問題なく動作します。私のデータには何かがあるはずです。問題は残っていますが、 'priors.sum()'は '1.0'を返すことができますが、partial_fitはまだそうではないと不満を持ちます。 @kazemakase 'y 'のすべてのクラスは' unique_lbls'にあります – Tobias

答えて

1

私の最初の直感は、何かデータに間違いがあったということでした。しかし、partial_fit関数は、そのエラーを発生させる前にデータを見ていないようです。特に、the implementationは次のようになります。彼らは、数値的に非常に堅牢されていない、正確に1.0に事前確率の合計を比較する

# Check that the sum is 1 
if priors.sum() != 1.0: 
    raise ValueError('The sum of the priors should be 1.') 

。不合理な値の組み合わせがある場合、正規化されたプリオリは正確には1.0に集計されないことがあります。これを考慮してください:

priors = np.array([1, 2, 3, 4, 5, 6], dtype=float) 
priors /= priors.sum() 
print(priors.sum() == 1.0) # False 

このような状況では、チェックが失敗します。

priors[0] = 1.0 - priors[1:].sum() 
print(priors.sum() == 1.0) # True 
+0

非常に不思議な問題です。あなたのソリューションを実装しようとしましたが、失敗しました。実際にあなたの正確な例を試してみましたが、最後にも失敗します。 scikit-learnまたはnumpyの特定のバージョンでのみ発生するものでしょうか? – Tobias

+0

...私はかなり多くのアイデアです、ごめんなさい。 – kazemakase

+0

テスト用に、どのバージョンのpython、scikit-learn、およびpythonを使用しているかを尋ねることができますか?多分私はそれを理解することができます。 – Tobias

関連する問題