一、信息论基础
1、信息论
信息论是运用概率论与数理统计的方法研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科。信息系统就是广义的通信系统,泛指某种信息从一处传送到另一处所需的全部设备所构成的系统。信息论是关于信息的理论,应有自己明确的研究对象和适用范围。但从信息论诞生的那时起人们就对它有不同的理解。
2、信息熵
信息熵是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。
H的专业术语称之为信息熵,单位为比特。
注:信息熵和消除不确定性是相联系的
信息熵的定义公式:
3、条件熵的计算方法
(1)银行贷款数据案例介绍条件熵公式计算方法
计算年龄的信息增益步骤为:
4、信息增益(决策树的划分依据之一)
信息增益:当得知一个特征条件之后,减少的信息熵的大小。
二、决策树介绍
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
分类树(决策树)是一种十分常用的分类方法。他是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。
1、常见决策树使用的算法
注:基尼系数的划分更加仔细
2、sklearn中关于决策树的API
(1)减枝操作(cart)做法:
如果决策树考虑了所有的训练数据集,得到的决策树将会过于庞大。虽然这个决策树对于训练数据集的拟合概率为100%,但是由于过分考虑所有的数据,将数据切得太碎太碎了,这样就会使得决策树学习到一些噪音点、错误点,出现过拟合的现象。过拟合的主要原因在于构建决策树时过于复杂。
决策树的剪枝通过极小化决策树整体的损失函数或代价函数来实现。
使用 min_samples_split 和 min_samples_left 两个参数进行判断,走到某一步,若剩下符合条件的项少于X项,则删减掉。
3、决策树的保存
sklearn.tree.export_graphviz() 该函数能够导出 DOT 格式的文件
tree.export_graphviz(estimator,out_file=‘tree.dot’,feature_names=['',‘’])
4、决策树的优缺点以及改进
(1)优点
- 简单的理解和解释,树木可视化
- 需要很少的数据准备,其他技术通常需要数据归一化
(2)缺点
- 决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
(3)改进
- 减枝cart算法(决策树API当中已经实现,随机森林参数优化有相关的介绍)
- 随机森林
注:企业重要决策,由于决策树很好的分析能力,在决策过程中被应用较多。
三、决策树的可视化
1、windows下Graphviz安装及入门教程
windows版本下载地址:http://www.graphviz.org/download/
配置环境变量
将graphviz安装目录下的bin文件夹添加到Path环境变量中:
验证
进入windows命令行界面,输入dot -version
,然后按回车,如果显示graphviz的相关版本信息,则安装配置成功。
2、和python交互
graphviz强大而便捷的关系图/流程图绘制方法,很容易让我们联想到机器学习中的Decision Tree
的展示方式。幸运的是,scikit-learn提供了生成.dot
文件的接口,具体操作如下:
tree.export_graphviz(estimator,out_file=‘tree.dot’,feature_names=["", ""])
(1)在python编辑环境下:
from sklearn.tree import export_graphviz # 导入的是一个函数
# tree表示已经训练好的模型,即已经调用过DecisionTreeClassifier实例的fit(X_train, y_train)方法
export_graphviz(tree, out_file='tree.dot',
feature_names=['petal length', 'petal width'])
(2)进入windows命令行界面,cd 切换到tree.dot
所在的路径,执行
dot -Tpng tree.dot -o tree.png
四、泰坦尼克号案例分析
在泰坦尼克号相关数据(titanic2)中,数据描述了泰坦尼克号上乘客的生存状态。分析数据获取乘客的存活情况:
我们提取到的数据集中的特征分别是:票的类别、存活、乘坐班、年龄、登陆、home.dest、房间、票、船和性别。乘坐班是指乘客社会经济阶层(1,2,3)。其中,age数据中存在缺失值
数据来源:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
import pandas as pd
def decision():
"""
决策树对泰坦尼克号进行预测生死
:return: None
"""
#获取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
#处理数据,找出特征值和目标值
x = titan[['pclass', 'age', 'sex']] #特征值
y = titan['survived'] #目标值
print(x)
# 缺失值处理
x['age'].fillna(x['age'].mean(), inplace=True) #inplace即替换值
#分割数据集到训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
#进行处理(特征工程)特征——>类别——>one-hot编码
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient='records')) #将数据转换成字典格式
print(dict.get_feature_names())
x_test = dict.transform(x_test.to_dict(orient='records'))
print(x_train)
#使用决策树进行预测
dec = DecisionTreeClassifier(criterion="gini")
dec.fit(x_train, y_train)
#预测准确率
print("预测的准确率为:", dec.score(x_test, y_test))
#导出决策树的结构
export_graphviz(dec, out_file="./tree.dot",
feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'])
return None
if __name__ == '__main__':
decision()
决策树展示: