机器学习之决策树

时间:2023-02-13 00:08:06

应用场景

决策树算法是一种基本的分类方法,主要应用对一个数据集中的所用的分类结果是固定的几个值,不会应为各个相关的条件变化产生一个无法预料的分类结果.可以用于银行贷款预测模型中(分类结果只有可以贷款和不可以贷款),股票行情分析(是否值得购买)等相关的数据模型中,天气情况预测(晴,雨,阴等)。

算法剖析

决策树学习主要分为特征选择和决策树的生成。

所谓的特征选择,主要是在数据集中选择和分类目标值相关的一些特征,如果利用一个特征进行分类的结果与随机分类的结果没有大的差别的话,那么我们称这个特征是没有分辨能力的,换句话说,这样的特征值和我们的分类目标值没有太大的关系,不需要选择该类特征分类.我们应该选择一些对我们分类目标值影响较大的一些特征进行操作。

通常在选择特征值的时候,我们会使用一个信息增益的准则,其中我们所表述的信息和消除不确定性是相联系的.所谓信息增益表述的是一个特征值的信息是目标分类值的不确定性的减少程度,所以在我们进行特征分类的时候,应该选择信息增益大的一些特征值。

信息增益的计算,在进行信息增益的计算的时候,我们需要使用的两个比较重要的公式,经验熵(shang)的计算和条件熵的计算.信息熵是信息学中的一个非常重要的概念,是由数据家克劳德·艾尔伍德·香农第一次用数学语言表示信息的不确定程度。

一般而言,当一种信息出现概率更高的时候,表明它被传播得更广泛,或者说,被引用的程度更高。我们可以认为,从信息传播的角度来看,信息熵可以表示信息的价值。这样子我们就有一个衡量信息价值高低的标准,可以做出关于知识流通问题的更多推论。

经验熵的计算公式:

机器学习之决策树

条件熵计算公式:

机器学习之决策树

信息增益公式为:

机器学习之决策树

其中D表示数据集,|D| 表示的是样本个数,一共有K个特征分类,其中||表示的是类的样本个数,其中n表示的是在特征值为A的条件下的特征分类值

实例解说

假如现在有一个银行贷款申请数据的数据集,其中特征值为年龄,工作,房子,信贷情况,分类目标值为类别(是否贷款):

机器学习之决策树
image.png

首先,我们要找出特征值和目标值,特其中征值为年龄,工作,房子,信贷情况,分类目标值为类别(是否贷款)

接下来我们使用经验熵的公式计算:
H(D)=-(9/15)log(9/15)-(6/15)log(6/15)=0.971;

然后我们分别使用A1,A2,A3,A4分别表示年龄,工作,房子,信贷4个特征,那么我们计算出年龄的信息增益为
年龄:g(D,A1)=H(D)-H(D|A)
=H(D)-(5/15H(D1)+5/15(D2)+5/15(D3))

其中 H(D1)=-(2/5)log(2/5)-(3/5)log(3/5) 年龄为青年的经验熵;
H(D2)=-(3/5)log(3/5)-(2/5)log(2/5) 年龄为中年的经验熵;
H(D3)=-(4/5)log(4/5)-(1/5)log(1/5)年龄为老年的经验熵;
通过上述公式可以计算g(D,A1)=0.083,同理计算g(D,A2)=0.324,g(D,A3=0.420,g(D,A4)=0.363,相比来说,特征A3有自己的房子的信息增益最大,所以在分类选择的时候应该依次选择 房子-->信贷-->工作--->年龄这四个类别。

算法实现

继机器学习之算法_决策树的理论讲解完成以后,接下来我们需要使用python中的机器学习模块Scikit-learn来完成具体的代码实现,其中数据集使用泰坦尼克号的相关数据对泰坦尼克号存活率进行数据分析

首先需要安装对应的机器学习相关模块:

pip install numpy
pip install scipy
pip install pandas
pip install Scikit-learn
pip install pydotplus

其中 numpy是Python中科学计算的基础模块,用于数据分析的常用模块,scipy是基于numpy基础上进行的一个数据分析的模块,pandas也是一个用于数据分析的模块,相对于numpy,scipy功能更加丰富;
Scikit-learn是机器学习的模块,pydotplus是一个可以把决策树的路径信息导出为pdf或者是png图片格式的模块,注意,改模块依赖操作系统的graphviz模块,如果操作系统没有graphviz,请安装graphviz模块;

准备数据

可以去网站http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt下载比较准确的数据集;其中pclass表示的是仓位(一等座,二等座..),survived表示的是是否存活,age表示的是年龄,sex表示性别;

分析出特征值和目标值

通过对数据集的分析,确定特征值和目标值,
其中分类目标值为survived;
特征值为pclass,age,sex;

开始编写代码

在编写代码的主要过程有:

  • 收集/导入数据
  • 确定特征值和目标值
  • 数据清洗,主要对非空数据的处理,可以直接剔除,也可以把年龄设置为平均值
  • 把数据集分离为训练集和测试集
  • 把数据转换为字典数据并且提取特征值
  • 创建一个决策树实例
  • 生成决策树
  • 导出决策树
import pandas as pd
import sklearn
import pydotplus
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree

filename="./titanic.txt"
#使用pandas读取数据集
data_arr=pd.read_csv(filename)
#特征值
x=data_arr[["age","sex","pclass"]]
#目标值
y=data_arr[["survived"]]
#对age的空值进行处理
x["age"].fillna(x["age"].mean(),inplace=True)
#分离训练集 测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
#字典数据转换,特征数据抽取
dc=DictVectorizer(sparse=False)
#提取训练特征数据
x_train=dc.fit_transform(x_train.to_dict(orient="records"))
#提取测试特征数据
x_test=dc.transform(x_test.to_dict(orient="records"))
#获取字典数据
print(dc.get_feature_names())
# print(x_train, x_test)
#调用决策树的API 返回的dec代表决策树的路径
dec=DecisionTreeClassifier(max_depth=4)
#从训练集构建一个决策树
dec.fit(x_train,y_train)
print("准去率:",dec.score(x_test,y_test))
#把决策树导出
dot_data=tree.export_graphviz(dec,out_file=None,feature_names=['age','pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'])
graph=pydotplus.graph_from_dot_data(dot_data)
#本地保存为pdf文件
graph.write_pdf("tanic.pdf")

决策树的API

sklearn.tree.DecisionTreeClassifier 类是用来描述决策树的类,
创建对象常用的参数有:
max_depth: 决策树的最大深度,即表示生成一个多少级的决策树
criterion:生成决策树的相关标准,默认使用基尼系数gini;

常用方法:
apply:返回每个样本被预测的叶子索引;
fit:从训练集构建一个决策树;
score:返回测试数据的精确度;



叩丁狼是一家专注于IT教育培训的机构,坚持一次学习终生受益的教学理念。目前有北京,广州,上海三个校区。设有Java培训、python培训等下线培训课程,在校期间通过严格的管理,悉心的辅导,完善的教学体系,不仅保证每一位学员能学会技术,有很强的实战能力。