目录

机器学习 - 决策树



决策树

在本章中,我们将向您展示如何制作"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 读取数据集:

示例

读取并打印数据集:

import pandas

df = pandas.read_csv("data.csv")

print(df)

运行示例 »

要制作决策树,所有数据都必须是数字的。

我们必须将非数字列“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 或更低的喜剧演员,另一个框用于其余的。

真实 - 5 位喜剧演员到此结束:

gini = 0.0意味着所有样本都得到相同的结果。

samples = 5表示该分支中还剩下 5 位喜剧演员(5 位 Rank 为 6.5 或更低的喜剧演员)。

value = [5, 0]意味着 5 将得到"NO",0 将得到"GO"。

错误 - 8 位喜剧演员继续:

国籍

Nationality <= 0.5表示国籍值小于 0.5 的喜剧演员将沿着向左的箭头移动(这意味着所有人都来自英国, ),其余的将沿着向右的箭头移动。

gini = 0.219意味着大约 22% 的样本会朝一个方向流动。

samples = 8表示该分支还剩下 8 位喜剧演员(8 位 Rank 高于 6.5 的喜剧演员)。

value = [1, 7]意味着这 8 位喜剧演员中,1 位将获得"NO",7 位将获得"GO"。




真实 - 4 位喜剧演员继续:

年龄

Age <= 35.5意思是35.5岁以下的喜剧演员会沿着箭头向左走,其余的则沿着箭头向右走。

gini = 0.375意味着大约 37.5% 的样本会朝一个方向流动。

samples = 4意味着这个分支还剩下 4 位喜剧演员(4 位来自英国的喜剧演员)。

value = [1, 3]意味着这 4 位喜剧演员中,1 位将获得"NO",3 位将获得"GO"。

错误 - 4 个喜剧演员到此结束:

gini = 0.0意味着所有样本都得到相同的结果。

samples = 4意味着该分支中还剩下 4 位喜剧演员(4 位喜剧演员不是来自英国)。

value = [0, 4]意味着这 4 位喜剧演员中,0 位将获得"NO",4 位将获得"GO"。




真实 - 2 个喜剧演员到此结束:

gini = 0.0意味着所有样本都得到相同的结果。

samples = 2意味着该分支中还剩下 2 名喜剧演员(2 名年龄在 35.5 岁或以下的喜剧演员)。

value = [0, 2]意味着这 2 位喜剧演员中,0 位将获得"NO",2 位将获得"GO"。

错误 - 2 位喜剧演员继续:

经验

Experience <= 9.5意味着具有 9.5 年或以下经验的喜剧演员将沿着箭头向左移动,其余的将沿着箭头向右移动。

gini = 0.5意味着 50% 的样本会朝一个方向流动。

samples = 2表示该分支中还剩下 2 位喜剧演员(2 位年龄超过 35.5 岁的喜剧演员)。

value = [1, 1]意味着这 2 位喜剧演员中,1 位将获得"NO",1 位将获得"GO"。




真实 - 1 个喜剧演员到此结束:

gini = 0.0意味着所有样本都得到相同的结果。

samples = 1表示该分支中还剩下 1 名喜剧演员(1 名具有 9.5 年或以下经验的喜剧演员)。

value = [0, 1]表示 0 将得到 "NO",1 将得到 "GO"。

错误 - 1 个喜剧演员到此结束:

gini = 0.0意味着所有样本都得到相同的结果。

samples = 1表示该分支中还剩下 1 位喜剧演员(1 位喜剧演员拥有超过 9.5 年的经验)。

value = [1, 0]表示 1 将得到 "NO",0 将得到 "GO"。


预测值

我们可以使用决策树来预测新值。

例如:我应该去看一个由 40 岁的美国喜剧演员主演的节目,他有 10 年的经验,喜剧排名为 7 吗?

示例

使用predict()方法来预测新值:

print(dtree.predict([[40, 10, 7, 1]]))

运行示例 »

示例

如果喜剧排名是 6,答案会是什么?

print(dtree.predict([[40, 10, 6, 1]]))

运行示例 »


不同的结果

如果运行足够多次,您将看到决策树会给出不同的结果,即使您向其提供相同的数据也是如此。

这是因为决策树并没有给我们 100% 确定的答案。它基于结果的概率,并且答案会有所不同。