百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

机器学习(二)常用回归算法归纳(全网之最)!错过损失一个亿!

connygpt 2024-12-20 11:47 3 浏览

文章目录

  • 前言
  • SVR
  • CART树
  • 随机森林
  • GBDT
  • boosting思想
  • AdaBoost思想
  • 提升树 & 梯度提升
  • GBDT
  • 面试题整理
  • XGBOOST
  • 面试题整理

前言

如果需要获取到这个【机器学习-常用回归算法归纳更全面的文档的话帮忙转发、转发、转发一下然后再关注我私信回复“学习”得到获取方式吧!

内容太多,关注小编持续更新哟~


SVR

和回归问题一样,我们都是通过训练样本 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } , y i ∈ R ,想要学到我们的回归模型 f ( x ) = w T x + b,使得 f ( x ) 与 y 近可能接近。

和SVM原理基本一致,SVR也是要找出一个超平面,使得所有数据到这个超平面的距离最小。对样本 ( x , y ) ,传统回归模型通常是直接基于模型输出 f ( x ) 与 真实 y 之间的差别来计算损失。当且仅当 f ( x ) = = y 的时候损失才为0。SVR与此不同,它假设我们能容忍 f ( x )与 y之间最多有 ? \epsilon? 的偏差。当且仅当 f ( x ) 与 y之间的差别绝对值大于 ? \epsilon? 时才计算损失。如下图所示,这相当于以超平面 f ( x )为中心,构建了一个宽度为 2 ? 2 \epsilon2? 的间隔带,若训练样本落入此间隔带,则认为是被预测正确的。


CART树

CART树介绍

? 在决策树的几个算法中,只有CART树既能做回归又能做分类,并且既能处理连续值又能处理离散值。其核心思想与ID3和C4.5相同,主要的不同处在于CART在每一个节点上都采用二分法,即每个节点都只能有两个子节点,最后构成的是二叉树,所以CART树通常是集成学习树模型的默认基分类器。回归问题中,目标值是连续的,所以CART树最后输出的是划分到叶子节点的训练样本的标签的均值。

回归树的数学表示

一个回归树对应着一个特征空间的一个划分及在划分单元上的是输出值,说白了就是对应着一个左右子树的划分和在叶子结点的预测值。假设已输入特征空间划分为 M 各单元 R 1 、 R 2 … R m ,并且在每个单元 R m上有一个固定的输出类别 C m,这就是以上回归树的数学表示。

  • I属于叶子节点是1,不属于叶子节点是0
  • Cm向量和 I II 向量 做内积,权当是一个映射

损失函数

很多书上的公式都给的是SSE,实际sklearn的底层用的是MSE,因为实际上是要除m的,否则会我们计算的会很大。

根据误差平方和最小的原则来寻找最优分裂特征和最优分裂点

优化函数(分裂过程)

  • j 和 s 分别表示最优切分变量和最优切分点。
  • 上述公式表示:样本低 j个特征,根据切分点 s ,划分为左右子树。分别求左右子树的SSE,加总就是第 j 个特征的第 s 分割点的SSE。求最小的SSE,这个特征和分割点就是我们要找的最优特征和最优分割点。

白化分裂过程

? 我们对于每个特征,将特征值排序,计算特征值两两间的均值作为分割点。小于分割点的去左子树,大于分割点的去右子树。即m个特征,m-1个分隔点。遍历每个特征,再遍历每个分割点。计算以每个分隔点划分的左右子树的SSE。SSE最小的特征和分割点作为最优特征和最优分裂点。

伪代码表示如下:

  1. for j in 特征:
  2. for s in 分隔点:
  3. Loss = 左子树SSE + 右子树SSE
  4. dict[(j,s)] = Loss


剪枝

? 经过算法构建的决策树非常详细,并且分叉可能会多,深度也可能很深,也就是说对于每个特征都被详细的加以考虑,最终叶子节点的训练样本都是纯的,很容易过拟合。并且树模型越复杂,过拟合程度会越高,为了提高决策树的泛化能力,我们采用剪枝来防止过拟合。

预剪枝

  • 预剪枝本质就是早停止。
  • 在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分。如果可以就继续递归生成节点。

