有监督学习——决策树、集成学习

1. 决策树

在热力学中,熵(entropy)被用来衡量系统的不稳定程度。香农在论文《通信的数学原理》中提出信息熵的概念,目的是_量化数字信息的价值_。

信息熵的定义

香农提出的量化信息方式:

\[H(P_1,P_2,\cdots P_n)=-\sum^n_{i=1}P_i\cdot\log(P_i) \]

其中:\(P_1,P_2\cdots P_n\)是随机事件每种可能结果的发生概率,因此\(P_1+P_2+\cdots+P_n=1\),熵\(H()\)的结果是一个大于等于零的值。熵越高,信息的不确定性越大,那么这条信息结果的价值越大。

e.g. 现在有三条来自未来的消息,哪条消息更高?

  1. 一枚均匀硬币的投掷结果。
  2. 一颗均匀骰子的投掷结果。
  3. 一颗不均匀骰子的投掷结果(其中一面概率为0.9,其他的概率均为0.02)。

分别计算:

均匀硬币每面的概率为0.5,\(H=-[0.5\times\log_2(0.5)+0.5\times\log_2(0.5)]=1\)

均匀骰子每面的概率是\(\frac{1}{6}\),\(H=-\frac{1}{6}\times\log_2(\frac{1}{6}) \times6\approx2.59\)

不均匀骰子的信息熵:\(H=-[\frac{9}{10}\times\log_2(\frac{9}{10})+\frac{1}{20}\times\log_2(\frac{1}{20})\times 5]\approx 1.22\)

总结下:

  • 随机事件结果种类越多,该事件的熵越大。
  • 随机事件各种可能发生的结果概率越均匀,则事件熵越大(以事件3为例,即使无人告诉,也容易猜到发生的是概率大的事件)。
基尼指数(Gini index)

信息熵的\(\log\)计算在CPU中较为耗时,因此使用另一个衡量信息价值的指标——基尼指数:

\[G(P_1,P_2,\cdots P_n)=1-\sumn_{i=1}P2_i \]

该公式值域\([0,1]\),数值越大表示事件越无序。衡量信息能力略逊于信息熵、但计算完全由乘法和加法组成。

建树策略

决策树的训练是一个利用已有样本从根开始逐步挑选并建树的过程。

例如最开始是寻找一个特征作为根节点,而选择的依据是在用该特征进行数据划分后得到的信息增益最大。

在用某个特征将数据集划分到不同的子树后,所有子树的信息价值(熵/基尼指数)的和必定小于等于原来整体数据集的信息价值,信息增益用来衡量减少的程度。

设有建树函数build(),则递归训练决策树的算法思想:

def build(D=数据集,):if D中所有数据目标值y都相同:    # 本数据集可以作为叶子节点return      for  i in D中所有特征:计算用i划分子树后获得的信息增益if 所有的特征都没有大于0的信息增益: # 已经无法再分returnx(被选择的特征) = 具有最大信息增益的特征for sub in 按照x划分子树后的数据集: # 递归寻找下一个决策树build(sub) 

上述算法思想还有诸多细节:

  • 信息增益如果直接用划分前后的熵差计算,则会导致倾向于分类取值较多的特征(对比掷硬币和掷骰子)。
  • 连续值类型的特征如何计算?
  • 强制要求每个叶子节点只有一个目标值容易导致预测过拟合,如何适当归并叶子节点(剪枝,prune)?
  • 决策树如何处理回归问题?

根据这些问题,决策树衍生了不少的算法,下面为几种影响较大的算法:

  • ID3: 只使用熵的信息增益处理离散特征的分类问题。

  • C4.5:

    使用信息增益比的概念去除先选择多值特征的倾向;

    支持连续特征,在计算信息增益比之前首先将其离散化;

    在训练后检测训练集的正确分类比,并剪枝产生错误较多的叶子结点。

  • CART算法:

    使用基尼系数代替熵进行信息增益计算;

    只使用二叉树;

    提供解决回归问题的能力。

综上,CART比另外两种算法更能适应更多场景。

Python中的 DecisionTreeClassifier 与 DecisionTreeRegressor

