ml(机器学习)基础知识点
数据预处理
单一字段维度操作
在 pandas 的 DataFrame 中,针对单一字段(列),可以使用以下一些常用的函数来进行观察和分析:
1. df['column_name']
- 用于选择某一列的数据,可以直接访问列名。
2. df['column_name'].head(n)
- 返回列的前
n个值,默认n=5。
3. df['column_name'].tail(n)
- 返回列的最后
n个值,默认n=5。
4. df['column_name'].describe()
- 提供该列的统计汇总,包括计数、均值、标准差、最小值、最大值、四分位数等(对于数值型列)。
5. df['column_name'].unique()
- 返回该列中所有唯一值的数组。
6. df['column_name'].nunique()
- 返回该列中唯一值的数量。
7. df['column_name'].value_counts()
- 返回该列中每个值出现的次数(按频率排序)。
8. df['column_name'].isnull()
- 返回一个布尔 Series,指示该列中每个值是否为
NaN(缺失值)。
9. df['column_name'].notnull()
- 返回一个布尔 Series,指示该列中每个值是否不是
NaN(非缺失值)。
10. df['column_name'].sum()
- 返回该列所有数值的总和。
11. df['column_name'].mean()
- 返回该列数值的平均值。
12. df['column_name'].std()
- 返回该列数值的标准差。
13. df['column_name'].min()
- 返回该列数值的最小值。
14. df['column_name'].max()
- 返回该列数值的最大值。
15. df['column_name'].median()
- 返回该列数值的中位数。
16. df['column_name'].mode()
- 返回该列的众数(出现频率最高的值)。
17. df['column_name'].cumprod()
- 返回该列的累积乘积。
18. df['column_name'].cumsum()
- 返回该列的累积和。
19. df['column_name'].rank()
- 返回该列中每个值的排名(默认升序)。
20. df['column_name'].apply(function)
- 对该列的每个值应用一个函数,通常用于自定义操作。
21. df['column_name'].astype(dtype)
- 将该列的类型转换为指定的
dtype(例如,从字符串到日期,或从整数到浮动等)。
22. df['column_name'].str (对于字符串列)
- 提供字符串操作的方法,如
.str.upper(),.str.lower(),.str.contains(),.str.replace()等。
23. df['column_name'].diff()
- 返回该列相邻元素的差异。
24. df['column_name'].shift(periods)
- 对该列的数据进行位移操作,例如,
periods=1表示将数据向下移一行。
这些函数可以帮助我们从不同角度观察单个字段的特性和行为。
问题点
多重共线性带来的问题及原因
多重共线性的现象
在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关的现象,我们称这种现象为多重共线性。
适度的多重共线性不成问题,但当出现严重共线性问题时,会导致分析结果不稳定,出现回归系数的符号与实际情况完全相反的情况。
本应该显著的自变量不显著,本不显著的自变量却呈现出显著性,这种情况下就需要消除多重共线性的影响。
多重共线性会引起上述问题,主要是因为自变量之间存在高度的相关性,这影响了回归模型中各个变量系数的估计过程。为了理解这一点,我们需要从回归分析的基本原理出发,深入探讨为什么和如何多重共线性影响模型。
回归系数估计的不稳定性
回归模型中的系数是通过最小二乘法(Ordinary Least Squares, OLS)来估计的。OLS的目标是最小化预测值与实际值之间的误差平方和。对于线性回归模型,系数的估计是通过求解以下的正规方程得到的:
β
^
=
(
X
T
X
)
−
1
X
T
y
\hat{\beta} = (X^T X)^{-1} X^T y
β^=(XTX)−1XTy
其中:
- (X) 是自变量的设计矩阵。
- (\hat{\beta}) 是回归系数的估计值。
- (y) 是目标变量。
为什么多重共线性使得回归系数不稳定?
当自变量之间存在多重共线性时,设计矩阵 (X^T X) 会变得接近奇异矩阵,即它的行列式接近于零,或者条件数非常大。这意味着矩阵 (X^T X) 的逆(((X^T X)^{-1}))将会非常不稳定,导致回归系数估计的不稳定。
具体来说:
- 自变量之间的高相关性使得其中一些特征的贡献变得难以区分。回归系数估计会对这些相关变量的微小变化极其敏感,导致系数的标准误差增大,进而使得回归系数的不确定性增大。
- 这种不稳定性表现在回归系数的估计上,可能出现系数非常大或非常小的情况,甚至在不同的样本数据上估计结果会有很大差异。
2. 标准误差增加
标准误差是回归系数估计不确定性的一个度量,标准误差越大,意味着模型对系数的估计越不精确。在多重共线性的情况下,某些特征之间高度相关,导致设计矩阵 (X^T X) 的逆变得难以计算,从而增加了回归系数的标准误差。
为什么标准误差增加?
- 高度相关的特征之间有冗余的信息,这导致系数的估计不准确。特别是当某些特征与目标变量的关系本质上是通过其他特征间接实现的时,标准误差会明显增大。
- 由于相关性高,自变量之间的“共线性”意味着模型不能清晰地分配每个自变量对目标变量的独立贡献。回归系数的变化受到其他特征的影响较大,从而导致标准误差增大。
3. 失去解释能力
多重共线性使得回归模型中的每个自变量对目标变量的独立贡献变得不容易解释。因为相关的自变量之间可能包含重复信息,因此很难确定每个自变量的实际作用,导致回归系数的解释变得模糊。
为什么会失去解释能力?
- 当自变量高度相关时,模型中的某些自变量对目标变量的影响是重叠的,这样就很难明确哪些自变量在多大程度上影响了目标变量。
- 高度相关的特征难以分辨它们的“独立作用”,导致回归模型的解释能力受限。例如,模型可能给出一个系数非常大的自变量,而实际上该自变量和其他变量的作用是冗余的。
4. 过拟合(Overfitting)
多重共线性可能导致回归模型在训练集上的拟合表现良好,但在新数据上的表现较差。即使训练误差较小,回归模型也可能容易对噪声数据产生过拟合。
为什么会过拟合?
- 当自变量高度相关时,回归模型可能在某些特征的微小变动上产生极大的反应。虽然模型在训练集上能拟合得很好,但在新数据上这种过度灵敏的表现会导致预测不稳定,泛化能力差。
- 多重共线性导致模型依赖于少数几个高度相关的特征,使得模型在面对新数据时容易出现过拟合现象。
5. 模型不收敛
在某些复杂的回归模型(例如岭回归、Lasso回归等)中,多重共线性可能导致模型训练过程中无法收敛,或者需要非常强的正则化来稳定模型的参数估计。
为什么会导致不收敛?
- 多重共线性导致的矩阵接近奇异,可能使得求解回归系数的过程变得不稳定。在极端情况下,模型的损失函数可能无法找到稳定的最优解,导致训练过程不收敛。
总结
多重共线性会引起上述问题的根本原因是它影响了回归系数的稳定性和准确性。由于自变量之间存在高度的相关性,模型很难区分每个自变量对目标变量的独立贡献,导致回归系数的不稳定、标准误差增大、过拟合、失去解释性和模型不收敛等问题。这些问题使得模型的预测能力和解释能力大打折扣。
另请参见
- 📊 Multicollinearity effects explains how multicollinearity affects regression models and statistical inference.
- 🧮 Variance Inflation Factor (VIF) describes how to calculate and interpret VIF to detect multicollinearity in regression models.
CASH问题
CASH问题(Combined Algorithm Selection and Hyperparameter Optimization)是指在自动化机器学习(AutoML)中,如何同时解决算法选择和超参数优化的问题。
具体来说,AutoML框架在执行任务时,首先需要选择一个合适的机器学习算法(如决策树、随机森林、神经网络等),然后对于选择的算法,还需要优化其超参数(如学习率、树的深度等)。这个过程是非常具有挑战性的,因为:
- 算法选择:不同的任务可能适合不同的算法。例如,回归任务可能使用线性回归或决策树,分类任务则可能使用支持向量机或随机森林。选择正确的算法是关键。
- 超参数优化:每种算法都有其超参数,如何调整这些超参数以获得最佳性能是另一个挑战。例如,决策树的最大深度、学习率等,这些都需要通过优化算法进行调整。
CASH问题的难点在于这两个步骤通常是相互依赖的,解决这两个问题的过程非常复杂,且计算成本高。传统的做法往往采用暴力搜索(比如网格搜索或随机搜索),这种方法会尝试大量的组合,计算开销巨大,尤其是在面对复杂数据集时,可能会导致效率低下。
AutoGluon提出的创新方法通过避免了这种复杂的暴力搜索策略,而是采用了更为高效的策略(如模型集成和多层堆叠)来优化模型性能,减轻了CASH问题的影响。
模型评估与选择
经验误差与过拟合
偏差方差

