(決定木内) 情報エントロピーとサンプル分類情報エントロピー計算ソースコード

目次

1. 情報エントロピー

① 基本的な考え方

②計算式

2. 決定木における情報エントロピー

3. データセットサンプル分類のシャノンエントロピーを計算するためのソースコード


解説:この部分の知識を忘れてしまったので、復習のために読んでこの記事を書きました。

なお、この記事の角括弧内の内容はあくまで個人的な理解に基づくものであり、読者の皆様にはご容赦いただければ幸いです。


1. 情報エントロピー

① 基本的な考え方

これは、確率変数の期待値を測定するために使用されます[決定は多くのランダム ベクトルによって共同で決定され、これらのランダム ベクトルは人々がすべてを決定する際に考慮する要素です]変数の情報エントロピーが大きいほど、変数に含まれる状況が多くなります[つまり、この要素は他の多くの要素にも関連しており、この要素が早く対処されるほど、より良い決定が行われます。そうでないと、依然として頭の痛い問題が発生します。 「他の要素を決めた後、この要素を考慮すると、他の要素を再検討する必要があるため、決定を誤る可能性が高くなります。」つまり、完全に決定するにはさらに多くの情報が必要ですそれ。

シャノンは、「情報とは不確実性の排除である」と考えていますが、一般に、ある情報の確率が高いということは、その情報がより広く拡散されているか、より多く引用されているかを示しています。

情報エントロピーの概念を最初に提案したのはシャノンなので、情報エントロピーとシャノンのエントロピーの表現は同じです...


②計算式

複数カテゴリの問題の場合は、式を拡張して計算します。次の決定木では、特定の種類の特徴のデータの長さ/全体のデータの長さを使用して発生確率を表すこともできます。つまり、頻度が確率を表します。p の概念は異なります。特定のシナリオでの意味が異なり、柔軟に使用できます。

注:この記事で説明されている機能またはカテゴリは、異なる値 (高値と低値) を持つ可能性がある確率変数 (収入) とも呼ばれます。一般に、確率変数は、次の場合に考慮する必要がある要素です。決断を下す。


2. 決定木における情報エントロピー

デシジョン ツリーでは、情報エントロピーを使用してカテゴリの不確実性を測定できるだけでなく、データ サンプルやさまざまな特徴を含むカテゴリの不確実性を測定することもできます。特徴列ベクトルの情報エントロピーが大きいほど、ベクトルの不確実性が大きくなります[ここで理解するのは簡単ですが、特徴列ベクトルとは人々の意思決定に影響を与えるさまざまな要素を指します]。混乱の度合いが高いほど、固有ベクトルからの分割をより優先する必要があります[私の理解では、決定木を構築するための鍵は分割属性であるため、分割属性は特定のノードにあります(ノードはすべてのデータが配置される場所です)特定の特徴のさまざまな区分応じて分類基準、この基準は特定の特徴です(ここに流れるデータセットは、年齢特性などのノードの特性に従って分割され、その後、さまざまなサブセットに分割されます)若者セット、中年セット、古いセットなど、これらのセットは次の特徴ノードに流れ、このロジックを繰り返してさまざまなブランチを構築します。その目標は、各分裂サブセットをできるだけ純粋にすることです(同じカテゴリに属し、 (今日の昼に魚介類を買おうと決めている人、または魚介類を買わない人)、つまり同じカテゴリーに属するため、最初に情報エントロピーの大きな固有ベクトルを分割して作成する方が効率的です。決定]。

たとえば、顧客が正午に魚介類を購入するかどうかを予測する場合、変数 [年齢] には多くの状況が含まれており (もちろん、実際の数値は情報エントロピーの計算に依存します)、年齢は若年、ある年齢層で食べるか食べないかは所得水準によることもあるし、所得階層ごとに学生かどうか、学生の場合は性別による判断もある。多くの情報。変数[収入]で直接割った方が良いかもしれません。情報エントロピーは、私たちにとって決定木の最初の部分に最も適した特徴を選択することです。


3. データセットサンプル分類のシャノンエントロピーを計算するためのソースコード

例証します:

1.所得などの分類特徴ごとに情報エントロピーを解き、高所得者と低所得者に分けますが、高所得者全員が魚介類を食べるわけではなく、低所得者全員が魚介類を食べるわけではなく、コーディングはより複雑になります。この記事で詳しく説明します。

2. 以下のソースコードおよび注釈はオリジナルですので、不適切な点や疑問がある場合は、コメント欄にメッセージを残してください。


ソースコード:

from numpy import *


# 本文源码只求样本分类的信息熵,仅为了说明信息熵的求解方法
# 对于如何求解各个类别特征的信息熵和如何构造决策树,将在后续文章详述

def calculate_xns(dataset, n):
    """
    计算给定数据集的香农熵(信息熵)
    :param dataset:数据集
    :param n:数据集的第n个特征,默认取-1,即数据集中每个样本的标签
    :return:数据集的香农熵
    """
    xns = 0.0  # 香农熵
    num = len(dataset)  # 样本集的总数,用于计算分类标签出现的概率

    # 1、将数据集样本标签的特征值(分类值)放入列表
    all_labels = [c[n] for c in dataset]  # c[-1]:即取数据集中的每条数据的标签:吃或不吃
    # print(all_labels)  # 得到 [吃,吃,不吃,不吃,不吃,不吃] 的结果
    # 2、按标签的种类进行统计,吃这一类2个;不吃这一类4个
    every_label = {}  # 以词典形式存储每个类别(键)及个数(值), 如{吃:2,不吃:4}
    for item in set(all_labels):  # 对每个类别计数,并放入词典, 其中set(all_labels) = [吃,不吃]
        every_label[item] = all_labels.count(item)
    # 计算样本标签的香农熵,即数据集的香农熵
    for item2 in every_label:
        prob = every_label[item2] / num  # 每个特征值出现的概率
        xns -= prob * log2(prob)  # xns是全局变量,这样就可以计算关于决策的要考虑的某个随机变量(如收入特征)的香农熵
    return xns


# 问题描述:如何求解数据集样本分类的信息熵?

# 如下列是已知的统计数据(如果有大数据更好):
# 第一列特征是学生(Yes:是,No:不是)
# 第二列特征是性别(Yes:男,No:女)
# 第三列特征是收入(Yes:高,No:低)
# 第四列是每个样本最终的分类标签(吃海鲜或不吃海鲜)

data = [['Yes', 'Yes', 'Yes', "吃"],
        ['No', 'No', 'Yes', "吃"],
        ['No', 'Yes', 'No', "不吃"],
        ['No', 'No', 'No', "不吃"],
        ['No', 'Yes', 'No', "不吃"],
        ['No', 'No', 'No', "不吃"]]

# 打印数据集样本分类的信息熵
print("数据集样本分类的信息熵%s" % (calculate_xns(data, -1)))  # 0.9182958340544896

操作結果:

おすすめ

転載: blog.csdn.net/qq_40506723/article/details/127156554