scikit-learnsklearn.tree包中实现了CART模型,分别用DecisionTreeClassifierDecisionTreeRegressor实现了分类树和回归树。它们的使用方法与其他模型类似。

以下为一些主要的模型初始化参数:

参数介绍
criterion取值ginientropy,即使用基尼指数还是熵计算信息增益
max_depth树的最大深度
min_sample_split继续分裂一个结点最少需要的训练样本数
max_leaf_nodes叶子结点的最大总数
min_impurity_decrease用于计算叶子结点的最小纯度(即不同目标值样本之间的比值)
from sklearn.tree import DecisionTreeClassifier # 从tree包引入# 定义训练数据集
X = [[20, 30000, 400], [37, 13000, 0], [50, 26000, 0], [28, 10000, 3000],[31, 19000, 1500000], [47, 7000, 6000]
]
Y = [1, 0, 0, 0, 1, 0]# 初始化熵模型训练对象
clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(X=X, y=Y)   # 训练
print(clf.predict([[40, 6000, 0]])) # 预测  
# [0]
clf.feature_importances_    # 查看特征重要性
# array([0.5, 0.5, 0. ])

可以使用pygraphviz来对决策树进行可视化:

原书是用graphviz,但笔者进行安装后无法使用,原因是:libexpat.dll找不到,几经波折后找到解决方法。
遂采用更多人推荐的pygraphviz,但在第一次使用过程中也遇到了错误:不支持pngpdf等格式图片,但也同样在网上找到了解决方法。

更多关于pygraphviz的绘画可查看官方文档

import pygraphviz as pgv
import sklearn.tree as tree
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=['age', 'income', 'deposit'],class_names=['normal', 'VIP'],filled=True, rotate=True)
graph = pgv.AGraph(dot_data)
graph.draw("mytree.png", prog='dot')  # 保存成文件

2. 集成学习

集成学习(Ensemble Learning)模型与其他有监督模型的出发点不同:之前介绍的都是模型在给定的训练集上构建算法进行数据拟合;而集成学习着重考虑数据集,将数据集划分为各种子集或权重变换后用较弱的基模型拟合,再综合若干个基模型的预测作为最终整体结果。

scikit-learn中包括了两类集成学习算法:

  1. Bagging Method: 若干个基模型在若干个训练子集上进行互相独立的分别训练,在预测时一次性综合这些基模型的结果。
  2. Boosting Method: 按迭代的顺序逐个训练基模型,在每次训练后进行模型预测,并根据测试结果调整下一轮基模型训练时所采用的模型数据,最后预测时仍然使用所有子模型的预测结果得到最终结果。

偏差与方差

有监督学习可以可以将目标归结为对两种系统错误的最小化——偏差(bias)和方差(variance)。

对于一个训练好的模型:\(\hat{f}()\)。

在测试集中测试得到多个错误值:\(Error=\hat{f}(x)-y\),其中\(x\)是测试数据特征,\(y\)是测试数据真实目标值。

如果采用高斯分布拟合这些错误值,最终找到参数\(u\)和\(\sigma^2\),使得\(Error\sim N(u,\sigma2)\),其中错误期望参数\(u\)可以理解为偏差(bias),\(\sigma2\)是方差(variance)。

与拟合程度的关系

根据有监督学习预测效果的表现,可发现:偏差对应的是欠拟合(Underfitting);方差对应的是过拟合(Overfitting)。

“偏差越大,欠拟合越严重”容易理解。但怎么理解高方差对应的过拟合?因为方差高意味着:模型对训练数据中的小波动过于敏感,并且可能不能很好地推广到新的数据。
大部分情况下,欠拟合与过拟合不可很好地同时解决,因此各种学习模型和超参数的调整都是调节两者的平衡点。

集成学习意图

对比之前模型的“单独”,集成学习综合各若模型结果,可以学习到若干个这样的错误分布:

\[\begin{cases} Error_1\sim N(u_1,\sigma_1^2) \\ Error_2\sim N(u_2,\sigma_2^2) \\ Error_3\sim N(u_3,\sigma_3^2) \\ \cdots \end{cases} \]

弱模型通常有拟合不足的问题,即绝对值较大的偏差、较低或一般的方差。在综合各模型的结果可看成错误高斯分布求平均值过程:

