1、决策树概述
决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。这一章我们把决策树算法理解透彻了,非常有利于后面去学习集成学习。
1.1、示例一
我们有如下数据:
ID | 拥有房产(是/否) | 婚姻[单身,已婚,离婚] | 年收入(单位:千元) | 无法偿还债务(是/否) |
---|---|---|---|---|
1 | 是 | 单身 | 125 | 否 |
2 | 否 | 已婚 | 100 | 否 |
3 | 否 | 单身 | 70 | 否 |
4 | 是 | 已婚 | 120 | 否 |
5 | 否 | 离婚 | 95 | 是 |
6 | 否 | 已婚 | 60 | 否 |
7 | 是 | 离婚 | 220 | 否 |
8 | 否 | 单身 | 85 | 是 |
9 | 否 | 已婚 | 75 | 否 |
10 | 否 | 单身 | 90 | 是 |
上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下:
比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。
1.2、示例二
女孩母亲要给她介绍对象,年龄是多少,母亲说24。长得帅吗?挺帅的。收入高吗?中等收入。是公务员吗?母亲说,是的。女孩:好,我去见见。
根据实力构建决策树:
问题:图片是二叉树吗?
决策树是标准的二叉树,每个节点只有两个分支~
- 上面那棵树中,属性:绿色的节点(年龄、长相、收入、是否是公务员)
- 属性叫做,data,数据,一般使用X表示
- 跟属性对应,目标值(橘色节点),一般使用y表示
- 构建这棵树时,先后顺序,每个人,标准不同,树结构不同
- 计算机,构建树,标准一致的,构建出来的树,一致
1.3、决策树算法特点
-
可以处理非线性的问题
-
可解释性强,没有方程系数 θ \theta θ
-
模型简单,模型预测效率高 if else
2、DecisionTreeClassifier使用
2.1、算例介绍
其中s、m和l分别表示小、中和大。
账号是否真实跟属性:日志密度、好友密度、是否使用真实头像有关系~
2.2、构建决策树并可视化
数据创建
import numpy as np
import pandas as pd
y = np.array(list('NYYYYYNYYN'))
print(y)
X = pd.DataFrame({'日志密度':list('sslmlmmlms'),
'好友密度':list('slmmmlsmss'),
'真实头像':list('NYYYYNYYYY'),
'真实用户':y})
X
模型训练(报错,原因:数据类型是字符串)
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X,y)
数据修改(map函数,进行数据转换)
X['日志密度'] = X['日志密度'].map({'s':0,'m':1,'l':2})
X['好友密度'] = X['好友密度'].map({'s':0,'m':1,'l':2})
X['真实头像'] = X['真实头像'].map({'N':0,'Y':1})
X
模型训练可视化
import matplotlib.pyplot as plt
# 使用信息熵,作为分裂标准
model = DecisionTreeClassifier(criterion='entropy')
model.fit(X,y)
plt.rcParams['font.family'] = 'STKaiti'
plt.figure(figsize=(12,16))
fn = X.columns
_ = tree.plot_tree(model,filled = True,feature_names=fn)
plt.savefig('./iris.jpg')
数据可视化另一种方式,安装教程
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
import graphviz
from sklearn import tree
model = DecisionTreeClassifier(criterion='entropy')
model.fit(X,y)
dot_data = tree.export_graphviz(model, out_file=None,
feature_names= X.columns,# 特征名
class_names=np.unique(y),# 类别名
filled=True, # 填充颜色
rounded=True) # 圆角
graph = graphviz.Source(dot_data)
graph.render('Account',format='png')
修改中文乱码
import re
# 打开 dot_data.dot,修改 fontname="支持的中文字体"
f = open('Account', 'r', encoding='utf-8')
with open('./Account2', 'w', encoding="utf-8") as file:
file.write(re.sub(r'fontname=helvetica', 'fontname=Fangsong', f.read()))
f.close()
# 从文件中加载,展示
graph = graphviz.Source.from_file('./Account2')
graph.render('Account')
2.3、信息熵
-
构建好一颗树,数据变的有顺序了(构建前,一堆数据,杂乱无章;构建一颗,整整齐齐,顺序),用什么度量衡表示,数据是否有顺序:信息熵
-
物理学,热力学第二定律(熵),描述的是封闭系统的混乱程度
-
信息熵,和物理学中熵类似的
-
H ( x ) = − ∑ i = 1 n p ( x ) l o g 2 p ( x ) H(x) = -\sum\limits_{i = 1}^n p(x)log_2p(x) H(x)=−i=1∑np(x)log2p(x)
-
H ( x ) = ∑ i = 1 n p ( x ) l o g 2 1 p ( x ) H(x) = \sum\limits_{i = 1}^n p(x)log_2\frac{1}{p(x)} H(x)=i=1∑np(x