私は読んMachine Learning In Action
でいて、決定木の章を読んでいます。デシジョン ツリーは、データ セットを分割することでブランチとリーフを構造化できるように構築されていることを理解しています。これにより、より可能性の高い情報がツリーの最上部に表示され、実行する必要のある決定の数が制限されます。
この本には、データセットのシャノン エントロピーを決定する関数が示されています。
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet: #the the number of unique elements and their occurance
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt
ここで、入力データ セットは配列の配列であり、各配列は潜在的な分類可能な特徴を表します。
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
私が得られないのは、なぜこの本のシャノン エントロピー関数が特徴配列の最後の要素だけを見ているのかということです。「はい」または「いいえ」のアイテムのエントロピーのみを計算しているように見えますが、他の機能のエントロピーは計算していませんか?
このデータセットのエントロピーは
dataSet = [[1, 1, 'yes'],
[1, 'asdfasdf', 'yes'],
[1900, 0, 'no'],
[0, 1, 'no'],
['ddd', 1, 'no']]
より多様なデータが含まれていますが、上記のエントロピーと同じです。
データセットの総エントロピーを得るために、他の特徴要素も数えるべきではありませんか、それともエントロピー計算が何をすべきかを誤解していますか?
興味のある方は、この本の完全なソース (このコードのソース) がChapter03 フォルダーの下にあります。