意思決定ツリーにおけるエントロピーと情報ゲイン

AbsolutVisionによる写真unsplash

決定木アルゴリズムは、変数/列を分割するためにどのような基準を使用する必要がありますか?

意思決定ツリーアルゴリズムを構築する前に、最初のステップは、この質問に答えることです。 この質問に答える方法の1つを見てみましょう。 これを行うには、情報理論からいくつかの重要な概念を使用することを理解する必要があります.

次の手順を実行して、この方法を調べてみましょう。

  1. 決定木が何であるかを非常に簡単に見てみましょう。
  2. エントロピーの式を定義して調べます。
  3. ビットが情報理論に何であるかを議論します。
  4. 情報ゲインを定義し、それを計算するためにエントロピーを使用します。
  5. 上記の概念を使用して、いくつかの基本的なPython関数を記述します。

データサイエンスでは、決定木アルゴリズムは、分類または回帰問題の教師あり学習アルゴリズムです。 私たちの最終目標は、過去のデータを使用して結果を予測することです。 線形回帰とは異なり、デシジョンツリーはデータ内の変数間の非線形相互作用を拾うことができます。

非常に単純な決定木を見てみましょう。 以下は、ピーナッツバタークッキーを食べるかどうかを決定するために使用できるワークフローです。p>

クッキーを食べるかどうかに関する意思決定ツリーの例

この例では、決定木は、特定の基準が満たされている場合にのみクッキーを食べるべきであるという事実を拾うことができます。 これが意思決定ツリーの究極の目標です。 私たちは、特定の基準が満たされるまで、意思決定(分割)を続けたいと考えています。 一度会った我々は、分類または予測を行うためにそれを使用することができます。 この例では、二つの変数(アレルギー、台無しに夕食)のみを使用して非常に基本的です。 しかし、何千もの変数/列を持つデータセットがある場合、どの変数/列を分割するのが最も効率的かをどのように決定しますか? この問題を解決する一般的な方法は、特にID3アルゴリズムを使用する場合、エントロピーと情報ゲインを使用することです。

タスク

