决策树算法上篇

决策树概述

决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。

示例一:

2288e6e1395a44039715160ddd5f987c.png

上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下

c70406d486074c1ca1b5395def3216b9.png

比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。

示例二:

女孩母亲要给她介绍对象,年龄是多少,母亲说24。长得帅吗?挺帅的。收入高吗?中等收入。是公务员吗?母亲说,是的。女孩:好,我去见见。

根据实力构建决策树:

625162e1241a41a9962e69294fc5da04.png

 

问题:图片是二叉树吗?

决策树是标准的二叉树,每个节点只有两个分支~

  • 上面那棵树中,属性:绿色的节点(年龄、长相、收入、是否是公务员)

    • 属性叫做,data,数据,一般使用X表示

    • 跟属性对应,目标值(橘色节点),一般使用y表示

  • 构建这棵树时,先后顺序,每个人,标准不同,树结构不同

  • 计算机,构建树,标准一致的,构建出来的树,一致

决策树算法特点

 

  • 可以处理非线性的问题

  • 可解释性强,没有方程系数𝜃

  • 模型简单,模型预测效率高 if else

 DecisionTreeClassifier使用

e132644dcc0c4f2ba0950813794237b6.png

其中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')

825bf4f5813446439fa185ad0f6863f0.png

数据可视化另一种方式

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')

269acbf555ec4b60ac970bb9afd93382.png

信息熵

  • 构建好一颗树,数据变的有顺序了(构建前,一堆数据,杂乱无章;构建一颗,整整齐齐,顺序),用什么度量衡表示,数据是否有顺序:信息熵

  • 物理学,热力学第二定律(熵),描述的是封闭系统的混乱程度

 

e609fa53a888489eb1ce09695b720175.gif

信息熵,和物理学中熵类似的  

54e8ae8ed22f45da89d2190a6bb4aa80.png


 b172b785cee64d089e68783314be4362.png

信息增益

信息增益是知道了某个条件后,事件的不确定性下降的程度。写作 g(X,Y)。它的计算方式为熵减去条件熵,如下

d91eab265fbb4716a8bc62c680a53459.png

表示的是,知道了某个条件后,原来事件不确定性降低的幅度。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值