后剪枝

  • 本质就是通过衡量剪枝后损失函数变化来决定是否剪枝。
  • 后剪枝是先从训练集生成一颗完整的决策树。然后自底向上地对非叶子结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。

两种剪枝的对比

  • 后剪枝决策树通常比预剪枝决策树保留了更多的分支。
  • 后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝。
  • 后剪枝训练时间开销比未剪枝和预剪枝的都要大。
  • 常用后剪枝。


随机森林

百度百科

? 在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。

bagging思想

? 随机森林是基分类器为决策树的bagging算法,bagging是集成学习的思想之一。bagging思想首先是采用M轮的bootstrap自助采样,每轮采样对应训练一个弱分类器,并且训练的时候是并行计算的,最后将这M个弱分类器进行组合来实现预测的。由于自助采样,所以bagging是通过样本扰动的方式来增加基分类器的差异性,差异性越大,集成效果越好。因此bagging的基学习器应为对训练样本扰动敏感的算法,这就是bagging思想。

受样本扰动敏感:LR、NN、决策树

白话原理

? 随机森林在bagging样本随机的基础上,增加了特征随机。默认的基分类器就是CART树。它相比于单颗决策树,RF的预测结果更加准确,并且可以输出特征的重要性排序。因为要保证若分类器之间的差异性,所以随机森林的每个弱分类器都不需要剪枝。由于两个随机的思想,即使不剪枝也不容易发生过拟合。由于并行训练和特征随机所以RF的训练速度要比决策树快。RF的构建流程大致分为这几步:

1.根据自助采样抽取M个样本集。每个样本集从原来的N个训练样本中有放回的随机抽取N个样本。未被抽取到的36.8%的样本组成袋外数据用于测试。

2.从候选特征中随机的无放回的抽取K个特征。

3.用每个样本集和特征集并行的构建弱分类器。

4.这样M个样本集一共训练出M课决策树,组成随机森林。

  • 如果是分类问题,则各个弱分类器以投票的方式决定预测结果,最终输出类别就是得票最多的。
  • 如果是回归问题,则最终预测值就是各个弱分类器输出值的算术平均。

RF比较适用于可解释性要求不高,准去率要求较高的场合。其实当森林中决策树很多时,虽然是并行训练,它的训练时间也挺大。

为什么随机抽样?

  • 保证基分类器的多样性,若每棵树的样本集都一样,那训练的每棵决策树都是一样的。

为什么要有放回的抽样?

  • 保证样本集间有重叠,若不放回,每个训练样本集及其分布都不一样,可能导致训练的各决策树差异性很大,最终多数表决无法 “求同”。

为什么不用全样本训练?

  • 全样本忽视了局部样本的规律,不利于模型泛化能力。

为什么要随机特征?

  • 随机特征保证基分类器的多样性(差异性),最终集成的泛化性能可通过个体学习器之间的差异度而进一步提升,从而提高泛化能力和抗噪能力。

RF为什么比bagging效率高?

  • bagging无随机特征,使得训练决策树时效率更低。

为什么自助采样会有36.8%的概率没有被采样到?


GBDT

boosting思想

? Boosting一族是可将弱学习器提升为强学习器的算法,它的思想就是每一个基分类器纠正前一个基分类器的错误,至于纠正的方式不同所以有不同的boosting算法。算法思想如下:

  • 先从训练集训练出一个基学习器。
  • 再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到较大的关注。
  • 然后基于调整后的样本分布来训练下一个基学习器。
  • 如此重复进行,直到基学习器数目达到指定的阈值T位置。
  • 再将这T个基学习器进行加权结合得到强集成学习器。

AdaBoost思想

  • 在boosting思想的基础上,adaboost思想如下:
  • 初始化训练集权重,从初始训练集里训练得到一个基学习器
  • 增加错分样本的权重,减少分对样本的权重
  • 增加错误率小的基学习器的权重,减少错误率大的基学习器的权重
  • 用调整后的(样本权重归一化)样本训练下一个基学习器
  • 直到基学习器的数目达到实现指定的值
  • 然后将这几个基学习器加权进行投票

提升树 & 梯度提升