从bias入手看待问题
- bias越低,variance就会越高
bias低就代表着要求f(拟合函数的学习器)就要越贴近所有的数据点,这种情况下就好像该学习器是为该数据量身打造似的。这种情况下如果改变数据结构,那么学习器的改变幅度就会很大,如果学习器的变动很大那么自然而然方差就会很高,可以看西瓜书中关于方差的概念。

- bias越高,variance就会越低
同理,bias高,代表该学习器不需要对所有点进行拟合,那么改变数据,学习器的改动就不会很大,这种情况下variance就会很小。


观察蓝绿(蓝线:训练集,绿线:测试集)两线之间的距离,距离越小,方差越小;距离越大,方差越大。
针对于距离,为什么开口越大,方差越大呢?
答:开口越大,说明过拟合现象,因为模型很好的适应训练集,而测试集上就很不适应,导致开口就会很大。
偏差和方差影响
从数学上分析,我们想要得到低 bias 和低 variance 的原因是很明显的。如上所述,bias 和 variance 只能增加模型的误差。尽管从一个更直觉的角度而言,我们希望低 bias 来避免构建太简单的模型。
低偏差和高方差的影响
在大多数情况中,简单的模型在训练集上的表现是很糟糕的,并且它极有可能在测试数据上也是同样糟糕的表现。这样的模型几乎能够完美的适应训练集中的所有数据点。然而,训练数据通常都包含噪声,而且它仅仅是更大的数据中的一个小样本。过于复杂的模型能够捕获这种噪声。当在样本外的数据上测试的时候,性能通常会很差。这是因为模型在样本训练数据上学习得太极致了。它对一些东西特别了解,但是对于其它一无所知。
解决高偏差低方差的方法—欠拟合
- 增加特征量
- 较少正则化
- 增加模型复杂度
不可以增加数据量,本身是欠拟合状态
解决低偏差高方差的方法—过拟合
- 增加正则化
- 增大样本
- 驾校特征量
- 较小模型复杂度
学习曲线
学习曲线是通过训练集大小变化,反映模型在训练集和验证集上误差大小变化的曲线。
学习曲线用于判断模型是否处在欠拟合(高偏差)或过拟合(高方差)状态。
正常情况下的学习曲线
考虑这样一个模型 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2 hθ(x)=θ0+θ1x+θ2x2$
当样本只有1个时,很容易完美拟合。此时误差为0

