python实现决策树ID3算法实例

python实现ID3算法实现全过程

原理:基于信息熵来选择最佳的测试属性。注意理解熵的概念,还有信息增益的概念。这样更能理解决策树的生成。
信息熵的概念及其公式实现:
总信息熵
I(s1,s2,s3…sn) = -∑P(xi)log(2,P(xi)) (i=1,2,…n) ------------------------------式1

设A属性有不同的的k个值{a1,a2,a3,a4…}A属性样本的信息熵值:
E(A)=∑s1,s2,s3,s4,…/s* I(s1,s2,s3…sn) ---------------------------------------式2

信息增益:
Gain(A) = I -E(A) ----------------------------------------------------------------------式3

单看公式相信大家难以理解。
我们用实例来解释可能比较容易接受。
大家应该都有接触过王者荣耀,那么对你来说什么情况很容易导致你输呢?
图片来自王者荣耀官网
是因为存在鲁班吗,还是瑶,亦或者是韩信,还是打野从来拿不到buff,队友经常吵架,还是有其它奇奇怪怪的原因呢,我们来用决策树来随便玩玩,查看以下哪些年我们被坑输的结果,预测我们今后比赛的结果。

首先根据我们的情况啦,选择几个属性玩玩。(当然你也可以把很多属性加进去,这里我们做个示例就不搞那么多了。)我这里选的是,以下5个属性:

1.是否有鲁班
2.是否有瑶
3.是否有韩信
4.打野是否经常拿不到buff
5.队友是否吵架

结果:

输or赢
把我的对局情况做出了以下表格:(共36场对局)
在这里插入图片描述
具体情况如上所示哈。num代表序列号。

先把数据量化,"有"和"赢"当成1
"否"和"输"当成-1
便于我们计算信息熵。
emm,先展示以下我们的原理计算环节:
步骤一、求总信息熵
根据式1,计算总的信息熵。可以看到总记录为36条,而结果为"赢"得部分有15条,而结果为"输"的有21条
所以得到公式:I(总信息熵)=
在这里插入图片描述

步骤二、求各个属性的信息熵
计算每个测试属性的信息熵,例如:"是否存在鲁班"这一属性:
我们看到,"存在鲁班"的情况有15条,"不存在鲁班"的情况有21条
1)
那么"存在鲁班"时"赢"的占5条,"输"的占10条
I(有鲁班)=I(5,10)=
在这里插入图片描述
同理可得:
2)
I(无鲁班)=I(10,11)
公式类似上面
所以测试属性的信息熵为:
3)
E(是否存在鲁班) = P(存在鲁班) * I(有鲁班)+P(不存在鲁班) * I(无鲁班)
4)
同理,我们可以计算出其他测试属性的信息熵:
E(是否存在瑶) =
E(是否存在韩信) =
E(打野是否经常拿不到buff) =
E(队友是否吵架) =

步骤三、求每个属性的信息增益
根据式3
Gain(测试属性)=I(总信息熵) — E(测试属性信息熵)
即拿鲁班来举例:
Gain(是否存在鲁班) = I(总信息熵) — E(是否存在鲁班)
其他的同理
步骤四、找出节点和分支重复前面步骤
根据步骤3中我们得到了每个测试属性的信息增益,我们把最大的拿出来作为第一个节点,然后以这个节点属性的属性值"是""否"作为两个分支。
然后重复上面的3个步骤继续对该根节点的其他分支进行划分,针对每个分支节点继续进行信息增益的计算,反复循环,知道没有新的节点分支,最后就可以构成一棵决策树了。

在代码中,我们可以省略很多计算的过程,但是这个原理我们最好还是要掌握一下。
代码的实现:

import pandas as pd

"""王者荣耀情况影响战局的最佳属性"""
"""实现ID3算法"""
file_excel = ("./ID3.xlsx")  #pandas导入数据啦
data = pd.read_excel(file_excel, index_col='num')

#是,赢转换为数据(量化)
#用1表示是和赢,-1表示否和输
data[data == '有'] = 1
data[data == '赢'] = 1
data[data != 1] = -1
x = data.iloc[:,: 5].values.astype(int)                 #前面的数据那几列(属性列)
y = data.iloc[:, 5].values.astype(int)                  #输赢那一列

