机器学习 - 决策树

决策树
在本章中,我们将向您展示如何制作一个“决策树”。决策树是一个流程图,可以帮助您根据过去的经验做出决策。
在示例中,一个人将尝试决定他/她是否应该去看喜剧表演。
幸运的是,我们示例中的这个人记录了每次有喜剧表演时的情况,并记录了一些关于喜剧演员的信息,还记录了他们是否去看了。
| 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% 确定的答案。它是基于结果的概率,答案会有所不同。
 