随着样本数量的增多,拟合难度会逐渐提高。训练误差也会随之提高。

对于验证误差而言,它体现的是模型对新样本的泛化能力强弱,验证误差越低,那么泛化能力越强。
那么在样本过少的情况下,训练出的模型,将不会有较好的泛化能力,因此验证误差会较大。
容易作出验证误差的学习曲线:

随着我们增加训练集的大小,模型不再完美地适应训练集了。所以训练误差变得更大了。但是因为模型在更多的数据上进行了训练,所以它能够更好地适应验证集。
欠拟合(高偏差低方差)下的学习曲线
偏差:离真实值还具有一定距离
考虑这样一个例子

可以看出模型的函数并不会发生太大变化仍然是一条或者近似一条直线。
但是由于样本数量的增多,或多或少会有些样本正好落在线上,因此随着样本数量的增多,误差会在一定程度上减小。
需要注意的是,由于模型的函数并不会发生太大变化,永远都会是一条直线,而一条直线是无法很好拟合此例中的样本的,所以样本数量继续增加,并不会使误差持续下降。
那么容易得出学习曲线图:

在欠拟合(高偏差)的情况下,当样本多到一定程度后,训练误差会接近验证误差,此后样本数量不会再对误差产生明显影响
过拟合(低偏差高方差)下的学习曲线
高方差:过于拟合数据,数据扰动就会产生巨大变化
考虑这样一个例子

同样的,随着样本数量增多,拟合难度会逐渐上升,但是总的来说,因为曲线相对来说更加扭来扭去,训练误差也不会过于离谱地大。
在高方差情况下,由于假设函数对样本过拟合,因此验证误差会一直都比较大。
容易作出学习曲线图:

