1、决策树(Decision Tree)
在本章中,我们将向您展示如何制作“决策树”。决策树是流程图,可以帮助您根据以前的经验来做出决策。
在该示例中,一个人将尝试决定是否应参加喜剧节目。
幸运的是,我们的榜样人物每次在镇上举办喜剧节目时都进行注册,并注册一些关于喜剧演员的信息,并且还注册了他/她是否去过。
Age | Experience | Rank | Nationality | Go |
36 | 10 | 9 | UK | NO |
42 | 12 | 4 | USA | NO |
23 | 4 | 6 | N | NO |
52 | 4 | 4 | USA | NO |
43 | 21 | 8 | USA | YES |
44 | 14 | 5 | UK | NO |
66 | 3 | 7 | N | YES |
35 | 14 | 9 | UK | YES |
52 | 13 | 7 | N | YES |
35 | 5 | 9 | N | YES |
24 | 3 | 5 | USA | NO |
18 | 3 | 7 | UK | YES |
45 | 9 | 9 | UK | YES |
现在,基于此数据集,Python可以创建决策树,该决策树可用于确定是否有任何新的演出值得参加。
2、决策树如何工作?
首先,导入所需的模块,并使用pandas读取数据集:
例如:
读取并打印数据集:
import pandas from sklearn import tree import pydotplus from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt import matplotlib.image as pltimg df = pandas.read_csv("shows.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)
现在,我们可以创建实际的决策树,使其适合我们的详细信息,然后将.png文件保存在计算机上:
例如:
创建决策树,将其另存为图像,然后显示该图像:
dtree = DecisionTreeClassifier() dtree = dtree.fit(X, y) data = tree.export_graphviz(dtree, out_file=None, feature_names=features) graph = pydotplus.graph_from_dot_data(data) graph.write_png('mydecisiontree.png') img=pltimg.imread('mydecisiontree.png') imgplot = plt.imshow(img) plt.show()
3、结果解释
决策树使用之前的决策来计算是否愿意去看喜剧演员的几率。
让我们阅读决策树的不同方面:
Rank
Rank <= 6.5
表示所有排名在6.5以下的喜剧演员都会跟随True
箭(左),其余的会跟随Fasle箭(右)。
gini = 0.497
表示分割的质量,总是介于0.0和0.5之间的一个数字,其中0.0表示所有样本得到相同的结果,0.5表示分割正好在中间完成。
samples = 13
意味着在这一点上还有13个喜剧演员在决定,这是他们所有人,因为这是第一步。
value = [6,7]
表示这13个喜剧演员中,6个会得到"NO",7个会得到"GO"。
Gini
有许多方法来分割样本,我们在本教程中使用GINI方法。
Gini方法使用以下公式:
Gini = 1 - (x/n)2 - (y/n)2
其中,x
是肯定答案的数量(“ GO”),n
是样本数量,y
是否定答案的数量(“NO”),这使我们进行了计算:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
下一步包含两个方框,一个方框用于“Rank”为6.5或更低的喜剧演员,另一个方框用于其余演员。
True- 5个喜剧演员在这里结束:
gini = 0.0
表示所有样本得到相同的结果。
samples = 5
表示这个分支中还剩下5名喜剧演员(5名喜剧演员,评分6.5或以下)。
value = [5, 0]
意味着5会得到"NO"和0会得到"GO"。
False-8位喜剧演员继续:
Nationality
Nationality&lt; = 0.5
表示国籍值小于0.5的喜剧演员会跟随左边的箭头(表示所有来自英国的人),其余的会跟随右边的箭头。
gini = 0.219
意味着大约22%的样本会朝一个方向移动。
samples = 8
表示这个分支中还剩下8位喜剧演员(排名高于6.5的喜剧演员有8位)。
value = [1, 7]
这意味着在这8个喜剧演员中,1个会得到"NO" ,7个会得到"GO"。
True-4名喜剧演员继续:
Age
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]
表示这两个喜剧演员中,0会得到"NO" 2会得到"GO"。
False-2名喜剧演员继续:
Experience
Experience <= 9.5
这意味着9.5年或更少经验的喜剧演员会跟随箭头向左,其余的会跟随箭头向右。
gini = 0.5
意味着50%的样本会朝一个方向。
samples = 2
表示这个分支中还剩下2名喜剧演员(2名超过35.5岁的喜剧演员)。
value = [1, 1]
这意味着在这两个喜剧演员中,一个会得到"NO" ,一个会得到"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"。
4、预测值
我们可以使用决策树来预测新值。
示例:我是否应该去看一个由40岁的美国喜剧演员主演的节目,该喜剧演员有10年的工作经验,喜剧排名为7?
例如:
使用predict()方法预测新值:
print(dtree.predict([[40, 10, 7, 1]]))
例如:
如果喜剧等级为6,答案是什么?
print(dtree.predict([[40, 10, 6, 1]]))
不同的结果
即使运行了足够的数据,即使运行了足够多次,也会看到决策树为你提供了不同的结果,这是因为决策树无法为我们提供100%的肯定答案。 它基于结果的可能性,答案将有所不同。