目录
2.1 Bagging(Bootstrap aggregating)
1 核心思想
集成学习(Ensemble Learning)是一种机器学习技术,它组合多个基学习器(也称为“弱学习器”或“子学习器”)的预测结果,以产生比单个基学习器更准确的预测。集成学习的基本思想是通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(Multi-classifier System)、基于委员会的学习(Committee-based Learning)等。
2 集成学习思想分类
2.1 Bagging(Bootstrap aggregating)
2.1.1 基本思想
Bootstrap aggregating(自举汇聚法或装袋法),是一种集成学习技术,用于提高机器学习模型的预测准确性和稳定性。它通过对原始数据集进行多次随机抽样并训练多个基学习器(如决策树、逻辑回归等),然后将这些基学习器的预测结果结合起来,以产生一个更强大、更稳定的预测模型。
2.1.2 特点
- 自助采样法(Bootstrap Sampling):
- Bagging的核心是自助采样法,这是一种有放回的随机抽样方法。这意味着在每次抽样后,被抽中的样本会被放回原始数据集中,以便在后续的抽样中再次被选中。
- 假设原始数据集包含N个样本,那么对于每个基学习器,我们都会从原始数据集中随机抽取一个大小为N的自助样本集。由于是有放回的抽样,因此一个样本在自助样本集中可能出现多次,也可能一次都不出现。
- 训练基学习器:
- 对于每个自助样本集,我们都会训练一个基学习器。这些基学习器可以是任何类型的机器学习模型,但通常选择那些对训练数据较为敏感的模型(如决策树),因为这样的模型能够更好地利用自助采样法产生的多样性。
- 由于自助采样法的随机性,每个基学习器都会看到不同的训练数据,因此它们之间是相互独立的。
- 结合预测结果:
- 当需要对新的数据点进行预测时,每个基学习器都会给出一个预测结果。对于分类问题,这通常是一个类别标签;对于回归问题,这通常是一个数值预测。
- Bagging通过平均(对于回归问题)或投票(对于分类问题)的方式将这些预测结果结合起来,从而得到一个最终的预测结果。
- 通过结合多个基学习器的预测结果,Bagging能够降低模型的方差,提高预测的稳定性。同时,由于每个基学习器都是基于不同的训练数据训练的,因此它们之间的多样性也能够提高模型的泛化能力。
- 并行计算:
- 由于Bagging中的基学习器是相互独立的,因此它们可以并行地进行训练。这大大提高了Bagging算法的计算效率,使得它能够处理大规模数据集和复杂模型。
2.1.3 优点:
- 并行化处理:Bagging算法中的每个基学习器都是独立训练的,因此可以很容易地进行并行化处理。这意味着可以同时训练多个基学习器,从而加快模型的训练速度。
- 减少方差:由于Bagging算法通过随机抽样生成多个训练子集,并使用这些子集训练基学习器,因此可以减少模型的方差。这意味着Bagging算法对于噪声数据和异常值更加鲁棒。
- 简单有效:Bagging算法的实现相对简单,不需要像Boosting算法那样调整样本权重或基学习器的权重。这使得Bagging算法在实际应用中更加容易实现和使用。
2.1.4 缺点:
- 可能无法降低偏差:与Boosting算法相比,Bagging算法主要关注于降低模型的方差,而不是偏差。如果基学习器的偏差较高,那么Bagging算法可能无法有效地降低整个模型的偏差。
- 对基学习器的性能依赖:Bagging算法的性能取决于基学习器的性能。如果基学习器的性能较差,那么即使使用Bagging算法进行集成,也可能无法获得很好的性能。
2.2 Boosting(Boosting Method)
2.2.1 基本思想
基本思想:核心理念是通过迭代地调整训练数据的权重或分布,将多个弱学习器(即性能相对较低的模型)组合成一个强学习器(即性能显著提升的模型),从而提高预测精度和泛化能力。
2.2.2 特点
- 迭代训练:Boosting算法采用迭代的方式,逐步构建多个弱学习器。在每一次迭代中,都会根据前一个弱学习器的性能对训练数据进行调整,并基于调整后的数据训练新的弱学习器。
- 权重调整:Boosting算法的核心在于对训练数据的权重进行调整。在每一次迭代中,被前一个弱学习器错误分类的样本会被赋予更高的权重,使得新的弱学习器能够更加关注这些难以分类的样本。通过这种方式,Boosting算法能够逐步改善对难分类样本的预测效果。
- 基学习器组合:在训练得到多个弱学习器后,Boosting算法会将它们进行组合,形成一个强学习器。组合的方式通常是加权组合,即根据每个弱学习器的性能赋予不同的权重。权重的大小通常与弱学习器的性能成正比,性能越好的弱学习器权重越高。
- 目标:Boosting算法的主要目标是提高学习算法的精度和鲁棒性。通过迭代地训练和调整多个弱学习器,Boosting算法能够逐步逼近最优解,从而得到一个性能优异的强学习器。
2.2.3 优点
- 更高的准确率:Boosting算法通常通过迭代地训练多个弱分类器,并对每个分类器赋予不同的权重,从而组合成一个强分类器。这种方法可以逐步减少偏差,并提高模型的准确率。相比之下,Bagging算法通过并行地训练多个弱分类器,并对它们的预测结果进行平均或投票,虽然可以提高模型的稳定性,但在某些情况下可能不如Boosting算法准确。
- 对难分类样本的关注:Boosting算法在训练过程中会关注那些被之前分类器错误分类的样本,并给予它们更高的权重。这种机制有助于模型更加关注那些难以分类的样本,从而提高模型对这些样本的预测能力。相比之下,Bagging算法在训练过程中对每个样本的权重是相等的,无法直接关注难分类样本。
- 灵活性和适应性:Boosting算法对弱分类器的选择没有严格限制,可以根据具体问题选择合适的弱分类器。此外,Boosting算法还允许使用不同的损失函数和正则化项来适应不同的任务需求,具有较强的灵活性和适应性。相比之下,Bagging算法通常使用相同的弱分类器和训练过程,其灵活性和适应性可能不如Boosting算法。
2.2.4 缺点
- 对离群点敏感:Boosting算法在迭代过程中会逐步增加对错误分类样本的权重,这可能导致算法对离群点或噪声数据过于敏感。因为离群点往往会被错误分类,所以在后续的迭代中,它们的权重会不断增加,进而影响整个模型的性能。
- 过拟合风险:由于Boosting算法在训练过程中会逐步逼近最优解,因此存在过拟合的风险。如果模型过于复杂或者训练数据中存在噪声,那么Boosting算法可能会过度拟合训练数据,导致在测试集上的性能下降。
- 计算复杂度高:Boosting算法通常需要迭代多次才能收敛,而且每次迭代都需要重新训练一个新的弱学习器,因此计算复杂度较高。对于大规模数据集或者复杂的模型,Boosting算法可能需要较长的训练时间。
- 难以并行化:由于Boosting算法中的每个弱学习器都是基于前一个学习器的结果进行训练的,因此难以进行并行化处理。这限制了Boosting算法在处理大规模数据集时的效率。
- 依赖弱学习器的选择:Boosting算法的性能在很大程度上取决于所选择的弱学习器。如果弱学习器的性能较差,那么即使通过Boosting算法进行组合,也难以得到性能优异的强学习器。因此,在选择弱学习器时需要谨慎考虑。
当数据集较大且存在噪声时,Bagging算法可能更加适合,因为它可以通过并行化训练提高计算效率,并通过降低方差来提高模型的稳定性。而在某些情况下,如当数据集较小或需要提高模型的准确率时,Boosting算法可能更加适合。
2.3 Stacking
2.3.1 核心思想
核心思想是将多个基础模型的预测结果作为输入,通过元模型(或称为次级学习器)来整合这些预测结果,以得到最终的集成预测结果。这种方法可以有效地提高模型的预测性能,因为它能够结合多个模型的优势,降低单一模型的局限性。
2.3.2 步骤:
- 准备数据集:首先,需要将原始数据集分为训练集和测试集。训练集用于训练基础模型和元模型,而测试集则用于评估最终模型的性能。
- 训练基础模型:在训练集上,使用不同的算法或参数设置训练多个基础模型。这些基础模型可以是决策树、随机森林、支持向量机、神经网络等任何机器学习模型。每个基础模型都会对训练集进行预测,并生成预测结果。
- 构建堆叠数据集:将每个基础模型在训练集上的预测结果作为新的特征,与原始训练集的特征进行合并,构建出一个新的堆叠数据集。这个堆叠数据集将作为元模型的输入。
- 训练元模型:使用堆叠数据集训练元模型。元模型的任务是学习如何最好地组合基础模型的预测结果,以产生最终的预测。元模型可以是任何机器学习模型,如线性回归、逻辑回归、神经网络等。
- 预测和评估:使用训练好的元模型对测试集进行预测,并评估模型的性能。由于Stacking结合了多个基础模型的预测结果,因此通常能够获得比单一模型更好的预测性能。
2.3.3优势
- 提高模型的泛化能力:通过结合多个不同类型的基础模型,Stacking能够克服单个模型的局限性,提高模型的泛化能力。
- 优秀的预测性能:由于Stacking结合了多个模型的预测结果,因此通常能够获得比单一模型更准确的预测结果。
- 灵活性高:Stacking可以灵活地选择不同的基础模型和元模型,以适应不同的数据和任务需求。
然而,Stacking也存在一些缺点,如训练时间较长、对基础模型的选择和参数调优要求较高等。因此,在实际应用中需要根据具体的问题和数据集来选择合适的Stacking方法,并进行适当的调优工作。
3 随机森林算法(Random Forests)
随机森林算法是一种集成学习方法,它利用多个决策树来进行分类或回归。这种算法由Leo Breiman和Adele Cutler在2001年提出,通过构建多棵决策树并集成它们的预测结果,以提高模型的稳定性和预测精度。
3.1 核心思想
随机森林算法的核心思想是利用集成学习的方法,通过构建多棵决策树(决策树算法详解),并将它们的预测结果进行集成,从而提高模型的稳定性和预测精度。
在随机森林算法中,每棵决策树都是基于原始数据集的随机子集进行训练的,同时,在构建每棵树的每个节点时,也仅随机选择一部分特征进行分裂。
3.2 步骤
- 随机采样:随机森林算法首先对原始数据集进行随机采样,生成多个不同的训练子集。每个训练子集都用于训练一棵决策树。这种随机性有助于降低模型对特定数据的过拟合风险。
- 随机特征选择:在构建每棵决策树时,随机森林算法不会使用所有的特征,而是从所有特征中随机选择一部分特征来构建决策树。这有助于增加模型的多样性,并减少过拟合的风险。
- 构建决策树:在选定的特征和训练子集上,随机森林算法会构建多棵决策树。每棵决策树都会独立地进行训练和预测。
- 集成预测结果:对于分类问题,随机森林算法会将所有决策树的预测结果进行投票,得票最多的类别作为最终的预测结果;对于回归问题,随机森林算法会将所有决策树的预测结果进行平均,得到最终的预测值。
3.3 优点
- 高准确度:通过集成多棵决策树的预测结果,随机森林算法通常能够获得比单一决策树更高的预测精度。
- 处理大量数据:随机森林算法对大规模数据集的处理能力较强,可以高效地处理大量数据。
- 评估特征重要性:在训练过程中,随机森林算法可以评估每个特征对预测结果的重要性,这对于特征选择和理解模型的工作原理非常有用。
- 鲁棒性:随机森林算法对噪声和异常值具有较强的鲁棒性,因为每个决策树都是基于随机子集进行训练的,从而减少了特定数据点对整体模型的影响。
3.3 API
3.3.1 api
sklearn.ensemble.RandomForestClassifier()
3.3.2 主要参数
n_estimators
:整数,可选(默认值=100)。森林中树的数量。
criterion
:字符串,可选(默认值="gini")。分割特征的准则。可以是 "gini" 或 "entropy"。
max_depth
:整数或None,可选(默认值=None)。树的最大深度。如果为None,则树将展开到所有叶子都是纯的,或者直到所有叶子包含少于min_samples_split
的样本。
min_samples_split
:整数或浮点数,可选(默认值=2)。分裂内部节点所需的最小样本数。
- 如果节点样本数少于
min_samples_split,则不会再划分
如果样本量不大,不需要设置这个值
如果样本数量级非常大,则推荐增大这个值
min_samples_leaf
:整数或浮点数,可选(默认值=1)。叶节点所需的最小样本数。
- 如果叶子节点数目小于样本数,则会和兄弟节点一起被剪枝
- 较小的叶子节点样本数量使模型更容易捕捉训练数据中的噪声
max_features
:字符串或整数,可选(默认值="auto")。
- 寻找最佳分割时要考虑的特征数量。如果是整数,则在每次拆分时考虑
max_features
个特征。 - 如果是"auto",则
max_features=sqrt(n_features)
。 - 如果是"sqrt",则
max_features=sqrt(n_features)
(对于分类任务)或max_features=n_features
(对于回归任务)。 - 如果是"log2",则
max_features=log2(n_features)
。如果是None,则max_features=n_features
。
bootstrap
:布尔值,可选(默认值=True)。是否在构建树时使用自助抽样。
oob_score
:布尔值,可选(默认值=False)。是否使用袋外样本来估计泛化误差。
3.3.3 基本步骤
- 导入
RandomForestClassifier
类。 - 创建
RandomForestClassifier
的实例,并设置所需的参数。 - 使用训练数据拟合模型(即训练模型)。
- 使用模型进行预测。
- 评估模型的性能。
3.3.4 代码实现
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建随机森林分类器实例
clf = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 进行预测
y_pred = clf.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
未完待续~