决策树概述
决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。
示例一:
上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下
比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。
示例二:
女孩母亲要给她介绍对象,年龄是多少,母亲说24。长得帅吗?挺帅的。收入高吗?中等收入。是公务员吗?母亲说,是的。女孩:好,我去见见。
根据实力构建决策树:
问题:图片是二叉树吗?
决策树是标准的二叉树,每个节点只有两个分支~
上面那棵树中,属性:绿色的节点(年龄、长相、收入、是否是公务员)
属性叫做,data,数据,一般使用X表示
跟属性对应,目标值(橘色节点),一般使用y表示
构建这棵树时,先后顺序,每个人,标准不同,树结构不同
计算机,构建树,标准一致的,构建出来的树,一致
决策树算法特点
可以处理非线性的问题
可解释性强,没有方程系数𝜃
模型简单,模型预测效率高 if else
DecisionTreeClassifier使用
其中s、m和l分别表示小、中和大。
账号是否真实跟属性:日志密度、好友密度、是否使用真实头像有关系~
构建决策树并可视化
数据创建
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')
信息熵
构建好一颗树,数据变的有顺序了(构建前,一堆数据,杂乱无章;构建一颗,整整齐齐,顺序),用什么度量衡表示,数据是否有顺序:信息熵
物理学,热力学第二定律(熵),描述的是封闭系统的混乱程度
信息熵,和物理学中熵类似的
信息增益
信息增益是知道了某个条件后,事件的不确定性下降的程度。写作 g(X,Y)。它的计算方式为熵减去条件熵,如下
表示的是,知道了某个条件后,原来事件不确定性降低的幅度。