Python 机器学习 决策树(Decision Tree)

机器学习使计算机从研究数据和统计数据中学习机器学习是向人工智能(AI)方向迈进的一步。机器学习是一个分析数据并学习预测结果的程序。本文主要介绍Python 机器学习 决策树(Decision Tree)。


1、决策树(Decision Tree)

在本章中,我们将向您展示如何制作“决策树”。决策树是流程图,可以帮助您根据以前的经验来做出决策。

在该示例中,一个人将尝试决定是否应参加喜剧节目。

幸运的是,我们的榜样人物每次在镇上举办喜剧节目时都进行注册,并注册一些关于喜剧演员的信息,并且还注册了他/她是否去过。

AgeExperienceRankNationalityGo
36109UKNO
42124USANO
2346NNO
5244USANO
43218USAYES
44145UKNO
6637NYES
35149UKYES
52137NYES
3559NYES
2435USANO
1837UKYES
4599UKYES

现在,基于此数据集,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%的肯定答案。 它基于结果的可能性,答案将有所不同。

推荐阅读
cjavapy编程之路首页