文章目录

  • 1. 决策树概念
  • 2. 决策树实操
    • 2.1 决策树多分类
    • 2.2 决策树回归
    • 2.3 决策树调参案例(Tatanic)

1. 决策树概念

决策树是根据特征进行树的构造,主要内容如下:
通过属性构造节点:
(1)二元属性

#mermaid-svg-VoKs71KwM4f09LMy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VoKs71KwM4f09LMy .error-icon{fill:#552222;}#mermaid-svg-VoKs71KwM4f09LMy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VoKs71KwM4f09LMy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VoKs71KwM4f09LMy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VoKs71KwM4f09LMy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VoKs71KwM4f09LMy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VoKs71KwM4f09LMy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VoKs71KwM4f09LMy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VoKs71KwM4f09LMy .marker.cross{stroke:#333333;}#mermaid-svg-VoKs71KwM4f09LMy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VoKs71KwM4f09LMy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VoKs71KwM4f09LMy .cluster-label text{fill:#333;}#mermaid-svg-VoKs71KwM4f09LMy .cluster-label span{color:#333;}#mermaid-svg-VoKs71KwM4f09LMy .label text,#mermaid-svg-VoKs71KwM4f09LMy span{fill:#333;color:#333;}#mermaid-svg-VoKs71KwM4f09LMy .node rect,#mermaid-svg-VoKs71KwM4f09LMy .node circle,#mermaid-svg-VoKs71KwM4f09LMy .node ellipse,#mermaid-svg-VoKs71KwM4f09LMy .node polygon,#mermaid-svg-VoKs71KwM4f09LMy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VoKs71KwM4f09LMy .node .label{text-align:center;}#mermaid-svg-VoKs71KwM4f09LMy .node.clickable{cursor:pointer;}#mermaid-svg-VoKs71KwM4f09LMy .arrowheadPath{fill:#333333;}#mermaid-svg-VoKs71KwM4f09LMy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VoKs71KwM4f09LMy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VoKs71KwM4f09LMy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VoKs71KwM4f09LMy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VoKs71KwM4f09LMy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VoKs71KwM4f09LMy .cluster text{fill:#333;}#mermaid-svg-VoKs71KwM4f09LMy .cluster span{color:#333;}#mermaid-svg-VoKs71KwM4f09LMy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VoKs71KwM4f09LMy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

有房

(2)三元属性

#mermaid-svg-dDdl3NH2Fad3Ss1A {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .error-icon{fill:#552222;}#mermaid-svg-dDdl3NH2Fad3Ss1A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dDdl3NH2Fad3Ss1A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .marker.cross{stroke:#333333;}#mermaid-svg-dDdl3NH2Fad3Ss1A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .cluster-label text{fill:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .cluster-label span{color:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .label text,#mermaid-svg-dDdl3NH2Fad3Ss1A span{fill:#333;color:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .node rect,#mermaid-svg-dDdl3NH2Fad3Ss1A .node circle,#mermaid-svg-dDdl3NH2Fad3Ss1A .node ellipse,#mermaid-svg-dDdl3NH2Fad3Ss1A .node polygon,#mermaid-svg-dDdl3NH2Fad3Ss1A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .node .label{text-align:center;}#mermaid-svg-dDdl3NH2Fad3Ss1A .node.clickable{cursor:pointer;}#mermaid-svg-dDdl3NH2Fad3Ss1A .arrowheadPath{fill:#333333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dDdl3NH2Fad3Ss1A .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dDdl3NH2Fad3Ss1A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dDdl3NH2Fad3Ss1A .cluster text{fill:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A .cluster span{color:#333;}#mermaid-svg-dDdl3NH2Fad3Ss1A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dDdl3NH2Fad3Ss1A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

婚姻
单身
已婚
离婚