\[Error\sim N(\frac{u_1+u_2+\cdots+u_n}{N},\frac{\sigma_12+\sigma_22+\cdots+\sigma_n^2}{N}) \]

其中,其中\(N\)是弱模型的数量。

由于偏差的符号有正有负,因此若干个模型的偏差均值可以将绝对值降低;对于方差,弱模型的方差并不高,因此综合后仍在较低水平。

随机森林

随机森林(Random Forrest)是Bagging Method的典型代表,是使用决策树作为基模型的集成学习方法。

集成框架

随机森林在训练过程中进行随机抽样,分别进行训练后形成若干个小的决策树。对于分类问题,通过这些基决策树投票完成;对于回归问题,通过基决策树结果求平均完成。

随机森林模型中的决策树一般采用有较大偏差和较小方差的“弱模型”,对比普通决策树,具体在以下方面:

  • 样本裁剪:通过随机采样每个弱模型只训练部分样本数据。
  • 特征采样:每个基模型的决策树只选用数据特征中的一部分进行训练和预测,随机抽样保证了所有特征都能被部分弱模型学习到。
  • 小树:特征和样本数量的原因,导致弱模型的决策树高度不高,因此不需要像一般决策树那样过拟合和剪枝。
有放回采样

有放回采样(bootstrap)是指每次抽取一个样本放入子集后,将样本仍保留在被采样空间,使它仍可能再次被采样到。这样能生成与训练样本整体不同的数据分布,等于扩充了训练样本空间,因此通过bootstrap采样能狗训练出适应性更强的模型。

Out-of-Bag Estimation

Out-of-Bag Estimation简称OOB,它是指基模型评估预测的数据只采用训练集之外的数据。

RandomForestClassifier和RandomForestRegressor

sklearn.ensemble包中提供了随机森林模型RandomForestClassifierRandomForestRegressor,使用方式与其他模型相似。在模型参数方面,决策树作为基模型,因此在模型初始化过程中保留了所有决策树模型(DecisionTreeClassifier/DecisionTreeRegressor)相关参数。此外还提供抽样方式和OOB评估的配置参数:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()  # 导入iris数据库clf = RandomForestClassifier(n_estimators=20, bootstrap=True, oob_score=True)
clf.fit(iris.data, iris.target) # 训练clf.oob_score_  # 在初始化指定oob_score=True才能访问
# 0.96
参数解释
n_estimators定义基模型数量
bootstrap=True使用有放回采样
oob_scare=True指定在训练后进行OOB测试,训练后的oob_score_属性表示准确性评估

自适应增强

自适应增强(Adaptive Boosting,或称AdaBoost)是Boosting Method典型代表。Boosting Method类算法不是通过随机抽样产生每个基模型的训练集,而是通过训练集中每个样本的权重使得每次迭代在不同的训练集上运行

算法原理

在AdaBoost的每次迭代中都使用了全部训练样本,但训练样本中的每个样本都被赋予了权值,因此基模型必须支持基于样本权值的学习方法。

基于样本权值训练是指建立模型时,更关注匹配权值高的样本,常见的如支持向量机、朴素贝叶斯等。

第一次迭代时,训练集中的每个样本将被赋予相同的权值,经过训练和评估后AdaBoost会更新训练集中的样本,被预测正确的样本权值减少,被预测错误的样本权值增加。如此往复。

基模型是随着迭代增加逐步进化的,因此,在最终决策后生成的基模型往往比之前的基模型决策权更大。与Bagging Method相比,最终的预测结果采用基模型间的“加权”投票/平均。

AdaBoostClassifier和AdaBoostRegressor

sklearn.ensemble中提供了AdaBoostClassifierAdaBoostRegressor分别用于AdaBoost的分类和回归问题。以下为几个它们独特的初始化参数:

参数介绍
base_estimator基模型,默认为决策树,也可选为贝叶斯
n_estimators迭代次数,默认为50
learning_rate学习率,取值0~1,用于控制最终决策时各基模型的权重,该值越大,后产生的基模型所占模型权重越大
algorithm提升算法,可选择SAMME或SAMME.R,该算法用于定义在每次迭代后如何更新训练样本权重。SAMME按照分类错误率更新权重;SAMME.R按照预测概率更新权重。