? 提升树其实就是加法模型,它每一步产生一个弱学习器,并加权累加到总模型中。如果每一步的弱学习器生成都是依据损失函数的负梯度方向,则称之为梯度提升。在GBDT中,提升树在构建树的每一步过程中,都去拟合上一步获得模型在训练集的残差,这个残差正好是损失函数的负梯度方向。也就是提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。分类问题时,提升树其实就是基学习器为CART分类树的adaboost。回归问题时,提升树是基学习器为CART回归树的adaboost。


GBDT

严格意义来讲,做回归时称为GBRT,做分类时称为GBDT。以下统称为GBDT。

白话原理

? GBDT全称是梯度提升决策树,是boosting家族的一员,它的叫法有很多,如TreeLink、GBRT、TreeNet。其实本质就是加法模型,通过多棵树的累加和不断的减小训练过程产生的残差来达到预测的目的。

拆开来看,它分为GB和DT

  • GB(Grandient Boosting):梯度提升的意思:梯度提升是指对损失函数求导,损失函数的负梯度方向就是近似残差,每轮的CART树拟合上一次的残差,通过梯度下降使残差越来越小。
  • DT(Decision tree):决策树:默认的基分类器是CART回归树。因为每次迭代要拟合的是梯度值,也就是连续值,而且最后累加所有树的预测结果作为最终结果,分类树的结果没有办法累加,所以要用回归树。

GBDT是建立在提升树的思想基础上,即每次迭代都学习一棵CART树来拟合前t-1棵树在训练集上的残差。

拟合残差就是逐步逼近的过程,数学角度来讲本质就是对损失函数一阶泰勒展开。泰勒公式逼近任何一个多项式,求它的近似值。

对于GBDT而言,这个残差正好是损失函数的负梯度,要让损失函数(均方误差)最小,就要在负梯度的方向上进行梯度下降。说的再直白一点,GBDT的每个基分类器都是对残差进行预测,每一次的计算都是为了减少上一次的残差,所以为了消除残差,在残差减小的梯度方向上建立模型进行梯度下降,这与传统的Boosting中关注样本和基分类器的权重有着很大的区别。所以GBDT的构建步骤可以分为两步,首先就是根据损失函数计算残差,然后就是训练回归树拟合残差。

GBDT里也用了学习率,是Shrinkage的一个思想,如果每棵树的结果直接全部加起来很容易一步学到位导致过拟合,所以基于Shrinkage的思想,为每棵树设置了一个权重,累加的时候要乘上这个权重,主要是为了削弱每棵树的影响,让后面有更大的学习空间。所以将每棵回归树对应的结果乘学习率(第一棵树不乘),加总就是最终预测值。

关键点就是利用损失函数的负梯度去拟合残差,对于损失函数求一阶导数

GBDT对弱分类器的要求一般是低方差和高偏差的,因为训练过程是通过不断降低偏差(残差)来提高分类器的精度


面试题整理

优缺点 & 适用场景

  • 优点:GBDT基于树模型,继承了树模型的优点 [对异常点鲁棒、不相关的特征(即非线性特征)干扰性低(LR需要加正则)、可以很好地处理缺失值,处理高维数据] ,同时又避免了决策树易出现过拟合的现象。
  • 缺点:基分类器间相互依赖,难以并行训练。
  • 如果其它线性模型拟合的效果不好,可以用GBDT,对于回归而言,可以尝试Huber损失的GBDT。

梯度提升,梯度体现在哪?

  • 每次预测的是上一次的残差,在损失函数的梯度方向,残差要越来越小。

GBDT过拟合了怎么办?

  • 限制树的最大深度
  • 限制叶子节点的最少样本数量
  • 借鉴RF的两个随机思想
  • 正则项
  • 迭代次数(早停止)
  • 随机梯度下降

树的复杂度由哪方面体现?
树的层数
叶子节点个数
L1、L2

GBDT输出

  • 当一个样本进入GBDT之中后,会在每一个基学习器(CART树)上得到一个output,通过对各个基学习器的output求和(除第一棵树外,其他的树要乘以学习率),得到最终的输出。

GBDT与RF之间的区别

相同点

  • 都是由多棵树组成,最终的结果都是由多棵树一起决定

