机器学习 - 决策树
决策树
在本章中,我们将向您展示如何构建一个“决策树”。决策树是一个流程图,可以帮助您根据以往的经验做出决策。
例如,一个人将尝试决定是否去观看喜剧表演。
幸运的是,我们示例中的人每次在城里举行喜剧表演时都会记录信息,包括喜剧演员的一些信息,以及他们是否去了。
年龄 | 经验 | 排名 | 国籍 | 去 |
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 读取数据集
要构建决策树,所有数据都必须是数值型。
我们需要将非数值型列“国籍”和“去”转换为数值型。
Pandas 具有一个 map()
方法,该方法接收一个字典,其中包含有关如何转换值的信息。
{'英国': 0, '美国': 1, '不': 2}
表示将值“英国”转换为 0,“美国”转换为 1,“不”转换为 2。
示例
将字符串值转换为数值型
d = {'英国': 0, '美国': 1, '不': 2}
df['国籍'] = df['国籍'].map(d)
d = {'是': 1, '不': 0}
df['去'] = df['去'].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 = {'英国': 0, '美国': 1, '不': 2}
df['国籍'] = df['国籍'].map(d)
d = {'是': 1, '不': 0}
df['去'] = df['去'].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 = 1 - (x/n)2 - (y/n)2
其中 x
是正面答案(“GO”)的数量,n
是样本的数量,而 y
是负面答案(“NO”)的数量,这将得出以下计算结果
1 - (7 / 13)2 - (6 / 13)2 = 0.497
下一步包含两个框,一个框用于排名在 6.5 或以下的喜剧演员,另一个框用于其余的喜剧演员。
True - 5 个喜剧演员在此结束
gini = 0.0
表示所有样本都得到相同的结果。
samples = 5
表示这个分支中有 5 个喜剧演员(5 个排名在 6.5 或以下的喜剧演员)。
value = [5, 0]
表示这 5 个喜剧演员中有 5 个将获得“NO”,而 0 个将获得“GO”。
False - 8 个喜剧演员继续
国籍
Nationality <= 0.5
表示国籍值小于 0.5 的喜剧演员将遵循指向左侧的箭头(表示来自英国的所有人),而其余的将遵循指向右侧的箭头。
gini = 0.219
表示大约 22% 的样本将走向一个方向。
samples = 8
表示这个分支中有 8 个喜剧演员(8 个排名高于 6.5 的喜剧演员)。
value = [1, 7]
表示这 8 个喜剧演员中有 1 个将获得“NO”,而 7 个将获得“GO”。
True - 4 个喜剧演员继续
年龄
Age <= 35.5
表示年龄在 35.5 岁或以下的喜剧演员将遵循指向左侧的箭头,而其余的将遵循指向右侧的箭头。
gini = 0.375
表示大约 37.5% 的样本将走向一个方向。
samples = 4
表示这个分支中有 4 个喜剧演员(4 个来自英国的喜剧演员)。
value = [1, 3]
表示这 4 个喜剧演员中有 1 个将获得“NO”,而 3 个将获得“GO”。
False - 4 个喜剧演员在此结束
gini = 0.0
表示所有样本都得到相同的结果。
samples = 4
表示这个分支中有 4 个喜剧演员(4 个不是来自英国的喜剧演员)。
value = [0, 4]
表示这 4 个喜剧演员中有 0 个将获得“NO”,而 4 个将获得“GO”。
True - 2 个喜剧演员在此结束
gini = 0.0
表示所有样本都得到相同的结果。
samples = 2
表示这个分支中有 2 个喜剧演员(2 个年龄在 35.5 岁或以下的喜剧演员)。
value = [0, 2]
表示这 2 个喜剧演员中有 0 个将获得“NO”,而 2 个将获得“GO”。
False - 2 个喜剧演员继续
经验
Experience <= 9.5
表示有 9.5 年或更少经验的喜剧演员将遵循指向左侧的箭头,而其余的将遵循指向右侧的箭头。
gini = 0.5
表示 50% 的样本将走向一个方向。
samples = 2
表示这个分支中有 2 个喜剧演员(2 个年龄超过 35.5 岁的喜剧演员)。
value = [1, 1]
表示这 2 个喜剧演员中有 1 个将获得“NO”,而 1 个将获得“GO”。
True - 1 个喜剧演员在此结束
gini = 0.0
表示所有样本都得到相同的结果。
samples = 1
表示这个分支中有 1 个喜剧演员(1 个有 9.5 年或更少经验的喜剧演员)。
value = [0, 1]
表示 0 个将获得“NO”,而 1 个将获得“GO”。
False - 1 个喜剧演员在此结束
gini = 0.0
表示所有样本都得到相同的结果。
samples = 1
表示这个分支中有 1 个喜剧演员(1 个有超过 9.5 年经验的喜剧演员)。
value = [1, 0]
表示 1 个将获得“NO”,而 0 个将获得“GO”。
预测值
我们可以使用决策树来预测新值。
示例:我应该去看一位 40 岁的美国喜剧演员的表演吗?他拥有 10 年的经验,喜剧排名为 7?
不同的结果
您会发现,即使您用相同的数据多次运行决策树,它也会给出不同的结果。
这是因为决策树不会给我们 100% 确定的答案。它是基于结果的可能性,答案会有所不同。