此种情形下,验证误差和训练误差之间会有较大的差距。
随着样本数量的增多,训练误差会持续增大,验证误差会持续减小,那么两条曲线会越靠越近。
因此,如果处在这样的情况下,通过增加样本数量,是有可能改善过拟合(高方差)的
性能度量
回归模型的性能度量
一、均方误差(MSE)
均方误差(Mean Squared Error,MSE)是评估回归模型性能最常用的指标之一。它计算模型预测值与真实值之间差异的平方的平均值,公式为MSE = (1/n) * Σ(yᵢ - ȳ)²,其中yᵢ表示预测值,ȳ表示真实值,n表示样本数量。MSE的值越小,表示模型的预测能力越好。MSE的优点在于对大误差更加敏感,能够促使模型在训练过程中减少大误差。然而,MSE的缺点也显而易见,由于平方的特性,它容易受到离群值的影响,可能导致评估结果出现偏差。
二、均方根误差(RMSE)
均方根误差(Root Mean Squared Error,RMSE)是MSE的平方根,公式为RMSE = √MSE。与MSE相比,RMSE具有与目标变量相同的单位,因此更容易解释。RMSE同样衡量了模型预测值与真实值之间的平均偏差程度,值越小表示模型的拟合效果越好。与MSE一样,RMSE也容易受到离群值的影响。
三、平均绝对误差(MAE)
平均绝对误差(Mean Absolute Error,MAE)是另一种常见的回归模型评价指标。它计算预测值与真实值之间差异的绝对值的平均值,公式为MAE = (1/n) * Σ|yᵢ - ȳ|。与MSE不同,MAE不考虑误差的平方,更加关注预测值和真实值的绝对差异。因此,MAE对离群值的敏感度较低,更为稳健,适用于噪声较大的数据集。然而,MAE在优化时的梯度信息不如MSE明确,可能导致收敛速度较慢。
四、决定系数(R²)
决定系数(Coefficient of Determination,R²)是衡量回归模型对目标变量方差解释程度的重要指标。它表示模型可以解释目标变量变异性的比例,取值范围从0到1,越接近1表示模型的解释能力越强。R²的优点在于具有良好的可解释性,能够直观地表示模型的拟合优度。然而,R²值可能会随着模型复杂度的增加而增加,导致过拟合。因此,在使用R²评估模型时,需要结合模型的复杂度进行综合考量。
五、解释方差(EV)
解释方差(Explained Variance,EV)也是衡量模型对目标变量方差解释程度的指标。它表示模型能够解释的目标变量方差所占比例,取值范围同样为0到1。EV的值越接近1,表示模型对目标变量的解释能力越强。EV与R²在某种程度上具有相似性,但它们的计算方式和关注点略有不同。EV更侧重于模型对整体数据变异的解释能力,而R²则更关注模型对目标变量变异性的解释程度。
六、最大误差(Maximum Error)
最大误差是预测值与真实值之间的最大差异,用于衡量模型在预测中的最大偏差。最大误差能够帮助我们了解模型在异常情况下的表现,以及可能存在的极端预测错误。然而,最大误差只考虑了预测值与真实值之间的最大差异,没有考虑其他误差的分布情况,因此在实际应用中需要结合其他指标进行综合评估。
实际应用中的选择
在实际应用中,我们应根据问题的特点和预测需求选择合适的评估指标。例如,当数据中存在离群值时,我们可以优先考虑使用MAE或调整后的R²来评估模型性能;当需要关注模型对整体数据变异的解释能力时,我们可以选择EV作为评估指标;当需要衡量模型在预测中的最大偏差时,我们可以使用最大误差作为参考。
此外,在实际应用中我们还可以借助一些专业的机器学习平台来辅助我们进行模型评估和选择。例如千帆大模型开发与服务平台就提供了丰富的模型评估工具和指标选项,能够帮助我们更快速、准确地评估和选择适合的回归模型。
总之,回归模型评估指标的选择应综合考虑问题的特点、数据特性以及预测需求。通过合理选择和使用评估指标,我们可以更准确地评估回归模型的性能并做出更明智的决策。
集成学习
常见算法
- Bagging(Bootstrap Aggregating)
- 随机森林(Random Forest):随机森林是集成学习中最经典的Bagging方法。它通过构建多个决策树(Decision Trees)并对其结果进行平均(回归问题)或投票(分类问题)来提高模型的稳定性和精度。
- Bagging:原始的Bagging方法也可以与其他模型(如决策树、SVM等)结合使用,主要思想是通过对训练集的重采样(Bootstrap)来构建多个模型,并将它们的预测结果结合起来。
- Boosting
- AdaBoost(Adaptive Boosting):AdaBoost是最早的Boosting算法之一,它通过训练一系列弱分类器,并让每个分类器关注前一个分类器错分的数据。AdaBoost会根据分类器的错误率调整每个分类器的权重。
- Gradient Boosting Machines (GBM):GBM通过每次训练一个新模型来拟合前一个模型的残差,通常通过回归树(Decision Trees)来实现。它是Boosting方法中较为常见的算法,适用于回归和分类任务。
- XGBoost(Extreme Gradient Boosting):XGBoost是GBM的一个优化版本,具备更强的性能和更快的训练速度。它通过优化损失函数、加速计算等方式,能够处理大规模数据。
- LightGBM:LightGBM是微软开发的一个快速梯度提升树算法,特点是训练速度快,内存占用少,适用于大数据场景。
- CatBoost:CatBoost是由Yandex开发的一个高效的Boosting算法,具有自动处理类别特征的能力,尤其适用于包含大量类别特征的数据集。
- Stacking(堆叠泛化)
- Stacking:Stacking是一种将多个基础学习器的预测结果作为新的特征输入到另一个模型中的集成方法。通常,会使用多个不同的学习算法(如决策树、SVM、神经网络等)作为基础学习器,然后将这些学习器的输出作为新的特征,输入到一个元学习器(Meta-Learner,通常是线性回归或逻辑回归)中进行训练。Stacking的优势在于它能够结合不同模型的优点,提供比单一模型更强的泛化能力。
- Voting
- 硬投票(Hard Voting):每个模型的预测结果投票,最终选择出现最多的类标签作为最终预测结果。适用于分类问题。
- 软投票(Soft Voting):每个模型给出类的概率值,计算各个类别的平均概率,选择概率最高的类别作为最终预测结果。适用于分类问题,尤其是当模型输出概率而非类标签时。
- Blending
- Blending是Stacking的变种,通常将数据集分成训练集和验证集,通过在验证集上训练元学习器来避免数据泄漏。与Stacking不同的是,Blending不使用交叉验证,通常更简单但可能导致过拟合。
随机森林
随机森林属于 集成学习 中的 Bagging(Bootstrap AGgregation 的简称) 方法
Random forests or random decision forests is an ensemble learning method for classification, regression and other tasks that works by creating a multitude of decision trees during training. For classification tasks, the output of the random forest is the class selected by most trees. For regression tasks, the output is the average of the predictions of the trees.[1][2] Random forests correct for decision trees’ habit of overfitting to their training set.[3]: 587–588
分类:选择最多的
回归:平均