由于SAMME只适用于离散问题,因此algorithm仅存在于AdaBoostClassifier的初始化参数中,而AdaBoostRegressor默认使用SAMME.R算法。

score()评估函数

AdaBoost使用全部的数据进行训练,因此没有OOB评估,只能使用测试集在训练后评估。scikit-learn对大多数监督学习模型都提供了score()函数,用于评估测试集的预测准确率,输入测试数据,输出<=1的评估值表示准确率。

from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier # 导入模型类
iris = load_iris()from sklearn.utils import shuffle
X, Y = shuffle(iris.data, iris.target)  # 对数据进行随即洗牌# 初始化以GaussianNB作为基模型的AdaBoost分类器
from sklearn.naive_bayes import GaussianNB
clf = AdaBoostClassifier(GaussianNB())
clf.fit(X[:-20], Y[:-20])   # 训练
clf.score(X[-20:], Y[-20:]) #评估
# 0.95

scikit-learn中还实现了其他ensemble模型,包括GradientBoosting、Voting等。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达机器学习作业ex3:多类分类和前馈神经网络(Python实现)详细注释

文章目录 1 多类分类1.1数据集1.2 数据可视化1.3 向量化逻辑回归1.3.1 向量化代价函数1.3.2 矢量化梯度下降以及正则化表达1.4 一对多分类 2.神经网络2.1模型表示 总结&#xff08;自己训练求解参数全流程&#xff09; 1 多类分类 在本练习中&#xff0c;您将使用逻辑回归和神…

Redis学习|Jedis、SpringBoot整合Redis

Jedis 我们要使用Java 来操作 Redis,知其然并知其所以然&#xff0c;授人以渔!学习不能急躁&#xff0c;慢慢来会很快!什么是Jedis 是 Redis 官方推荐的java连接开发工具!使用java 操作Redis 中间件!如果你要使用 java操作redis&#xff0c;那么一定要对Jedis 十分的熟悉! 1、…

MySQL之复制(五)

复制 复制的原理 复制文件 3.master.info 这个文件用于保存备库连接到主库所需要的信息&#xff0c;格式为纯文本(每行一个值)&#xff0c;不同的MySQL版本&#xff0c;其记录的信息也可能不同。此文件不能删除&#xff0c;否则备库在重启后无法连接到主库。这个文件以文本的…

电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法

在数字化时代&#xff0c;多媒体文件的处理已经成为我们日常生活和工作中不可或缺的一部分。在计算机使用过程中&#xff0c;丢失ffmpeg.dll文件是一个特定但常见的问题&#xff0c;尤其是对于那些经常处理视频编解码任务的用户来说。下面小编讲全面分析ffmpeg.dll丢失原因以及…

Python数据分析与建模库之从入门到四大库(Numpy、Pandas、Matplotl、Seaborn )教学课程下载

第一阶段课程-Python快速入门&#xff1a; 含&#xff1a;1.系列课程环境配置&#xff1b;2.Python快速入门&#xff1b;3.变量类型&#xff1b;4.LIST基础&#xff1b;5.List索引&#xff1b;6.循环结构&#xff1b;7.判断结构&#xff1b;8.字典&#xff1b;9.文件处理&#…

哪些好用的AI绘画生成软件?建议你试试这四款

哪些好用的AI绘画生成软件&#xff1f;随着人工智能技术的飞速发展&#xff0c;AI绘画生成软件逐渐走入大众的视野&#xff0c;为艺术创作领域带来了革命性的变革。今天&#xff0c;就让我们一起探索四款备受推崇的AI绘画生成软件&#xff0c;看看它们如何以独特的魅力&#xf…

202483读书笔记|《牵牛花浮世无篱笆:千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊,单恋

202483读书笔记|《牵牛花浮世无篱笆&#xff1a;千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊&#xff0c;单恋 春之句夏之句秋之句冬之句 历史读过的俳句列表: 202318读书笔记|《芭蕉芜村一茶&#xff1a;俳句三圣新译300》——樱花——让一整个春夜亮起来&#xff0…

目标检测讲解