不同点

  • 从集成学习的角度来讲:RF属于bagging思想,而GBDT是boosting思想
  • 从权衡方差偏差角度来讲:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差
  • 从训练样本角度来讲:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本
  • 从树的生成角度来讲:RF的树是并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)
  • 从结果角度来讲:分类问题随机森林的结果是多棵树投票表决,回归问题是多棵树算术平均。而GBDT是加权融合
  • 从数据敏感性角度来讲:``随机森林对异常值不敏感。GBDT对异常值比较敏感
  • 从泛化能力来看:RF不易过拟合,而GBDT容易过拟合
  • 随机森林不需要进行特征归一化。GBDT最好进行特征归一化,梯度下降收敛快一些


GBDT和Adaboost的区别

  • 1.GBDT每次迭代沿梯度下降最快方向学习去弥补模型的不足; Adaboost每次迭代提升错误样本权重来弥补模型的不足;
  • 2.GBDT可选多种目标函数,当为均方误差时,正好为残差;Adaboost目标函数为指数损失函数
  • 3.GBDT无更新样本分布,无分类器权重;Adaboost都有
  • 4.GBDT输出为累加;Adaboost分类为多数表决,回归为取平均值
  • 5.GBDT分类器只能是CART回归树;Adaboost可有其他类型分类器


GBDT和LR的区别

  • 1.LR是线性模型,可解释性强,很容易并行化,但学习能力有限,需要大量的人工特征工程
  • 2.GBDT是非线性模型,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行训练,而且树模型很容易过拟合
  • 当在高维稀疏特征的场景下,LR的效果一般会比GBDT好

GBDT为什么要拟合前面几轮的残差?

  • 损失函数的负梯度方向在当前模型的值近似残差,每一轮迭代尽量去拟合残差,使得最终累加结果趋近真实值

GBDT通过什么方式减少误差?

  • 不断迭代去拟合残差

为什么只能用CART回归树?

  • 源于GBDT的核心思想中需要将所有树的预测值累计,而分类树的结果显然是没办法累加的,比如男+男+女=到底是男是女,所以GBDT中的树都是回归树,不是分类树


GBDT为什么要用梯度下降?

  • 负梯度是损失函数下降最快的方向,即为快速找到最小损失函数

GBDT如何做特征选择?

  • 计算每棵树非叶子节点分裂后平方损失的减少,减少得越多说明特征越重要

为什么GBDT的树深度较RF浅?

  • GBDT利用残差逼近不断拟合原数据,每一轮都需要保证一定的偏差,所以每棵决策树更浅
  • RF并行训练不同的分类器+输出为多数表决—> 因此需要每棵决策树尽可能去拟合样本—>基本不剪枝

GBDT如何加速训练?

  • 预排序,预排序可以加速查找最佳分裂点;

GBDT哪些部分可以并行?

  • 1.计算每个样本的负梯度;
  • 2.选取最佳分割点时;
  • 3.预测时将每个样本之前的值累加时

GBDT为什么要归一化?

  • 1.加快梯度下降收敛速度,避免震荡现象
  • 2.提高精度


XGBOOST

? XGBOOST是在GBDT的基础上做的改进和优化,GBDT对损失函数梯度下降,XGB对损失函数二阶泰勒展开,运算速度和准确度都相对高一些。

XGBOOST的boosting策略和GBDT基本一样,都是通过加法模型,不断拟合残差来达到预测效果的。不同点在于:

  • 传统的GBDT以CART回归树做基分类器,XGBOOST的基学习器除了可以是CART外,还支持线性分类器。
  • 传统GBDT在优化时只用到一阶导数信息。XGBOOST则对代价函数进行了二阶泰勒展开(牛顿法),同时用到了一阶和二阶导数。可以更为精准的逼近真实的损失函数。XGBOOST还支持自定义代价函数,只要代价函数一阶和二阶可导就可以。
  • XGBOOST在代价函数中加入了正则项,用于控制模型复杂度。相当于预剪枝。从权衡方差偏差角度来看,降低了模型的方差,这也是优于传统GBDT的一个特性。
  • XGBOOST还借鉴了随机森林的特征抽样,就是所谓的列采样,对每棵树随机选择特征子集,不仅能防止过拟合,还能减少计算。
  • XGBOOST还支持并行化,这里的并行化并不是树与树之间的并行,XGB本质还是boosting训练串行的思想。它是指特征维度的并行,由于CART树最耗时的步骤是对特征值进行排序(因为要计算最佳分裂点),XGBOOST在训练之前,预先对每一列进行排序,存储为block块结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程并行的对每个block并行计算查找每个特征的最佳分割点,极大地提升训练速度。这也就是所谓的预排序。
  • 另外我印象中XGBOOST对缺失值的处理是分别假设这些样本属于左子树和右子树,然后比较两者的分裂增益,选择增益较大的那一边作为该样本的分裂方向。