from sklearn.tree import DecisionTreeClassifier as DTC  #导入库
dtc = DTC(criterion='entropy')            #建立决策树模型,基于信息熵
dtc.fit(x, y)                             #训练


from sklearn.tree import export_graphviz #导入可视化决策树的库
#x = pd.DataFrame(x)       
with open("./output/tree.dot", 'w', encoding='utf-8') as f:
    f = export_graphviz(dtc, feature_names=['if exist luban', 'if exist yao', 'if exist hanxin', 'if no buff for daye',
                                            'if exist quarrel'], out_file=f)  #保存决策树呀,./output/tree.dot。这是我保存的路径,可以自己修改哦

代码的实现并不难,基本都是用库方法,我们只需要导入数据,然后做基本的数据变换就好了。
从代码中可以看到我们已经生成了一个tree.dot文件。如果你打开这个dot文件,你会发现你看到的是一行一行的数据,难以观看,所以我们要想办法把它变成一颗树。
接下来就是关键啦,我们要怎么看到好看的决策树呢?

二、决策树可视化

我们的文件夹里生成了tree.dot文件我们要把它变成图片或者pdf还有变成树状。请执行以下步骤:

2.1下载安装graphviz可视化工具

官网下载超级慢,请在csdn直接搜索这个工具,然后下载,安装。没有技术含量,不作演示。要记住自己的安装路径

2.2graphviz添加环境变量

把安装路径的graphivz\bin添加到环境变量就可以了,不会添加环境变量的可以参照我的文章里面python安装那一篇去添加环境变量。

2.3验证安装完成

打开win+r输入cmd打开命令行工具,查看版本,输入:

dot -V

如果输出了版本号,即安装完成。
没有的应该是环境变量出了问题。

2.4把dot文件转成png或pdf

打开命令行工具然后跳转到tree.dot文件所在位置输入以下命令;

dot -Tpdf tree.dot -o tree.pdf

完成
结果展示:
在这里插入图片描述
这告诉我们打王者不要吵架不然输的可能性很大,看你队伍满足以上多少条,可以预测你这局的输赢哦。分支箭头往左为True,往右为False。
最下面一排的中entropy代表信息熵,value代表取值。如value=[1,0],代表赢1局,输0局的意思。
samples代表实例。这个决策树主要用作分类,或者预测,规则提取等。

我们可以根据决策的分类很容易看到,"队友是否吵架"这个是最佳属性。