环境准备 pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple图片读取&画框 from skimage import io import matplotlib.pyplot as plt import matplotlib.patches as mpss io.imread(dogs.jpg)_, ax plt.subplots(ncols1, nrows1, figsize(6, 6))…

零编程数据可视化展示:十个简易案例!

数据可视化是呈现数据内在价值的最终手段。数据可视化实例利用各种图表和图形设计手段&#xff0c;合乎逻辑地展示复杂而不直观的数据。为了让用户直观清楚地了解他们想要的数据及其比较关系&#xff0c;数据可视化实例的呈现至关重要。即时设计整理了10个数据可视化实例&#…

C语言练习01-循环

一、打印五行五列的三角形 如下图&#xff1a; #include<stdio.h>int main() {for (int i 1;i < 5; i){for (int j i; j < 5; j){printf("*");}printf("\n");}return 0; }#include<stdio.h>int main() {for (int i 1;i < 5; i){f…

Java 开发面试题精选:RocketMQ 一篇全搞定

前言 RocketMQ作为一个高性能、高可用的分布式消息和流处理平台&#xff0c;广泛应用于分布式系统中的解耦、异步通信和数据流处理场景。这篇文章我精选了一些关于RockerMQ面试题目&#xff0c;这些问题涵盖了RocketMQ的所有关键知识点&#xff0c;从基本概念到高级应用&#…

leetcode21 合并两个有序单链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示例…

压缩pdf文件大小,如何压缩pdf

压缩PDF文件是现代办公中常见的需求&#xff0c;因为PDF文件往往包含了大量的图片、文本和格式信息&#xff0c;导致文件体积较大&#xff0c;不利于传输和存储。本文将详细介绍如何压缩PDF文件&#xff0c;我们一起来看一下。 浏览器打开 "轻云处理pdf官网" &#x…

Go 1.19.4 字符串-Day 06

1. 编码表 计算机中只有数字&#xff08;0和1&#xff09;&#xff0c;如果有一个字符串&#xff08;字符串由字符组成&#xff09;要存储&#xff0c;在内存中该如何表达这个字符串&#xff1f; 那么所有的字符都必须数字化&#xff0c;也就是一个字符对应一个特定的数字&…

js文件导出功能

效果图&#xff1a; 代码示例&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>html 表格导出道</title><script src"js/jquery-3.6.3.js"></script><st…

18个机器学习核心算法模型总结

最强总结&#xff01;18个机器学习核心算法模型&#xff01;&#xff01; 大家好~ 在学习机器学习之后&#xff0c;你认为最重要的算法模型有哪些&#xff1f; 今儿的内容涉及到~ 线性回归逻辑回归决策树支持向量机朴素贝叶斯K近邻算法聚类算法神经网络集成方法降维算法主成…

LabVIEW版本、硬件驱动和Windows版本之间兼容性

在LabVIEW应用开发和部署过程中&#xff0c;确保LabVIEW版本、硬件驱动和Windows版本之间的一致性和兼容性至关重要。这不仅影响程序的稳定性和性能&#xff0c;还关系到项目的成功实施。本文从多角度详细分析这些因素之间的兼容性问题&#xff0c;并提供相关建议。 兼容性考虑…

【尚庭公寓SpringBoot + Vue 项目实战】登录管理(十八)

【尚庭公寓SpringBoot Vue 项目实战】登录管理&#xff08;十八&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】登录管理&#xff08;十八&#xff09;1、登录业务介绍2、接口开发2.1、获取图形验证码2.2、登录接口2.3、获取登录用户个人信息 1、登录业务介绍 登…

SpringCloud Netflix和SpringCloud Alibaba核心组件

1.SpringCloud Netflix组件 1.1 Netflix Eureka-服务注册发现 Eureka 是一种用于服务发现 的组件&#xff0c;它是一个基于 REST 的服务&#xff0c;用于定位运行在 AWS 弹性计算云&#xff08;EC2&#xff09;中的中间层服务&#xff0c;以便它们可以相互通讯。 注册&#xf…

day14-226.翻转二叉树+101. 对称二叉树+104.二叉树的最大深度

一、226.翻转二叉树 题目链接&#xff1a;https://leetcode.cn/problems/invert-binary-tree/ 文章讲解&#xff1a;https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 视频讲解&#xff1…