(3)序数属性:离散化或者分区间进行分支
根据指标选择属性:
信息熵:
Entropy=−∑i=0n−1p(i)log2p(i)Entropy=-\sum_{i=0}^{n-1}p(i)log_2p(i)Entropy=−i=0∑n−1​p(i)log2​p(i)
Gini值:
Gini=1−−∑i=0n−1[p(i)]2Gini=1--\sum_{i=0}^{n-1}[p(i)]^2Gini=1−−i=0∑n−1​[p(i)]2
如,label=0label=0label=0的样本有5个,label=1label=1label=1的样本也有5个,则有p(0)=0.5p(0)=0.5p(0)=0.5, p(1)=0.5p(1)=0.5p(1)=0.5,对应的Gini值:Gini=1−∑i=01[p(i)]2=1−[0.52+0.52]=0.5Gini=1-\sum_{i=0}^{1}[p(i)]^2=1-[0.5^2+0.5^2]=0.5Gini=1−i=0∑1​[p(i)]2=1−[0.52+0.52]=0.5
根据属性计算对应的Gini值或者Entropy来选择作为节点的属性,对应值越小的属性越好。分支后的Gini值或Entropy是通过子节点的值加权和得到的,通过属性选择后使得指标变小,上一层节点的对应指标值和下一层的差就称为信息增益(熵值下降或Gini系数降低,意味着纯度上升)。
进一步选取子节点的方案:

  1. ID3
    信息增益=原始熵值−下降后的熵值信息增益=原始熵值-下降后的熵值信息增益=原始熵值−下降后的熵值选取使得信息增益最大的方案
  2. C4.5
    信息增益率=信息增益/自身熵值信息增益率=信息增益/自身熵值信息增益率=信息增益/自身熵值
  3. Gini系数的增益