[!IMPORTANT]
随机森林与bagging的区别,bagging只对于样本量进行有放回抽取,而随机森林不止对样本量进行有放回抽取而且还会对于特征值进行随机抽取
决策树 – Decision Tree

在解释随机森林前,需要先提一下决策树。决策树是一种很简单的算法,他的解释性强,也符合人类的直观思维。这是一种基于if-then-else规则的有监督学习算法,上面的图片可以直观的表达决策树的逻辑。
了解详情:《一文看懂决策树 – Decision tree(3个步骤+3种典型算法+10个优缺点)》
决策树参数
- RF划分时考虑的最大特征数 max_features: 就是之前提到的“在每个节点处,从M中随机选择m个特征维度”中的那个m。默认是"auto",意味着每个节点在划分时随机考虑 ( n ) \sqrt{(\mathrm{n})} (n)个特征;如果是"log2"意味着划分时随机考虑 l o g 2 N \mathrm{log}_{2}\mathrm{N} log2N个特征;如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑百分比*总特征维度数取整后的特征数。一般用默认的"auto"就可以了;如果特征数非常多,可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
- 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
- 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再划分。默认是2。如果样本量数量级非常大,则推荐增大这个值。
- 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,只保留原来的父节点。默认是1。如果样本量数量级非常大,则推荐增大这个值。
- 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝,只保留原来的父节点。 默认是0,就是不考虑权重问题。如果我们有较多样本有缺失值,或者分类树样本的分布类别非常不平衡,就会引入样本权重,这时我们就要注意这个值了。
- 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征非常多的话,可以加以限制,具体的值可以通过交叉验证得到。
- 节点划分最小不纯度min_impurity_decrease: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动,默认值1e-7。
- 用于最小成本-复杂度修剪的复杂度参数ccp_alpha。将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不进行修剪。详情请看最小成本复杂度修剪。
- max_samples,如果bootstrap为True,则从X中抽取的样本数量,以训练每个基础估计器。
[!IMPORTANT]
上面决策树参数中最重要的包括最大特征数
max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。
Bagging
随机森林采用Bagging的思想,所谓的Bagging可以用下面这张图表示:

