决策树


大二学生仔的一门课程,全给老师当研究生教了🙃表示很淦

一、决策树是什么?

摘自百度

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
分类树(决策树)是一种十分常用的分类方法。他是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。

案例:

  • 这个流程图就是一个决策树长方形表示判断,椭圆表示终止,表示已经可以得出结论,终止运行。
  • 其实也就是一种树型模型,它由结点有向边组成。而结点有两种类型:内部结点(特征或者属性)和叶结点(类)。
  • 对于这个案例来讲,长方形的结点就属于内部节点椭圆的节点属于叶结点,从结点引出的左右箭头就是有向边,而最上面的结点就属于决策树的根结点

这是一个假想的相亲系统,首先检测对方是否有房。如果有房,则进一步考虑。
如果没有房,则观察相亲对象是否有上进心,
如果没有,Say goodbye,此时可以说,‘你很好,但我们不合适。’
如果有,则把这个相亲对象列入候选名单,或者说是备胎组
不过这只是理想的,生活中会更复杂,考虑因素也是五花八门。脾气好吗?会做饭吗?会做家务吗?家里几个孩子?父母是干什么的????

那么这里可以用决策树进行预测,大致分为以下几个步骤:

  1. 收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了;
  2. 准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理;
  3. 分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期;
  4. 训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构;
  5. 测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了;
  6. 使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

二、下面用两组实例来研究它

Ⅰ. 预测患者需要佩戴的隐形眼镜类型

四个特征(内部结点):age(年龄)prescript(症状)astigmatic(是否散光)tearRate(眼泪数量)
三个类别(叶结点):硬材质(hard)软材质(soft)不适合佩戴隐形眼镜(no lenses)

① 导入sklearn库,Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装

from sklearn.preprocessing import LabelEncoder  # 用于序列化
from sklearn.tree import DecisionTreeClassifier  # 导入决策树分类器
from sklearn.model_selection import cross_val_score  # 导入计算交叉检验值的函数cross_val_score

② 创建决策树

# 创建一颗基于基尼系数的决策树(国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标)
# 国际惯例把0.2以下视为收入绝对平均,0.2-0.3视为收入比较平均;
#0.3-0.4视为收入相对合理;0.4-0.5视为收入差距较大,
#当基尼系数达到0.5以上时,则表示收入悬殊。
clf = DecisionTreeClassifier(criterion="gini", max_features=None)
#criterion: 用于选择属性的准则,可以传入“gini"代表基尼系数,或者“entropy代表信息增益
#max features:表示在决策树结点进行分裂时,从多少个特征中选择最优特征。可以设定固定数目、百分比或其他标准。
#它的默认值是使用所有特征个数,这里取的所有。

③ 数据解析(25组数据进行模型训练)


蓝奏云lenses.txt

  • 处理.txt文本,获取每一列的特征值,及最后一列目标的标签值
fr = open('lenses.txt', 'r')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]  # 去掉空格,提取每组数据的类别,保存在列表里
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']  # 特征标签
lenses_target = [row[-1] for row in lenses] # 目标标签

lenses_list = []  # 保存lenses数据的临时列表
lenses_dict = {}  # 保存lenses数据的字典,用于生成pandas
for each_label in lensesLabels:
    # 提取信息,生成字典
    for each in lenses:
        lenses_list.append(each[lensesLabels.index(each_label)])
    lenses_dict[each_label] = lenses_list
    lenses_list = []

lenses_data = pd.DataFrame(lenses_dict)  # 生成pandas.DataFrame
  • 序列化
lenses_data = pd.DataFrame(lenses_dict)  # 生成pandas.DataFrame
le = LabelEncoder()  # 创建LabelEncoder()对象,用于序列化
for col in lenses_data.columns:
    # 为每一列序列化
    lenses_data[col] = le.fit_transform(lenses_data[col])
lenses_target = le.fit_transform(lenses_target) # 将标签序列化
  • 序列化后的数据显示:
age  astigmatic  prescript  tearRate
2           0          1         1
2           0          1         0
2           1          1         1
2           1          1         0
2           0          0         1

④预测类型

  1. 待测试数据集
  • 选取三个测试集进行测试
    test = [ [“presbyopic”, “yes”, “myope”, “normal”],[“young”, “no” ,“myope”, “normal”],[“pre”, “yes”, “hyper”, “reduced”] ]
  • 序列化后
    test = [ [1, 1, 1, 0], [2, 0, 1, 0], [0, 1, 0, 1] ]
  • 模型训练及结果预测
score = cross_val_score(clf, lenses_data, lenses_target, cv = 10) # 使用10折交叉验证

clf.fit(lenses_data, lenses_target) # fit()训练模型
# 待预测的测试集
test = [
    [1, 1, 1, 0],
    [2, 0, 1, 0],
    [0, 1, 0, 1]]
pre_test_tree = clf.predict(test) # 决策树,函数预测
print('运用 决策树 预测分类结果:',pre_test_tree)
  1. 预测结果:
  • 运用 决策树 预测分类结果: [0 2 1]
  • 即[hard, soft, no lenses],【硬材质,软材质,不适合】

Ⅱ. 鸢尾花数据集分类

①数据及库导入

from sklearn.datasets import load_iris #导入鸢尾花训练集
from sklearn.tree import DecisionTreeClassifier #导入决策树分类器
from sklearn.model_selection import cross_val_score #导入计算交叉检验值的函数cross_val_score

②决策树使用,参数同实例1

#创建一颗基于基尼系数的决策树
clf = DecisionTreeClassifier()
#将鸢尾花数据赋值给变量iris
iris = load_iris()

ris.data鸢尾花数据做为特征
iris.target鸢尾花分类标签做为目标结果
设定cv为10,使用10折交叉验证,得到最终的交叉验证得分

data = iris.data #鸢尾花数据作为特征,
target = iris.target #鸢尾花数据作为目标结果[0,1,2],
cv = 10 #使用10折交叉验证
score = cross_val_score(clf, data, target, cv = 10)

fit() 函数训练模型,并使用predict() 函数预测

clf.fit(data, target) #fit()训练模型
test = [[5.1, 3.5, 1.4, 0.2],
 [4., 2.2, 1.7, 0.4],
 [5.9, 3., 5.1, 1.8]]
pre_test_tree = clf.predict(test) #决策树 函数预测

③测试结果

运用 决策树 预测分类结果: [0 0 2]
[山鸢尾 山鸢尾 维吉尼亚鸢尾]

代码已经托管在Gitee上了

传送门 https://gitee.com/zhengdaniel/machine-learning

posted @ 2020-10-24 10:58  你好我叫郑某人  阅读(414)  评论(0编辑  收藏  举报