决策树的评价函数:C(T)=∑t∈leafNtH(t)C(T)=\sum_{t\in leaf}N_tH(t)C(T)=t∈leaf∑​Nt​H(t)其中NtN_tNt​为当前叶子节点样本个数,H(t)H(t)H(t)则表示当前叶子结点的熵值或Gini值。
决策树剪枝:决策树高度过高容易过拟合。
{预剪枝:在构建决策树的过程提前截止后剪枝:决策树构建好后再进行裁剪\begin{cases} 预剪枝:在构建决策树的过程提前截止 \\ 后剪枝:决策树构建好后再进行裁剪 \end{cases}{预剪枝:在构建决策树的过程提前截止后剪枝:决策树构建好后再进行裁剪​
预剪枝方法:指定深度/指定最小样本数
后剪枝方法:
后剪枝损失函数:Cα(T)=C(T)+α∣Tleaf∣C_\alpha (T)=C(T)+\alpha |T_{leaf}|Cα​(T)=C(T)+α∣Tleaf​∣其中α\alphaα表示叶子节点个数对结果的影响程度,TleafT_{leaf}Tleaf​的加入会使得叶子节点数越多,损失就越大。遍历节点,按后剪枝损失函数确定是否进行修剪。

2. 决策树实操

2.1 决策树多分类

import matplotlib.pyplot as plt
import pydotplus
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split# 导入红酒数据集
wine = load_wine()
# 划分成训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)# 实例化分类器
# random_state控制随机性
# 确定最优参数
test_scores = []
for i in range(10):clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=30, splitter='random',max_depth=i+1)clf = clf.fit(Xtrain, Ytrain)score = clf.score(Xtest, Ytest)  # 返回预测的准确度test_scores.append(score)
plt.plot(range(1, 11), test_scores, color='red', label='max_depth')
plt.legend()
plt.show()
print(score)
score1 = clf.score(Xtrain, Ytrain)
print(score1)
import graphvizfeature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类', '花青素','颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']# filled属性是填充颜色
# rounded属性是框的形状
dot_data = tree.export_graphviz(clf, feature_names=feature_name,class_names=['琴酒', '雪莉', '贝尔摩德'],filled=True,rounded=True)# 决策树的可视化
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('1.png')
print([*zip(feature_name, clf.feature_importances_)])

2.2 决策树回归

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
import numpy as np
import matplotlib.pyplot as plt# boston = load_boston()
# # 构建回归树
# regressor = DecisionTreeRegressor(random_state=0)
# # 10次交叉验证
# cross_val_score(regressor, boston.data, boston.target, cv=10,
#                 scoring='neg_mean_squared_error')
# print(cross_val_score)
rng = np.random.RandomState(1)
# (80,1)二维
X = np.sort(5 * rng.rand(80, 1), axis=0)
# ravel()降维函数修改成一维数据
y = np.sin(X).ravel()
# plt.figure()
# plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
# plt.show()
# 在y的数据上加入噪声,每隔5个步长加入噪声
y[::5] += 3 * (0.5 - rng.rand(16))
# plt.figure()
# plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
# plt.show()
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 生成0.0-5.0之间的步长为0.01的有序数列
# [:np.newaxis]用于扩展维度生成shape(n,1)
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
plt.figure()
plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
plt.plot(X_test, y_1, color='cornflowerblue', label='max_depth=2', linewidth=2)
plt.plot(X_test, y_2, color='yellowgreen', label='max_depth=5', linewidth=2)
plt.xlabel('data')
plt.ylabel('target')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()

2.3 决策树调参案例(Tatanic)

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_scoredata = pd.read_csv(r'./titanic/train.csv')
# print(data.head()) # 展示前多少行
# print(data.info()) # 展示整个表# 数据预处理
# 筛选特征,删除缺失值过多的特征,以及和幸存与否无关的特征,对列进行操作(列)
data.drop(['Cabin', 'Name', 'Ticket'], inplace=True, axis=1)
# data = data.drop(['Cabin', 'Name', 'Ticket'], inplace=False, axis=1)# 处理缺失值(均值或中值)
data['Age'] = data['Age'].fillna(data['Age'].mean())# 对于缺失比较小的样本直接删掉(行)
data = data.dropna()# 查看Embarked属性有多少取值,转换非数值的特征,映射到数值取值(分类之间相互独立)
# S\C\Q三种,并转换成列表对应index:0\1\2
labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x))# 性别转换成二分类,将bool值转换成0-1
# loc为标签索引,数字索引对应iloc
data.loc[:, 'Sex'] = (data['Sex'] == 'male').astype(int)# 将标签和特征分离
# 除了survive列之外的列
x = data.iloc[:, data.columns != 'Survived']
y = data.iloc[:, data.columns == 'Survived']Xtrian, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.3)
# 恢复索引,恢复成正序,避免索引发生混乱
for i in [Xtrian, Xtest, Ytrain, Ytest]:i.index = range(i.shape[0])# clf = DecisionTreeClassifier(random_state=25)
# clf = clf.fit(Xtrian, Ytrain)
# # score = clf.score(Xtest, Ytest)
# score = cross_val_score(clf, x, y, cv=10).mean()
# print(score)
# tr = []
# te = []
# for i in range(10):
#     clf = DecisionTreeClassifier(random_state=25,
#                                  max_depth=i+1,
#                                  criterion='entropy')
#     clf = clf.fit(Xtrian, Ytrain)
#     score_tr = clf.score(Xtrian, Ytrain)
#     score_te = cross_val_score(clf, x, y, cv=10).mean()
#     tr.append(score_tr)
#     te.append(score_te)
#
# print(max(te))
# plt.plot(range(1, 11), tr, color='red', label='train')
# plt.plot(range(1, 11), te, color='blue', label='test')
# plt.xticks(range(1, 11))
# plt.legend()
# plt.show()# 网格搜索调整多个参数,枚举技术,计算量很大
# 一串参数及其对应的取值范围的字典
import numpy as np
gini_thresholds = np.linspace(0, 0.5, 50)
# entrop[y_thresholds = np.linspace(0, 1, 50)
# 一般一两个参数组合,分别进行调试
# 过多的参数组合,会导致分数无法舍弃,得到的是平均的调参结果
parameters = {'criterion': ('gini', 'entropy'), 'splitter': ('best', 'random'), 'max_depth': [*range(1, 10)], 'min_samples_leaf': [*range(1, 50, 5)], 'min_impurity_decrease': [*np.linspace(0, 0.5, 20)]
}clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)
GS.fit(Xtrian, Ytrain)
GS.best_params_  # 返回输入的参数列表的最佳组合
GS.best_score_  # 网格搜索后的模型评判标准

