前言
关于决策树的理论知识部分,这里就不多说了,论坛中有许多博客都有介绍,这里主要通俗介绍其实现过程。
对于决策树,有些类似于利用二叉树来构建分类器,当然,对于决策树而言,并不只限定于对二元属性(是、否)的样本进行分类,也可以对标称属性(不同状态,如男、女;单身、已婚、离异;)和连续属性(如收入、身高等)的样本构建决策树进行分类,对不同的样本进行构建时只需在具体程序当中对部分代码进行修改就行了,当然在对连续属性的样本分类过程中需要考虑对连续属性的最佳划分,在以后的深化中也会再次提到。
决策树:
优点:计算复杂度不高,输出结果易于理解,对样本出现缺失的情况也能较好处理。
缺点:可能产生过度匹配情况,也就是需要剪枝处理(本文只是简单介绍实现初步决策树,在今后的文章中将会陆续深化)。
熵的简介
在进行程序之前还有一个重要的特征需要介绍,就是机器学习中经常需要用到的概念:熵,也叫香农熵,是由一个叫克劳德·香农的人提出的。定义为信息的期望值,那么信息是如何定义的呢?就是由如下公式进行定义: − p ( x i ) ⋅ ∑ i = 1 n l o g 2 p ( x i ) -p(x_{i})·\sum_{i=1}^{n}log_{2}p(x_{i}) −p(xi)⋅∑i=1nlog2p(xi),至于为什么是这个公式,详情可参考文章底部的参考目录[2]。
对于熵,这里不作过多的解释,需要明白的是,熵通常用于衡量混乱程度,也就是说,熵越大则信息混乱程度越高,那么我们在机器学习的过程中需要做的就是尽量缩小熵,而对于决策树的构建,有多种方法:ID3、C4.5和CART。这里采用最大信息增益的方法,也就是ID3方法,这种方法不是特别完美,无法很好的处理数值型数据,在今后的文章中将会介绍其他的方法。
主要步骤
样本说明
要进行决策树的构建,这里使用参考书目[1]中的例子进行说明,数据如下(是:1,否:0):
不浮出水面是否能生存 | 是否有脚蹼 | 属于鱼类 | |
---|---|---|---|
1 | 是 | 是 | 是 |
2 | 是 | 否 | 否 |
3 | 否 | 是 | 否 |
4 | 否 | 是 | 否 |
5 | 是 | 是 | 是 |
总体分析
构建决策树的目的是为了构建一个分类器,通过特征对样本进行判断,要达到的结果大致如下(当然实际情况中可能会出现无用的特征):
程序框架
那么构建的主要内容可以大致分为以下几个步骤:样本数据读取、熵值计算、最优特征(节点)选择、决策树构建、对训练集外的数据进行判断,下面开始编程:
样本数据读取
要通过特征值对样本进行分类,那么必然涉及到对样本的分组,为了方便调取每个样本的特征值,故将样本数据转换为列表形式来进行分析,而通常样本数据为表格形式,故首先要将数据从表格中读取后转换为列表形式,代码如下:
import pandas as pd
def read_data(file_path):
"""
数据读取:这里使用xlsx形式的数据,若数据形式不同,可相应更改读取方式,最终返回列表形式的data即可
"""
data_pd = pd.read_excel(file_path)
# 获取特征标签labels
labels = list(data_pd.columns[:-1])
# 将Dataframe数据转换为list形式
data_lists = []
for ii in range(len(data_pd)):
data_lists.append(list(data_pd.iloc[ii,:]))
return data_lists,labels
最后返回的数据形式如下:
>>> samples,labels = read_data(data_path) # 这里data_path是文件位置
>>> print(samples):
[[1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no'], [1, 1, 'yes']]
>>> print(labels):
['flippers', 'surfacing']
熵值计算
对于熵的计算,这里作个简单的例子介绍:
依据上述的熵值计算公式: − ∑ i = 1 n p ( x i ) ⋅ l o g 2 p ( x i ) -\sum_{i=1}^{n}p(x_{i})·log_{2}p(x_{i}) −∑i=1np(xi)⋅log2p(xi),这里计算个简单的例子,在样本数据中2个为鱼类,3个为非鱼类,那么鱼类的出现频率为 2 / 5 = 0.4 2/5=0.4 2/5=