喜欢的朋友留下你的赞哦!!

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题是关于如何使用Python实现决策树算法来创建一个实例的。首先需要了解决策树是一种用于分类和预测的监督学习算法。可以使用Python中的Scikit-learn库来实现决策树算法。可以先导入所需的库,读取数据集,对数据进行预处理,然后使用Scikit-learn中的DecisionTreeClassifier来创建决策树分类器实例。最后,可以输入新数据进行预测。 ### 回答2: 决策树是一种贯穿于数据挖掘、机器学习等领域的经典算法。在决策树中,根据给定的数据集将特征进行分类,构建出一颗树形结构,通过树形结构对新的数据进行分类或者回归。ID3算法是早期应用广泛的决策树算法之一,该算法通过计算信息增益来选择最佳特征进行分类。这里为大家提供一个基于PythonID3算法实现实例。 首先导入需要的库: ``` python import numpy as np import pandas as pd import math ``` 定义ID3算法函数: ``` python def ID3(data, target_attribute): feature_names = data.columns.tolist() feature_names.remove(target_attribute) if len(data[target_attribute].unique()) == 1: # 如果只有一个类别,返回该类别 return data[target_attribute].unique().tolist()[0] if len(feature_names) == 0: # 如果特征全部用完,返回类别中最多的 return data[target_attribute].value_counts().idxmax() best_feature = choose_best_feature(data, feature_names, target_attribute) # 选取最佳分类特征 tree = {best_feature:{}} for value in data[best_feature].unique().tolist(): sub_data = data[data[best_feature] == value].reset_index(drop=True) subtree = ID3(sub_data, target_attribute) tree[best_feature][value] = subtree return tree ``` 定义计算信息熵函数: ``` python def entropy(data, target_attribute): entropy = 0.0 count = len(data[target_attribute]) for value in data[target_attribute].unique().tolist(): p = len(data[data[target_attribute] == value]) / count entropy += -p * math.log2(p) return entropy ``` 定义计算信息增益函数: ``` python def information_gain(data, feature_name, target_attribute): entropy_origin = entropy(data, target_attribute) entropy_new = 0.0 count = len(data) for value in data[feature_name].unique().tolist(): sub_data = data[data[feature_name] == value].reset_index(drop=True) p = len(sub_data) / count entropy_new += p * entropy(sub_data, target_attribute) return entropy_origin - entropy_new ``` 定义选择最佳分类特征函数: ``` python def choose_best_feature(data, feature_names, target_attribute): max_gain = -1 best_feature = None for feature_name in feature_names: gain = information_gain(data, feature_name, target_attribute) if gain > max_gain: max_gain = gain best_feature = feature_name return best_feature ``` 使用实例数据构建决策树: ``` python data = pd.read_csv('data.csv') tree = ID3(data, 'Play') ``` 其中,data.csv文件内容如下: | Outlook | Temp. | Humidity | Wind | Play | |---------|---------|---------|--------|-------| | Sunny | Hot | High | Weak | No | | Sunny | Hot | High | Strong| No | | Overcast| Hot | High | Weak | Yes | | Rainy | Mild | High | Weak | Yes | | Rainy | Cool | Normal | Weak | Yes | | Rainy | Cool | Normal | Strong| No | | Overcast| Cool | Normal | Strong| Yes | | Sunny | Mild | High | Weak | No | | Sunny | Cool | Normal | Weak | Yes | | Rainy | Mild | Normal | Weak | Yes | | Sunny | Mild | Normal | Strong| Yes | | Overcast| Mild | High | Strong| Yes | | Overcast| Hot | Normal | Weak | Yes | | Rainy | Mild | High | Strong| No | 输出的决策树如下: {'Outlook': {'Sunny': {'Humidity': {'High': 'No', 'Normal': 'Yes'}}, 'Overcast': 'Yes', 'Rainy': {'Wind': {'Weak': 'Yes', 'Strong': 'No'}}}} 该决策树可以解释为:如果Outlook为Sunny,则判断Humidity,如果Humidity为High,则不宜Play,如果Humidity为Normal,则可以Play;如果Outlook为Overcast,则宜Play;如果Outlook为Rainy,则判断Wind,如果Wind为Weak则可以Play,如果Wind为Strong,则不宜Play。 ### 回答3: ID3算法是一种经典的决策树算法,经常被用于分类问题。在Python中,可以使用scikit-learn库来实现决策树ID3算法。以下是一个示例代码,展示了如何使用scikit-learn来实现决策树ID3算法。 1. 准备数据集 首先,需要准备一个数据集作为决策树ID3算法的输入。这里使用鸢尾花数据集作为示例。该数据集包含150个样本,每个样本有4个特征,分别为花萼长度、花萼宽度、花瓣长度和花瓣宽度。同,每个样本还有一个标签,表示该样本所属的鸢尾花品种(Setosa、Versicolour或Virginica)。 从scikit-learn库中导入数据集,并将数据集分为训练集和测试集。 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) ``` 2. 训练决策树模型 接下来,使用scikit-learn中的DecisionTreeClassifier类来训练决策树模型。该类的主要参数包括criterion(选择划分标准,通常选择“entropy”或“gini”)、max_depth(树的最大深度)和min_samples_split(划分节点的最小样本数)。 ```python from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=2) clf.fit(X_train, y_train) ``` 3. 测试决策树模型 训练好决策树模型后,可以使用测试集来测试模型的性能。可以使用accuracy_score函数来计算分类准确度。 ```python from sklearn.metrics import accuracy_score y_pred = clf.predict(X_test) print("Accuracy:", accuracy_score(y_test, y_pred)) ``` 4. 可视化决策树模型 为了更好地理解决策树模型,可以使用Graphviz软件将决策树可视化。需要先安装Graphviz软件和Python的graphviz包。 ```python from sklearn.tree import export_graphviz from IPython.display import Image import graphviz dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True) graph = graphviz.Source(dot_data) Image(graph.pipe(format='png')) ``` 以上就是如何使用scikit-learn来实现决策树ID3算法的示例代码。对于更复杂的数据集或更高维的数据,可以灵活地调整决策树参数或选择其他类型的算法实现分类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值