5

私は読ん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 フォルダーの下にあります

4

1 に答える 1

8

ここでの潜在的なあいまいさは、見ているデータセットに特徴と結果変数の両方が含まれており、結果変数が最後の列にあることです。あなたが解決しようとしている問題は、「特徴 1 と特徴 2 は結果を予測するのに役立ちますか」ということですか?

別の言い方をすれば、特徴 1 に従ってデータを分割すると、結果に関するより良い情報が得られるでしょうか?

この場合、分割しないと、結果変数は [はい、はい、いいえ、いいえ、いいえ] になります。機能 1 で分割すると、次の 2 つのグループが得られます: 機能 1 = 0 -> 結果は [いいえ、いいえ] 機能 1 = 1 -> 結果は [はい、はい、いいえ]

ここでの考え方は、その分割がより良いかどうかを確認することです. 最初は、[はい、はい、いいえ、いいえ、いいえ] のシャノン エントロピーによって記述された特定の情報がありました。分割後、特徴 1 = 0 のグループの「より良い情報」を持つ 2 つのグループができます。この場合、結果がノーであり、[ノー、ノー] のエントロピーによって測定されることがわかります。

言い換えれば、アプローチは、利用可能な機能のうち、使用すると、関心のあるものに関する情報、つまり結果変数を増加させる機能があるかどうかを把握することです。ツリー構築は、各ステップで最も高い情報ゲインを持つ機能を貪欲に選択し、結果のグループをさらに分割する価値があるかどうかを確認します。

于 2013-05-19T20:07:51.793 に答える