从上图可以看出,Bagging的弱学习器之间的确没有boosting那样的联系。它的特点在“随机采样”。那么什么是随机采样?
随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。对于我们的Bagging算法,一般会随机采集和训练集样本数m一样个数的样本。这样得到的采样集和训练集样本的个数相同,但是样本内容不同。如果我们对有m个样本训练集做T次的随机采样,,则由于随机性,T个采样集各不相同。
温馨提示:这和GBDT的子采样是不同的。GBDT的子采样是无放回采样,而Bagging的子采样是放回采样。
对于一个样本,它在某一次含m个样本的训练集的随机采样中,每次被采集到的概率是 1 m \frac{1}{m} m1,不被采集到的概率为 1 − 1 m 1-\frac{1}{m} 1−m1。这样m次采样都没有被采集中的概率是 ( 1 − 1 m ) m (1 - \frac{1}{m})^{m} (1−m1)m,当m趋近于无穷的时候 ( 1 − 1 m ) m → 1 e ≈ 0.368 (1-\frac1{\mathrm{m}})^\mathrm{m}\to\frac1{\mathrm{e}}\approx0.368 (1−m1)m→e1≈0.368 也就是说,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集采集中。 对于这部分大约36.8%的没有被采样到的数据,我们常常称之为袋外数据(Out Of Bag, 简称OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。bagging对于弱学习器没有限制,这和Adaboost一样。但是最常用的一般也是决策树和神经网络。
bagging的集合策略也比较简单,对于分类问题,通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。
由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。
Bagging 的算法描述如下图所示

随机森林 – Random Forest | RF
随机森林是由很多决策树构成的,不同决策树之间没有关联。
当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。

随机森林的本质
随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不同。随机森林背后的思想是,每棵树的预测可能都相对较好,但可能对部分数据过拟合。如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对这些树的结果取平均值来降低过拟合。既能减少过拟合又能保持树的预测能力,这可以在数学上严格证明。
构造随机森林的 4 个步骤

- 一个样本容量为N的样本,有放回的抽取N次,每次抽取1个,最终形成了N个样本。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
有放回的抽取,这就构成了袋外误差,约有1/3的没有被抽取到,这部分可以当做误差进行。
-
当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
-
决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
-
按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
随机森林的优缺点
优点
- 它可以出来很高维度(特征很多)的数据,并且不用降维,无需做特征选择
- 它可以判断特征的重要程度
- 可以判断出不同特征之间的相互影响
- 不容易过拟合
- 训练速度比较快,容易做成并行方法
- 实现起来比较简单
- 对于不平衡的数据集来说,它可以平衡误差。
- 如果有很大一部分的特征遗失,仍可以维持准确度。
缺点
- 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
- 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的
GBDT
参考文献 https://github.com/NLP-LOVE/ML-NLP/blob/master/Machine%20Learning/3.2%20GBDT/3.2%20GBDT.md
Boosting思想
Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。
Bagging与Boosting的串行训练方式不同,Bagging方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。
GBDT解释
GBDT的原理很简单,就是所有弱分类器的结果相加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(这个残差就是预测值与真实值之间的误差)。当然了,它里面的弱分类器的表现形式就是各棵树。
举一个非常简单的例子,比如我今年30岁了,但计算机或者模型GBDT并不知道我今年多少岁,那GBDT咋办呢?
- 它会在第一个弱分类器(或第一棵树中)随便用一个年龄比如20岁来拟合,然后发现误差有10岁;
- 接下来在第二棵树中,用6岁去拟合剩下的损失,发现差距还有4岁;
- 接着在第三棵树中用3岁拟合剩下的差距,发现差距只有1岁了;
- 最后在第四课树中用1岁拟合剩下的残差,完美。
- 最终,四棵树的结论加起来,就是真实年龄30岁(实际工程中,gbdt是计算负梯度,用负梯度近似残差)。
为何gbdt可以用用负梯度近似残差呢?
回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数,
那此时的负梯度是这样计算的
所以,当损失函数选用均方损失函数是时,每一次拟合的值就是(真实值 - 当前模型预测的值),即残差。此时的变量是
,即“当前预测模型的值”,也就是对它求负梯度。
训练过程
简单起见,假定训练集只有4个人:A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。如果是用一棵传统的回归决策树来训练,会得到如下图所示结果:

现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。我们会得到如下图所示结果:

第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为左右两拨,每拨用平均年龄作为预测值。
- 此时计算残差(残差的意思就是:A的实际值 - A的预测值 = A的残差),所以A的残差就是实际值14 - 预测值15 = 残差值-1。
- 注意,A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值。
然后拿它们的残差-1、1、-1、1代替A B C D的原值,到第二棵树去学习,第二棵树只有两个值1和-1,直接分成两个节点,即A和C分在左边,B和D分在右边,经过计算(比如A,实际值-1 - 预测值-1 = 残差0,比如C,实际值-1 - 预测值-1 = 0),此时所有人的残差都是0。残差值都为0,相当于第二棵树的预测值和它们的实际值相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了,即每个人都得到了真实的预测值。
换句话说,现在A,B,C,D的预测值都和真实年龄一致了。Perfect!
- A: 14岁高一学生,购物较少,经常问学长问题,预测年龄A = 15 – 1 = 14
- B: 16岁高三学生,购物较少,经常被学弟问问题,预测年龄B = 15 + 1 = 16
- C: 24岁应届毕业生,购物较多,经常问师兄问题,预测年龄C = 25 – 1 = 24
- D: 26岁工作两年员工,购物较多,经常被师弟问问题,预测年龄D = 25 + 1 = 26
所以,GBDT需要将多棵树的得分累加得到最终的预测得分,且每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差。
梯度提升和梯度下降的区别和联系是什么?
下表是梯度提升算法和梯度下降算法的对比情况。可以发现,两者都是在每 一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更 新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参 数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函 数空间中,从而大大扩展了可以使用的模型种类。

梯度下降总的来说是对于参数来讲,参数通过计算梯度的负方向进行梯度下降,减少误差
梯度提升针对的是集成学习,通过串行多个梯度数,以多个弱学习器进行加和,最终得到集成模型
梯度下降(Gradient Descent)和梯度提升(Gradient Boosting)都是机器学习中的优化方法,但它们的目标和应用场景有所不同。
1. 定义与工作原理
梯度下降(Gradient Descent)
- 目的:梯度下降是一种优化算法,用于最小化损失函数(通常是训练误差)以寻找模型参数的最佳值。
- 过程:在梯度下降中,模型的参数通过计算损失函数的梯度(即导数),然后按照梯度的反方向调整参数值,直到找到损失函数的最小值。
- 批量梯度下降:每次迭代使用整个训练集来计算梯度。
- 随机梯度下降(SGD):每次迭代只使用一个样本来计算梯度,从而加速计算。
- 小批量梯度下降:每次迭代使用小批量样本来计算梯度,结合了前两者的优点。
梯度提升(Gradient Boosting)
- 目的:梯度提升是一种集成学习方法,通过将多个弱学习器(通常是决策树)结合起来,逐步提高模型的准确性,最常用于回归和分类问题。
- 过程:梯度提升通过迭代训练一系列的模型,每个新模型尝试纠正前一个模型的错误,通常采用加法模型的方式。每一轮的训练是基于前一轮模型的残差(预测误差),即通过最小化残差来提升模型性能。
- 在每次迭代中,新模型的目标是通过最小化损失函数的梯度来修正当前模型的误差。
2. 联系
- 梯度下降在梯度提升中的应用:在梯度提升的每一步中,模型的参数更新是通过梯度下降的方式来进行的。具体来说,梯度提升算法会计算每个弱学习器(通常是决策树)的“残差”,并用梯度下降来最小化这些残差,以此来提升整体的模型精度。
- 优化目标相同:两者都涉及通过最小化损失函数来优化模型。
3. 区别
基本概念
- 梯度下降主要是一个优化算法,用于更新单一模型(例如线性回归、神经网络等)的参数。
- 梯度提升是一个集成学习算法,通过组合多个模型(通常是弱学习器,通常是决策树)来提升预测能力。
应用场景
- 梯度下降通常用于训练单一的模型,如线性回归、逻辑回归、神经网络等。
- 梯度提升则用于构建由多个弱学习器组成的复杂模型,尤其在树模型(如决策树)中应用广泛,如 XGBoost、LightGBM、CatBoost 等。
训练过程
- 梯度下降的训练过程是通过更新单一模型的权重/参数,迭代优化损失函数。
- 梯度提升的训练过程是通过多个弱学习器(例如多个决策树)的迭代训练,每次新学习器都会纠正前一个学习器的误差。
计算效率
- 梯度下降通常是在整个数据集上进行迭代优化,每次迭代计算全数据集的梯度,较为简单,适用于单一模型。
- 梯度提升需要训练多个模型,每个模型都需要一定的计算资源,训练时间通常较长。
4. 总结
- 梯度下降是一个用于优化单一模型的技术,目标是通过迭代减少损失函数。
- 梯度提升是一种集成方法,通过多个迭代的学习器(例如决策树)来优化整体预测结果,每个新模型使用梯度下降来最小化损失和纠正前一轮的错误。
相关链接
- 📊 Gradient Descent is essential in training deep learning models.
- 🌳 Gradient Boosting techniques enhance model performance by combining weak learners.
GBDT的优点和局限性有哪些
优点
- 预测阶段的计算速度快,树与树之间可并行化计算。
- 在分布稠密的数据集上,泛化能力和表达能力都很好,这使得GBDT在Kaggle的众多竞赛中,经常名列榜首。
- 采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系。
局限性
- GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
- GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
- 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。
RF(随机森林)与GBDT之间的区别与联系
相同点:
- 都是由多棵树组成,最终的结果都是由多棵树一起决定。
- RF和GBDT在使用CART树时,可以是分类树或者回归树。
不同点:
- 组成随机森林的树可以并行生成,而GBDT是串行生成
- 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
- 随机森林对异常值不敏感,而GBDT对异常值比较敏感
为什么随机森林对异常值不敏感,而GBDT对异常值比较敏感
模型结构差异
- 随机森林:随机森林是由多棵决策树组成的集成模型。每棵树都是通过从原始数据中进行有放回抽样(即“bootstrap”抽样)构建的。这意味着,每棵树都会看到不同的数据子集,因此单个树中的异常值对最终模型的影响会被分摊和稀释。在整个森林中,某个异常值对结果的影响会通过多数树的投票(或平均)过程而减小。
- GBDT:GBDT是通过逐步迭代的方式构建决策树,每一棵树都依赖于前一棵树的残差(误差)。在每一步迭代中,模型会尝试拟合残差,即关注错误预测的部分。异常值往往会导致残差较大,从而影响后续树的构建过程,因为树会特别拟合这些异常大的误差。因此,异常值会对整个模型产生较大影响,特别是在模型迭代的早期阶段。
2. 训练过程中的影响
- 随机森林:每棵树都是独立训练的,且每棵树都会随机选择一部分特征和样本,异常值通常不会在每棵树的训练数据中频繁出现。这种"随机性"使得模型不容易被单一的异常值所影响。而且,森林中的多数树会有机会平衡掉这些异常影响,从而提高鲁棒性。
- GBDT:GBDT的训练过程是顺序的,每一棵树的构建是基于前一棵树的残差进行的。因此,异常值如果在残差计算中出现,将会被下一棵树特别关注。在迭代的过程中,异常值可能会被多个树重点拟合,从而使得整个模型对这些异常值产生过拟合的现象。
3. 树的深度与分裂
- 随机森林:由于随机森林中每棵树的生成是通过随机抽样和特征选择的,所以单棵树的深度通常不会过深,且每次分裂的特征选择是随机的。异常值对单棵树的影响通常是有限的,特别是对于深度有限的树。
- GBDT:在GBDT中,由于每一棵树是根据误差进行优化的,因此异常值往往会导致较大的残差,使得后续树的分裂更容易围绕异常值进行,从而导致过拟合。特别是在迭代过程中,树的深度可能更深,树的生成更精细,因此异常值会对最终模型产生较大的影响。
4. 拟合残差 vs. 拟合样本
- 随机森林:每棵树的训练目标是通过随机选择样本和特征进行分裂,对于异常值的影响不会特别突出。随机森林中的树的分裂是根据局部的样本特征进行的,通常不会过度拟合异常值。
- GBDT:GBDT通过最小化损失函数来拟合每一棵树的残差。异常值会导致较大的残差,从而影响到树的分裂。这种错误的拟合可能会让模型更加偏向于异常值,特别是当异常值在训练集中占有一定比例时。
5. 如何处理异常值
- 随机森林:通过随机选择样本和特征,异常值的影响会在树的训练过程中分散,无法影响到所有树的最终结果。因此,随机森林本身对异常值的鲁棒性较强。
- GBDT:由于每一棵树的构建依赖于前一棵树的残差,异常值可能被多次强调,这使得GBDT容易受到异常值的影响。GBDT的模型容易在处理异常数据时产生过拟合或偏差。
- 随机森林是减少模型的方差,而GBDT是减少模型的偏差
- 随机森林不需要进行特征归一化。而GBDT则需要进行特征归一化
XGBoost
参考文献 https://github.com/NLP-LOVE/ML-NLP/tree/master/Machine%20Learning/3.3%20XGBoost
计算学习理论
VC维
VC Dimension:全称是Vapnik-Chervonenkis dimension。其用来衡量一个模型的复杂度,定义为:在该模型对应的空间中随机撒x点,然后对其中的每个点随机分配一个2类标签,使用你的模型来分类,并且要分对,请问x至多是多少。这个x就是VC维。
https://tangshusen.me/2018/12/09/vc-dimension/
更多推荐


所有评论(0)