决策树分类原理(一)26

1、决策树概述

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

1.1、示例一

我们有如下数据:

ID 拥有房产(是/否) 婚姻[单身,已婚,离婚] 年收入(单位:千元) 无法偿还债务(是/否)
1 单身 125
2 已婚 100
3 单身 70
4 已婚 120
5 离婚 95
6 已婚 60
7 离婚 220
8 单身 85
9 已婚 75
10 单身 90

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfZ25v44-1638252895684)(./images/1-决策树.png)]

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

1.2、示例二

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

根据实力构建决策树:

问题:图片是二叉树吗?

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

  • 上面那棵树中,属性:绿色的节点(年龄、长相、收入、是否是公务员)
    • 属性叫做,data,数据,一般使用X表示
    • 跟属性对应,目标值(橘色节点),一般使用y表示
  • 构建这棵树时,先后顺序,每个人,标准不同,树结构不同
  • 计算机,构建树,标准一致的,构建出来的树,一致
1.3、决策树算法特点
  • 可以处理非线性的问题

  • 可解释性强,没有方程系数 θ \theta θ

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

2、DecisionTreeClassifier使用

2.1、算例介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Zgst5OZ-1638252895691)(./images/3-账号真伪.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhB2N4Jz-1638252895694)(./images/5-Account.png)]

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

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3FqmsP5i-1638252895697)(./images/6-entropy.gif)]

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

  • 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=1np(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=1np(x)l

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值