XGBOOST差不多就对GBDT做了这些优化,它在可扩展性和训练速度和精度上都有了巨大的提升,但是核心思想是没有发生太大变化的。


面试题整理

XGBoost为什么使用泰勒二阶展开?

  • 相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数。
  • 可扩展性提高,损失函数支持自定义,只需要新的损失函数二阶可导。

XGBoost为什么快?

  • 分块并行:训练前每个特征按特征值进行排序并存储为Block结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点。

XGBoost防止过拟合的方法?

  • 目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
  • 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
  • 子采样:每轮计算可以不使用全部样本,使算法更加保守
  • shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间

GBDT、XGBoost中的一棵树的停止生长条件?

  • 当新引入的一次分裂所带来的增益Gain<0时,放弃当前的分裂
  • 当树达到最大深度时,停止建树,因为树的深度太深容易出现过拟合,这里需要设置一个超参数max_depth
  • 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。这涉及到一个超参数: 最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细。

XGBoost如何处理不平衡数据?

  • 对于不平衡的数据集,例如用户的购买行为,肯定是极其不平衡的,这对XGBoost的训练有很大的影响,XGBoost有两种自带的方法来解决:
  • 第一种,如果你在意AUC,采用AUC来评估模型的性能,那你可以通过设置scale_pos_weight来平衡正样本和负样本的权重。例如,当正负样本比例为1:10时, scale_pos_weight可以取10;
  • 第二种,如果你在意概率(预测得分的合理性),你不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)。
  • 除此之外,还可以通过上采样、下采样、SMOTE算法或者自定义代价函数的方式解决正负样本不平衡的问题。

XGBoost中如何对树进行剪枝?

  • 在目标函数中增加了正则项,控制树的复杂度。
  • 在结点分裂时,定义了一个阈值,如果分裂后目标函数的增益小于该阈值,则不分裂。
  • 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值(最小样本权重和),也会放弃此次分裂。

XGBoost如何寻找最优特征(最佳分裂点)?

  • XGBoost在训练的过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据,从而记忆了每个特征对模型训练时的重要性。从内部节点中涉及某特征的次数作为该特征的重要性排序。
  • weight:该特征在所有树中被用作分割样本的特征的总次数。
  • gain:该特征在其出现过的所有
  • 树中产生的平均增益。

XGBooost参数调优的一般步骤?

  • 首先可以考虑learning rate学习率,一般初识为0.1就可以
  • 还可以调整max_depth每棵子树的最大深度 和 min_child_weight子节点的权重阈值,一般来说最大深度可以从3-10里迭代的修正。权重阈值的话可以在1-6。
  • 还可以调整gamma,也叫最小划分损失min_split_loss,一般是0.1-0.5
  • 还可以加L1或L2,降低学习率(0.01-0.1)等等

代码角度讲,XGBooost过拟合了怎么办?

  • 第一类参数:用于直接控制模型的复杂度。包括max_depth,min_child_weight,gamma 等参数
  • 第二类参数:用于增加随机性,从而使得模型在训练时对于噪音不敏感。包括subsample,colsample_bytree还有就是直接减小learning rate,但需要同时增 加estimator 参数。

为什么XGBoost相比某些模型对缺失值不敏感?

  • 一棵树中每个结点在分裂时,寻找的是某个特征的最佳分裂点(特征值),完全可以不考虑存在特征值缺失的样本,也就是说,如果某些样本缺失的特征值缺失,对寻找最 佳分割点的影响不是很大。

XGB的原理是什么,学习的目标是什么,每个学习器学习的是什么?

  • 原理和GBDT一样,都是加法模型,串行的生成树。学习的目标也和GBDT一样,拟合上一棵树的残差让残差最小,无非就是它是对代价函数进行二阶泰勒展开。