机器学习之决策树(Decision Tree)相关推荐

  1. 机器学习(五)决策树(decision tree)

    决策树(decision tree)(一)--构造决策树方法 决策树算法起源于E.B.Hunt等人于1966年发表的论文"experiments in Induction",但真正 ...

  2. 机器学习:决策树(Decision Tree)介绍

    简介 决策树是一种常见的机器学习算法,它的实现方式类似于我们平时利用多个不同权重选择做决策的过程.以下介绍一个现实生活中的例子. 当父母给自己的女儿介绍对象时,女儿往往会根据对方的年龄.富贵.高矮.美 ...

  3. 机器学习笔记——决策树(Decision Tree)(1)

    决策树 1.引入   1.1定义 决策树,顾名思义,就是帮我们做出决策的树.现实生活中我们往往会遇到各种各样的抉择,把我们的决策过程整理一下,就可以发现,该过程实际上就是一个树的模型.比如相亲的时候: ...

  4. 机器学习:决策树(Decision Tree)--ID3算法

    决策树的主要算法 构建决策树的关键:按照什么样的次序来选择变量(属性/特征)作为分类依据. 根据不同的目标函数,建立决策树主要有以下三种算法 ID3(J.Ross Quinlan-1975) 核心:信 ...

  5. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...

  6. [机器学习笔记] (四)决策树 Decision Tree

    (四)决策树 Decision Tree 基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性 ...

  7. 【机器学习实验二】决策树(Decision Tree)及其在图像识别任务上的应用

    经典有监督学习算法:决策树(Decision Tree) --本篇博客的决策树算法以及实验仅针对分类问题 文章目录 经典有监督学习算法:决策树(Decision Tree) 1.算法简介 2.算法思想 ...

  8. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  9. 决策树分类python代码_分类算法-决策树 Decision Tree

    决策树(Decision Tree)是一个非参数的监督式学习方法,决策树又称为判定树,是运用于分类的一种树结构,其中的每个内部节点代表对某一属性的一次测试,每条边代表一个测试结果,叶节点代表某个类或类 ...

  10. Python数据挖掘入门与实践 第三章 用决策树预测获胜球队(一)pandas的数据预处理与决策树(Decision tree)

    作为一个NBA球迷,看到这一章还是挺激动的. 不过内容有点难,研究了半天... 要是赌球的,用这章的预测+凯利公式,是不是就能提升赢钱概率了? 数据预处理 回归书本内容,既然要分析,首先需要有数据: ...

最新文章

  1. 小学五年级计算机备考方案,小学五年级备考方案(2)
  2. OpenCV极变换polar transforms的实例(附完整代码)
  3. 参数binlog_rows_query_log_events和binlog_row_image 与用 binlog恢复数据
  4. 在阿里云的Ubuntu ECS instance 使用Apt-get安装git
  5. 工作108:精准的v-for和if
  6. protobuf3 自定义option_ProtoBuf3语法指南(Protocol Buffers)_下
  7. 《Linux指令从入门到精通》——4.4 Linux下的文本编辑指令
  8. Win7 安装.Net 4.7.2 失败
  9. 正则表达式数字、字母、中文、符号
  10. matlab插图放大模糊,PPT中怎样简单处理放大后失真的图片
  11. Apache Spark源码阅读环境搭建
  12. ipad无法更新最新版本ipadOS 16、不再连接到互联网解决方法
  13. 基于服务树的动态资源管理方法
  14. 简单方法保持屏幕常亮
  15. Fluent学习笔记
  16. 前端权限设计实现——按钮级
  17. 【对讲机的那点事】如何利用写频软件预置海能达数字对讲机的加密功能
  18. 2022年的云革命:云转移、云模型和云未来
  19. 二分与贪心-誊写书籍(算法基础 第9周)
  20. 如何有趣地「做人」?Cocos 即将推出虚拟角色编辑器

热门文章

  1. 【百金轻】:雄关漫道真如铁,而今迈步从头越。
  2. 在Chrome、Firefox等高版本浏览器中实现低延迟播放海康、大华RTSP
  3. 学习python第一天
  4. Ghost还原出错An internal inconsistency has been detected
  5. CentOS 7系统安装Ghost
  6. 线代 | 【行列式及矩阵】基本知识
  7. 【SugerTangYL】UART串口通信 Verilog
  8. HTML元素居中定位与尺寸拉伸
  9. oppo锁频段_OPPO手机这样设置,让你的网络更加稳定!
  10. 浅析wifidog认证流程以及数据交互格式