机器学习 - 决策树
决策树
在本章中,我们将向您展示如何制作一个“决策树”。决策树是一个流程图,可以帮助您根据过去的经验做出决策。
在示例中,一个人将尝试决定他/她是否应该去看喜剧表演。
幸运的是,我们示例中的这个人记录了每次有喜剧表演时的情况,并记录了一些关于喜剧演员的信息,还记录了他们是否去看了。
Age | 经验 | 排名 | 国籍 | Go |
36 | 10 | 9 | UK | 不推荐 |
42 | 12 | 4 | USA | 不推荐 |
23 | 4 | 6 | N | 不推荐 |
52 | 4 | 4 | USA | 不推荐 |
43 | 21 | 8 | USA | 推荐 |
44 | 14 | 5 | UK | 不推荐 |
66 | 3 | 7 | N | 推荐 |
35 | 14 | 9 | UK | 推荐 |
52 | 13 | 7 | N | 推荐 |
35 | 5 | 9 | N | 推荐 |
24 | 3 | 5 | USA | 不推荐 |
18 | 3 | 7 | UK | 推荐 |
45 | 9 | 9 | UK | 推荐 |
现在,基于这个数据集,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
来自 sklearn.tree 导入 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 位会得到“否”,7 位会得到“是”。
基尼指数
划分样本有很多方法,在本教程中我们使用基尼指数法。
基尼指数法使用此公式
Gini = 1 - (x/n)2 - (y/n)2
其中 x
是正面答案(“是”)的数量,n
是样本总数,y
是负面答案(“否”)的数量,这使我们得到以下计算
1 - (7 / 13)2 - (6 / 13)2 = 0.497
下一步包含两个框,一个框用于排名为 6.5 或更低的喜剧演员,另一个框用于其余的。
True - 5 位喜剧演员在此结束
gini = 0.0
意味着所有样本都得到了相同的结果。
samples = 5
意味着在此分支中还有 5 位喜剧演员(排名为 6.5 或更低的 5 位喜剧演员)。
value = [5, 0]
意味着 5 位得到“否”,0 位得到“是”。
False - 8 位喜剧演员继续
国籍
Nationality <= 0.5
意味着国籍值为 0.5 或更低的喜剧演员将沿着左侧箭头前进(这意味着所有来自英国的喜剧演员),其余的将沿着右侧箭头前进。
gini = 0.219
意味着大约 22% 的样本会走向一个方向。
samples = 8
意味着在此分支中还有 8 位喜剧演员(排名高于 6.5 的 8 位喜剧演员)。
value = [1, 7]
意味着在这 8 位喜剧演员中,1 位会得到“否”,7 位会得到“是”。
True - 4 位喜剧演员继续
Age
Age <= 35.5
意味着年龄在 35.5 岁或以下的喜剧演员将沿着左侧箭头前进,其余的将沿着右侧箭头前进。
gini = 0.375
意味着大约 37.5% 的样本会走向一个方向。
samples = 4
意味着在此分支中还有 4 位喜剧演员(4 位来自英国的喜剧演员)。
value = [1, 3]
意味着在这 4 位喜剧演员中,1 位会得到“否”,3 位会得到“是”。
False - 4 位喜剧演员在此结束
gini = 0.0
意味着所有样本都得到了相同的结果。
samples = 4
意味着在此分支中还有 4 位喜剧演员(4 位不是来自英国的喜剧演员)。
value = [0, 4]
意味着在这 4 位喜剧演员中,0 位会得到“否”,4 位会得到“是”。
True - 2 位喜剧演员在此结束
gini = 0.0
意味着所有样本都得到了相同的结果。
samples = 2
意味着在此分支中还有 2 位喜剧演员(年龄在 35.5 岁或以下的 2 位喜剧演员)。
value = [0, 2]
意味着在这 2 位喜剧演员中,0 位会得到“否”,2 位会得到“是”。
False - 2 位喜剧演员继续
经验
Experience <= 9.5
意味着拥有 9.5 年或更少经验的喜剧演员将沿着左侧箭头前进,其余的将沿着右侧箭头前进。
gini = 0.5
意味着 50% 的样本会走向一个方向。
samples = 2
意味着在此分支中还有 2 位喜剧演员(年龄大于 35.5 岁的 2 位喜剧演员)。
value = [1, 1]
意味着在这 2 位喜剧演员中,1 位会得到“否”,1 位会得到“是”。
True - 1 位喜剧演员在此结束
gini = 0.0
意味着所有样本都得到了相同的结果。
samples = 1
意味着在此分支中还有 1 位喜剧演员(拥有 9.5 年或更少经验的 1 位喜剧演员)。
value = [0, 1]
意味着 0 位会得到“否”,1 位会得到“是”。
False - 1 位喜剧演员在此结束
gini = 0.0
意味着所有样本都得到了相同的结果。
samples = 1
意味着在此分支中还有 1 位喜剧演员(拥有超过 9.5 年经验的 1 位喜剧演员)。
value = [1, 0]
意味着 1 位会得到“否”,0 位会得到“是”。
预测值
我们可以使用决策树来预测新值。
例如:我应该去看一位 40 岁、美国籍、有 10 年经验、喜剧排名为 7 的喜剧演员的表演吗?
不同结果
您会发现,如果您多次运行决策树,即使输入相同的数据,它也会给出不同的结果。
这是因为决策树不能给出 100% 确定的答案。它是基于结果的概率,答案会有所不同。