いくつかのデータがあり、それを使用してクイズの受け手について何かを予測するオンラインクイズを作成したいとしましょう。 データ内の関係を見た後、決定木アルゴリズムを使用することにしました。 あなたがオンラインクイズに吸い込まれたことがない場合は、ここで何百もの例を見ることができます。 クイズの目標は、クイズの受け手がアメリカの中西部の州のいずれかからのものであるかどうかを推測することになります。 クイズの質問は、特定の種類の食べ物が好きかどうかを中心に展開されます。 以下には、15のエントリを持つ小さな架空のデータセットがあります。 各エントリには、一連の質問に対する回答があります。 ほとんどの質問は、特定の種類の食べ物が好きかどうかについてのもので、参加者は今のところ(1)はいまたは(0)と答えました。 最後のコラム(”中西部?つまり、決定木が構築されると、これが推測しようとしている分類です。

エントロピー

我々はエントロピーと呼ばれる情報理論のメトリックを使用します開始しました。 データサイエンスでは、エントロピーは、列がどのように”混合”されているかを測定する方法として使用されます。 具体的には、エントロピーは、障害を測定するために使用されます。 私たちのターゲット列のエントロピーを見つけることから始めましょう、”中西部?”.div>

私たちのターゲット列、”中西部?”

中西部に住んでいる十人とそうでない五人がいます。 エントロピーは、”混合の種類”という答えを定量化する方法を提供します。 列の(1)sと(0)sが混合されるほど、エントロピーは高くなります。 もし”中西部?”(1)sと(0)sの等しい量を持っていた私たちのエントロピーは1になります。 もし”中西部?”(1)sのエントロピーは0になる。私たちは、エントロピーを計算するために、次の式を使用することができます。

エントロピーの式
エントロピーの式
エントロピーの式
エントロピーの式
figcaption>

のは、式の各ステップを通過し、”中西部のエントロピーを計算してみましょう?”コラム。私たちは、単一の列内の各一意の値を反復処理し、それをiに割り当てる必要があります。 この例では、「中西部」に2つのケース(c)がありますか?”列、(0)または(1)のいずれか。次に、データ内でその値が発生する確率を計算します。 (1)の場合、確率は10/15です。 (0)の場合、確率は5/15です。

  • それぞれのケースの確率を取り、それを確率の底2の対数で乗算します。 エントロピーはビット単位で測定されるため、2が最も一般的なベースです(詳細は後述)。 2が使用されている理由の完全な説明は、この投稿の範囲外ですが、stack exchangeのユーザーは良い説明を提供します。 (1)の場合、10/15*log2(10/15)が得られます。 (0)の場合、5/15*log2(5/15)が得られます。
  • 次に、上記の各ケースから製品を取り出して合計します。 この例では、10/15*log2(10/15)+5/15*log2(5/15)です。 最後に、上から合計を否定します-(10/15*log2(10/15)+5/15*log2(5/15))。 私たちはすべて一緒にステップを入れたら、我々は以下を取得します:

    私たちの最終的なエントロピーはあります。918278. だから、それは本当にどういう意味ですか?

    情報理論と情報のビット

    前方に移動すると、ビットの概念を理解することが重要になります。 情報理論では、ビットは情報がない場合は0を表し、情報の完全なビットについては1を表す2進数と考えられています。 値が(1)または(0)のいずれかであるため、ビットの情報を2進数として表すことができます。 明日雨が降っている(1)か、雨が降っていない(0)の確率が等しいとします。 明日雨が降ると言ったら、少し情報を与えました。

    エントロピーを情報と考えることもできます。 我々は常に(3)に着陸ロード六面ダイを持っていると仮定します。 ダイスを転がすたびに、結果が(3)になることが事前にわかります。 ダイを転がしても新しい情報は得られないので、エントロピーは0です。 一方、ダイが遠くにあり、我々は(3)を転がす場合は、(3)を転がすことに1/6のチャンスがありました。 今、私たちは情報を得ました。 したがって、ダイを転がすことは、私たちに情報の一つのビットを与えます—番号が上陸した側。

    情報のビットの概念に深いダイビングのために、あなたはより多くを読むことができますここに。

    私たちは、情報のみの一つ未満の”ビット”を取得します。918278—”中西部にはより多くの(1)sがあるからですか? これは、新しい値を予測していた場合、答えが(1)であり、間違っているよりも頻繁に正しいと推測できることを意味します(答えが1である確率が2/3 この事前の知識のために、私たちは新しい価値を観察するときに完全な”ビット”の情報よりも得られません。

    意思決定を行うためにエントロピーを使用して

    私たちの目標は、意思決定ツリーを構築するときに分割するのに最適な変数/列を見つけるこ 最終的には、混合されたターゲット列が混合されなくなるまで、変数/列を分割し続けたいと考えています。

    例えば、「中西部」のエントロピーを見てみましょうか?”私たちは上の私たちのデータセットを分割した後の列”potato_salad?”コラム。div>

    “potato_salad?”列

    上記のように、私たちのデータセットは二つのセクションに分割されています。 左側には、ポテトサラダが好きな人。 私たちは今、中西部から七人とされていない二人を持っている左側に焦点を埋めます.左の分割中西部の列にエントロピーの式を使用することにより、新しいエントロピーがあります.764204. これは素晴らしいです! 私たちの目標は、エントロピーを下げることであり、我々はから行きました。918278764204. しかし、右の列を見ると、(1)sと(0)sの等しい量があるので、エントロピーが上昇しました。 情報利得のための式はそれを行います。 データを分割するたびに得られた情報のビット数を定量化するための数値を提供します。

    情報ゲイン

    先ほど、ターゲット列のエントロピーを下げる分割が必要であることを確立しました。 私たちは”potato_saladに分割するとき?”我々は、中西部でそのエントロピーを見た”?”左側にダウンしました。 ここで、分割の両側を見ると、総エントロピーが低下していることを理解する必要があります。 情報利得を見てみましょう。

    情報ゲインは、次の式を使用します:

    ここで何が起こっているの

    私たちは私たちの”potato_salad?”例。 上記の式の変数は、次のことを表します。

    • T=Target、私たちの”中西部?”列
    • A=私たちがテストしている変数(列)、”potato_salad?”
    • v=Aの各値、”potato_saladの各値?”column
    1. まず、分割前の(T)の元のエントロピーを計算します。918278
    2. 次に、変数(A)の一意の値(v)ごとに、(A)が値(v)をとる行数を計算し、それを行の総数で除算します。 “ポテトサラダ?”のために、”ポテトサラダ?”のために、””列は、(1)の一意の値の場合は9/15、(0)の一意の値の場合は6/15を取得します。
    3. 次に、(A)が(v)である行のエントロピーで結果を乗算します。 左の分割の場合(”potato_salad”の場合は1に分割されますか?”)は、9月15日に公開された日本の映画。764204. 分割の右側の場合(”potato_salad”の0で分割されますか?”)は、6月15日に発売された1枚目のシングル。
    4. これらのサブセット製品をすべて一緒に追加します,9/14*.764204 + 6/15 = .8585224.

    5. 次に、全体のエントロピーから減算して、情報ゲインを取得します。918278 -.8585224 = .059754059754. それは私たちに何を教えてくれますか?ここでは別の説明があります。

    分割後の各セットのエントロピーを見つけ、それを各分割の項目数で重み付けし、現在のエントロピーから減算します。 結果が肯定的であれば、分割でエントロピーを下げました。 結果が高ければ高いほど、エントロピーはより低くなります。

    私たちは終わります。059754059754″potato_salad”のデータセットを分割することによって、情報のビット?”変数/列。 我々の情報利得は低いが、我々は分割の左側にエントロピーを低下させたためである、それはまだ正です。ここで、使用しているすべての列に対してこのプロセスを繰り返す必要があります。

    これを手作業で行う代わりに、いくつかのPythonコードを書いてみましょう。

    それをすべてPythonでラップ

    情報利得を理解したので、このプロセスを繰り返して、情報利得が最大の変数/列を見つける方法が必要です。 これを行うために、Pythonでいくつかの簡単な関数を作成できます。

    データのインポート

    上記の表をPython pandasライブラリを使用してデータフレームに変換しましょう。 Pandasをインポートし、read_csv()関数を使用して”midwest”という名前のデータフレームを作成します。

    import pandas as pd
    midwest = pd.read_csv('midwes.csv')

    エントロピーのためのPython関数

    この関数には、bincount()関数を使用するためのNumPyライブラリと、log()関数を使用するためのmathモジュー

    import numpy
    import math

    次に、一つのパラメータで関数を定義します。 与えられた引数は、エントロピーを計算しようとしているシリーズ、リスト、またはNumPy配列になります。p>

    def calc_entropy(column):

    列内の各ケースの割合を見つける必要があります。 私たちはnumpyを使うことができます。このためのbincount()関数。 戻り値は、引数として渡された列からの各一意の値のカウントを格納するNumPy配列です。

    counts = numpy.bincount(column)

    “counts”配列を列の長さで割ることによって、各一意の値の確率を保存します。次に、”entropy”という名前の変数を初期化し、それを0に設定できます。次に、「forループ」を使用して、確率配列内の各確率をループし、それに数学を使用して確率の対数底2を乗算します。ログ()関数。 次に、格納されたエントロピー変数にそれぞれのケースを追加します。 *あなたの確率が0よりも大きいことを確認してください。log(0)はundefinedを返します

    for prob in probabilities:
    if prob > 0:
    endtropy += prob * math.log(prob,2)

    最後に、否定されたエントロピー変数を返します。/p>

    return -entropy

    すべて一緒に今:

    素晴らしい! これで、情報利得を計算する関数を構築できます。

    情報利得のためのPython関数

    データセット全体、分割したい列の名前、ターゲット列の名前の三つのパラメータを持つ関数を定義する必要があります。

    def calc_information_gain(data, split_name, target_name):

    次に、以前のentropy関数を使用して、ターゲット列の元のエントロピーを計算できます。p>

    orginal_entropy = calc_entropy(data)

    今、私たちは私たちの列を分割する必要があります。

    *この例では、2つの一意の変数/列のみを使用します。 “Age”などの変数/列を分割する場合は、これを行う方法がいくつかあります。 一つの方法は、すべての一意の値に分割することです。 別の方法は、情報利得の計算を単純化し、一意の値ごとに分割しないことによって分割を簡単にすることです。 代わりに、分割されている変数/coumnの中央値が見つかります。 変数の値が中央値を下回っている行は左の分岐に移動し、残りの行は右の分岐に移動します。 情報利得を計算するには、2つのサブセットのエントロピーのみを計算する必要があります。 私たちはこの方法を歩くことはありませんが、中央値の分割が実行されると、残りのステップは以下で概説したものと同じになります。

    私たちが作業している列は二つの一意の値しか持っていないので、左分割と右分割を行います。

    まずパンダを使います。シリーズ。unique()列の一意の値の配列を与えるために

    values = data.unique()

    次に、”values”を使用して左右の分割を作成します。p>

    left_split = data == values]
    right_split = data == values]

    今、私たちは私たちの元のエントロピーから減算する変数を開始することができます。

    to_subtract = 0

    次に、分割によって作成された各サブセットを反復処理し、サブセットの確率を計算し、確率とサブセットのターゲット列のエントロピーの積を追加します。最後に、元のエントロピーから減算されたto_subractの差を返すことができます。p>

    return original_entropy - to_subtract

    関数全体は以下の通りです。

    最高の情報ゲインのためのPython関数

    最後の関数は、最高の情報ゲインを持つ変数/列名を返す関数になります。

    前述したように、この例では2つの一意の値を持つ列のみを使用しています。 これらの列名を関数で使用するリストに格納します。 この例ではこれをハードコードしますが、大規模なデータセットでは、列を選択するために使用する基準に基づいてこのリストを動的に構築するコードを最後のステップを関数でラップして、必要に応じて再利用できるようにしましょう。 それは一つのパラメータ、我々はのための最高の情報ゲインを検索したい列のリストを持つことになります。

    def highest_info_gain(columns):

    私たちは、私たちの情報の利益を格納するために空の辞書を初期化します。そして、列のリストを反復処理し、結果をinformation_gains辞書に格納することができます。p>

    for col in columns:
    information_gain = calc_information_gain(midwest, col, 'midwest?)
    information_gains = information_gain

    最後に、辞書の最高値のキーを返すことができます。

    return max(information_gains, key=information_gains.get)

    すべて一緒になりました:

    最終関数を実行すると

    print(highest_info_gain(midwest, columns, 'midwest?'))
    //sushi

    情報ゲインが最も高い変数/列が”sushi”であることがわかります?’.div>

    sushi列でデータセットを分割する
    sushi列でデータセットを分割する

    sushi列でデータセットを分割する
    figcaption>

    私たちの左の分割は、中西部から六人のうち二人を持っています。 右の分割は、中西部から九人のうち八人を持っています。 これは効率的な分割であり、両側のエントロピーを低下させました。 続行する場合は、再帰を使用して各分割を分割し続け、各分岐をエントロピーゼロで終了させることを目標にします。

    結論

    決定木は、データ内の変数間の非線形相互作用をピックアップするための有用な機械学習アルゴリズムになります。 この例では、決定木分類アルゴリズムの最初の段階を見ました。 次に、エントロピー、ビット、および情報ゲインの三つの情報理論の概念を見ました。 これらの概念を使用することで、Pythonでいくつかの関数を構築して、どの変数/列を分割するのが最も効率的かを決定することができました。 これらの概念をしっかりと把握して、意思決定ツリーを構築するために前進することができます。

  • コメントを残す

    メールアドレスが公開されることはありません。