_contents()
代わりに、このメソッドの定義を使用してみてください。
def _contents(items, laplace=False):
# count occurrences of values
counts = {}
for item in items:
counts[item] = counts.get(item,0) + 1.0
# normalize
for k in counts:
if laplace:
counts[k] += 1.0
counts[k] /= (len(items)+len(counts))
else:
counts[k] /= len(items)
return counts
次に、呼び出しを次のように変更しますLine 194
。
# Estimate P(value|class,dim)
nb.p_conditional[i][j] = _contents(values, True)
True
スムージングを有効またはFalse
無効にするために使用します。
スムージングあり/なしの出力の比較は次のとおりです。
# without
>>> carmodel.p_conditional
[[{'Red': 0.40000000000000002, 'Yellow': 0.59999999999999998},
{'SUV': 0.59999999999999998, 'Sports': 0.40000000000000002},
{'Domestic': 0.59999999999999998, 'Imported': 0.40000000000000002}],
[{'Red': 0.59999999999999998, 'Yellow': 0.40000000000000002},
{'SUV': 0.20000000000000001, 'Sports': 0.80000000000000004},
{'Domestic': 0.40000000000000002, 'Imported': 0.59999999999999998}]]
# with
>>> carmodel.p_conditional
[[{'Red': 0.42857142857142855, 'Yellow': 0.5714285714285714},
{'SUV': 0.5714285714285714, 'Sports': 0.42857142857142855},
{'Domestic': 0.5714285714285714, 'Imported': 0.42857142857142855}],
[{'Red': 0.5714285714285714, 'Yellow': 0.42857142857142855},
{'SUV': 0.2857142857142857, 'Sports': 0.7142857142857143},
{'Domestic': 0.42857142857142855, 'Imported': 0.5714285714285714}]]
上記以外に、コードにバグがある可能性があると思います。
このコードは、クラスに従ってインスタンスを分割し、次に各クラスについて、各ディメンションを指定して、この各ディメンション値が出現する回数をカウントします。
問題は、1 つのクラスに属するインスタンスのサブセットについて、ディメンションのすべての値がそのサブセットに表示されるとは限らず、_contents()
関数が呼び出されたときにすべての可能な値が表示されないため、間違った値が返されることです。確率...
(データセット全体から) 各ディメンションのすべての一意の値を追跡し、カウント プロセス中にそれを考慮する必要があると思います。