在本章中,我们将向您展示如何制作"Decision Tree"。决策树是一个流程图,可以帮助您根据以前的经验做出决策。
在该示例中,一个人将尝试决定他/她是否应该去看喜剧表演。
幸运的是,我们的示例人员每次镇上有喜剧表演时都会进行注册,并注册有关喜剧演员的一些信息,并且还注册了他/她是否参加。
年龄 | 经验 | 秩 | 国籍 | Go |
36 | 10 | 9 | 英国 | 不 |
42 | 12 | 4 | 美国 | 不 |
23 | 4 | 6 | 氮 | 不 |
52 | 4 | 4 | 美国 | 不 |
43 | 21 | 8 | 美国 | 是的 |
44 | 14 | 5 | 英国 | 不 |
66 | 3 | 7 | 氮 | 是的 |
35 | 14 | 9 | 英国 | 是的 |
52 | 13 | 7 | 氮 | 是的 |
35 | 5 | 9 | 氮 | 是的 |
24 | 3 | 5 | 美国 | 不 |
18 | 3 | 7 | 英国 | 是的 |
45 | 9 | 9 | 英国 | 是的 |
现在,基于这个数据集,Python 可以创建一个决策树,用于决定是否有任何新节目值得关注。
首先,用 pandas 读取数据集:
要制作决策树,所有数据都必须是数字的。
我们必须将非数字列“Nationality”和“Go”转换为数值。
Pandas有一个map()
方法,它接受一个字典,其中包含有关如何转换值的信息。
{'UK': 0, 'USA': 1, 'N': 2}
表示将值“UK”转换为 0、“USA”转换为 1、“N”转换为 2。
将字符串值更改为数值:
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
然后我们必须分开特征列从目标柱子。
特征列是我们尝试预测的列从,目标列是包含我们尝试预测的值的列。
X
是特征列,y
是目标列:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
现在我们可以创建实际的决策树,并将其与我们的详细信息相匹配。首先导入我们需要的模块:
创建并显示决策树:
import pandas
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
df = pandas.read_csv("data.csv")
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
tree.plot_tree(dtree, feature_names=features)
决策树使用您之前的决定来计算您是否想去看喜剧演员的可能性。
让我们来看看决策树的不同方面:
Rank <= 6.5
意味着每个排名为 6.5 或更低的喜剧演员都会遵循True
箭头(向左),其余部分将遵循False
箭头(向右)。
gini = 0.497
指的是分割的质量,并且始终是 0.0 到 0.5 之间的数字,其中 0.0 表示所有样本都得到相同的结果,0.5 表示分割恰好在中间完成。
samples = 13
意味着此时决策中还剩下 13 名喜剧演员,因为这是第一步,所以这是全部演员。
value = [6, 7]
意味着这 13 位喜剧演员中,6 位将获得"NO",7 位将获得"GO"。
样本分割的方法有很多种,我们在本教程中使用 GINI 方法。
基尼法使用以下公式:
Gini = 1 - (x/n)2 - (y/n)2
在哪里x
是肯定答案的数量("GO"),n
是样本数,并且y
是否定答案的数量 ("NO"),计算结果如下:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
下一步包含两个框,一个框用于“排名”为 6.5 或更低的喜剧演员,另一个框用于其余的。
gini = 0.0
意味着所有样本都得到相同的结果。
samples = 5
表示该分支中还剩下 5 位喜剧演员(5 位 Rank 为 6.5 或更低的喜剧演员)。
value = [5, 0]
意味着 5 将得到"NO",0 将得到"GO"。
Nationality <= 0.5
表示国籍值小于 0.5 的喜剧演员将沿着向左的箭头移动(这意味着所有人都来自英国, ),其余的将沿着向右的箭头移动。
gini = 0.219
意味着大约 22% 的样本会朝一个方向流动。
samples = 8
表示该分支还剩下 8 位喜剧演员(8 位 Rank 高于 6.5 的喜剧演员)。
value = [1, 7]
意味着这 8 位喜剧演员中,1 位将获得"NO",7 位将获得"GO"。
Age <= 35.5
意思是35.5岁以下的喜剧演员会沿着箭头向左走,其余的则沿着箭头向右走。
gini = 0.375
意味着大约 37.5% 的样本会朝一个方向流动。
samples = 4
意味着这个分支还剩下 4 位喜剧演员(4 位来自英国的喜剧演员)。
value = [1, 3]
意味着这 4 位喜剧演员中,1 位将获得"NO",3 位将获得"GO"。
gini = 0.0
意味着所有样本都得到相同的结果。
samples = 4
意味着该分支中还剩下 4 位喜剧演员(4 位喜剧演员不是来自英国)。
value = [0, 4]
意味着这 4 位喜剧演员中,0 位将获得"NO",4 位将获得"GO"。
gini = 0.0
意味着所有样本都得到相同的结果。
samples = 2
意味着该分支中还剩下 2 名喜剧演员(2 名年龄在 35.5 岁或以下的喜剧演员)。
value = [0, 2]
意味着这 2 位喜剧演员中,0 位将获得"NO",2 位将获得"GO"。
Experience <= 9.5
意味着具有 9.5 年或以下经验的喜剧演员将沿着箭头向左移动,其余的将沿着箭头向右移动。
gini = 0.5
意味着 50% 的样本会朝一个方向流动。
samples = 2
表示该分支中还剩下 2 位喜剧演员(2 位年龄超过 35.5 岁的喜剧演员)。
value = [1, 1]
意味着这 2 位喜剧演员中,1 位将获得"NO",1 位将获得"GO"。
gini = 0.0
意味着所有样本都得到相同的结果。
samples = 1
表示该分支中还剩下 1 名喜剧演员(1 名具有 9.5 年或以下经验的喜剧演员)。
value = [0, 1]
表示 0 将得到 "NO",1 将得到 "GO"。
gini = 0.0
意味着所有样本都得到相同的结果。
samples = 1
表示该分支中还剩下 1 位喜剧演员(1 位喜剧演员拥有超过 9.5 年的经验)。
value = [1, 0]
表示 1 将得到 "NO",0 将得到 "GO"。
我们可以使用决策树来预测新值。
例如:我应该去看一个由 40 岁的美国喜剧演员主演的节目,他有 10 年的经验,喜剧排名为 7 吗?
如果运行足够多次,您将看到决策树会给出不同的结果,即使您向其提供相同的数据也是如此。
这是因为决策树并没有给我们 100% 确定的答案。它基于结果的概率,并且答案会有所不同。
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!