优缺点 & 适用场景

  • 优点:基于二阶泰勒展开,所以能精确的找到分割点。精度往往比GBDT高一些。
  • 缺点:空间消耗大,算法需要保存数据的特征值,还要保存特征排序的结果。在遍历每一个分割点的时候,都需要进行分裂增益的计算。
  • 在GBDT效果不理想的时候,可以用XGB试试。集成家族性能往往由于传统线性模型。


如果需要获取到这个【机器学习-常用回归算法归纳更全面的文档的话帮忙转发、转发、转发一下然后再关注我私信回复“学习”得到获取方式吧!

内容太多,关注小编持续更新哟~

相关推荐

自学Python,写一个挨打的游戏代码来初识While循环

自学Python的第11天。旋转~跳跃~,我~闭着眼!学完循环,沐浴着while的光芒,闲来无事和同事一起扯皮,我说:“编程语言好神奇,一个小小的循环,竟然在生活中也可以找到原理和例子”,同事也...

常用的 Python 工具与资源,你知道几个?

最近几年你会发现,越来越多的人开始学习Python,工欲善其事必先利其器,今天纬软小编就跟大家分享一些常用的Python工具与资源,记得收藏哦!不然下次就找不到我了。1、PycharmPychar...

一张思维导图概括Python的基本语法, 一周的学习成果都在里面了

一周总结不知不觉已经自学Python一周的时间了,这一周,从认识Python到安装Python,再到基本语法和基本数据类型,对于小白的我来说无比艰辛的,充满坎坷。最主要的是每天学习时间有限。只...

三日速成python?打工人,小心钱包,别当韭菜

随着人工智能的热度越来越高,许多非计算机专业的同学们也都纷纷投入到学习编程的道路上来。而Python,作为一种相对比较容易上手的语言,也越来越受欢迎。网络上各类网课层出不穷,各式广告令人眼花缭乱。某些...

Python自动化软件测试怎么学?路线和方法都在这里了

Python自动化测试是指使用Python编程语言和相关工具,对软件系统进行自动化测试的过程。学习Python自动化测试需要掌握以下技术:Python编程语言:学习Python自动化测试需要先掌握Py...

Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能

这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成的第一个Python项目,将任意公众号的所有历史文章导出成PDF电子书。或许我这个Py...

【黑客必会】python学习计划

阅读Python文档从Python官方网站上下载并阅读Python最新版本的文档(中文版),这是学习Python的最好方式。对于每个新概念和想法,请尝试运行一些代码片段,并检查生成的输出。这将帮助您更...

公布了!2025CDA考试安排

CDA数据分析师报考流程数据分析师是指在不同行业中专门从事行业数据搜集、整理、分析依据数据作出行业研究评估的专业人员CDA证书分为1-3级,中英文双证就业面广,含金量高!!?报考条件:满18...

一文搞懂全排列、组合、子集问题(经典回溯递归)

原创公众号:【bigsai】头条号:程序员bigsai前言Hello,大家好,我是bigsai,longtimenosee!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合...

「西法带你学算法」一次搞定前缀和

我花了几天时间,从力扣中精选了五道相同思想的题目,来帮助大家解套,如果觉得文章对你有用,记得点赞分享,让我看到你的认可,有动力继续做下去。467.环绕字符串中唯一的子字符串[1](中等)795.区...

平均数的5种方法,你用过几种方法?

平均数,看似很简单的东西,其实里面包含着很多学问。今天,分享5种经常会用到的平均数方法。1.算术平均法用到最多的莫过于算术平均法,考试平均分、平均工资等等,都是用到这个。=AVERAGE(B2:B11...

【干货收藏】如何最简单、通俗地理解决策树分类算法?

决策树(Decisiontree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法。决策树算法是机器学习中的一种经典算法,它通过一系列的规则...

面试必备:回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。今天跟大家一起来学习回溯算法的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~什么是回溯...

「机器学习」决策树——ID3、C4.5、CART(非常详细)

决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。本文将分三篇介绍决策树,第一篇介绍基本树(包括ID3、C4.5、CART),第二篇介绍Ran...

大话AI算法: 决策树

所谓的决策树算法,通俗的说就是建立一个树形的结构,通过这个结构去一层一层的筛选判断问题是否好坏的算法。比如判断一个西瓜是否好瓜,有20条西瓜的样本提供给你,让你根据这20条(通过机器学习)建立起...