作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Necati Demir博士的头像

Necati Demir博士

Necati holds a PhD degree in 机器学习 and has 14 years of experience in software development.

工作经验

17

分享

集成方法是创建多个模型,然后将它们组合起来以产生改进结果的技术. 机器学习中的集成方法通常比单一模型产生更准确的解决方案. 这在许多机器学习竞赛中都是如此, 哪些获胜的解决方案使用了集成方法. 在流行的Netflix竞赛中, 获胜者使用了集合方法 实现了一种功能强大的协同过滤算法. 另一个例子是KDD 2009,获胜者也是 使用合奏. 例如,你也可以在Kaggle比赛中找到使用这些方法的获胜者 在这里 面试的获胜者是 CrowdFlower合作竞争.

在继续本文之前,理解一些术语是很重要的. 在整篇文章中,我使用术语“模型”来描述用数据训练的算法的输出. 然后用这个模型进行预测. 这个算法可以是任意的 机器学习 算法如逻辑回归、决策树等. 这些模型, 当用作集成方法的输入时, 都叫“基础模型”吗,,最终的结果就是一个整体模型.

在这篇博文中,我将介绍用于分类的集成方法,并描述一些众所周知的集成方法:投票, 叠加, 装袋和增压.

基于投票和平均的集成方法

投票和平均是机器学习中集成学习的两个最简单的例子. 它们都易于理解和实现. 投票用于分类,平均用于回归.

基于投票和平均的集成方法

两种方法, 第一步是使用一些训练数据集创建多个分类/回归模型. 每个基本模型可以使用相同训练数据集和相同算法的不同分割来创建, 或者使用不同算法的相同数据集, 或者其他方法. 下面的python式伪代码展示了用不同的算法使用相同的训练数据集.

Train = load_csv(" Train . csv ".csv”)
Target = train[" Target "]
火车=火车.下降(“目标”)
测试= load_csv("测试.csv”)

算法= [logistic_regression, decision_tree_classification, ...#for分类
算法= [linear_regression, decision_tree_regressor, ...#for regression

预测=矩阵(row_length=len(目标),column_length=len(算法))

对于i, enumerate(算法s)中的算法:
    [,i] =算法.fit(火车、目标).预测(测试)

根据上面的伪代码, 我们为每个模型创建预测,并将它们保存在一个称为预测的矩阵中,其中每列包含来自一个模型的预测.

多数投票

每个模型对每个测试实例进行预测(投票),最终的输出预测是获得超过一半投票的预测. 如果没有一个预测得到超过一半的选票, 我们可以说,对于这种情况,集合方法不能做出稳定的预测. 虽然这是比较流行的合奏技巧之一, 您可以尝试投票最多的预测(即使少于一半的选票)作为最终预测. 在某些文章中,您可能会看到这种方法被称为“多数投票”。.

加权投票

不像多数投票, 每个模型都有相同的权利, 我们可以增加一个或多个模型的重要性. 在加权投票中,你需要多次计算较好的模型的预测结果. 找到一组合理的重量取决于你.

简单平均

在简单平均法中, 对于测试数据集的每个实例, 计算平均预测值. 这种方法通常可以减少过拟合并创建更平滑的回归模型. 下面的伪代码代码显示了这个简单的平均方法:

Final_predictions = []
对于len(predictions)中的row_number:
    final_predictions.追加(
        意思是(预测(row_number ())
    )

加权平均

加权平均是简单平均的一个稍微改进的版本, 每个模型的预测乘以权重,然后计算它们的平均值. 下面的伪代码代码显示了加权平均:


权重= [..., ..., ...#length = len(算法)
Final_predictions = []
对于len(predictions)中的row_number:
    final_predictions.追加(
        意思是(预测(row_number() *权重)
    )

堆叠多个机器学习模型

叠加, 也称为堆叠泛化, 是一个集成方法,其中的模型是使用另一个组合 机器学习 算法. 基本思想是用训练数据集训练机器学习算法,然后用这些模型生成一个新的数据集. 然后将这个新的数据集作为组合机器学习算法的输入.

一个堆叠过程的伪代码总结如下:

Base_算法s = [logistic_regression, decision_tree_classification, ...#for分类

叠加_train_dataset = matrix(row_length=len(target), column_length=len(算法s))
叠加_test_dataset = matrix(row_length=len(test), column_length=len(算法s))


对于i, enumerate(base_算法s)中的base_算法:
    叠加_train_dataset [,i] = base_算法.fit(火车、目标).预测(火车)
    叠加_test_dataset [,i] = base_算法.预测(测试)

Final_predictions = combiner_算法.适合(叠加_train_dataset、目标).预测(叠加_test_dataset)

正如您在上面的伪代码中看到的那样, 组合算法的训练数据集是利用基本算法的输出生成的. 在伪代码中, 使用训练数据集生成基本算法,然后再次使用相同的数据集进行预测. 但是我们知道, 在现实世界中,我们不会使用相同的训练数据集进行预测, 因此,为了克服这个问题,你可能会看到一些堆叠的实现,其中训练数据集被分割. 下面你可以看到一个伪代码,其中训练数据集在训练基本算法之前被分割:

Base_算法s = [logistic_regression, decision_tree_classification, ...#for分类

叠加_train_dataset = matrix(row_length=len(target), column_length=len(算法s))
叠加_test_dataset = matrix(row_length=len(test), column_length=len(算法s))

对于i, enumerate(base_算法s)中的base_算法:
    对于trainix, testx in split(train, k=10): #您可以使用sklearn.cross_validation.KFold的sklearn库
        叠加_train_dataset [testcv,i] = base_算法.适合(火车(trainix),目标[trainix]).预测(火车[testix])
叠加_test_dataset [,i] = base_算法.适合(火车).预测(测试)


Final_predictions = combiner_算法.适合(叠加_train_dataset、目标).预测(叠加_test_dataset)

引导聚合

名称为引导聚合, 也被称为“Bagging”, 总结了这一战略的关键要素. 在bagging算法中,第一步涉及创建多个模型. 这些模型是用相同的算法生成的,数据集的随机子样本是用自举抽样方法从原始数据集随机抽取的. 在自举抽样中, 一些原始示例出现了不止一次,一些原始示例不存在于示例中. 如果你想创建一个包含m个元素的子数据集, 您应该从原始数据集中选择一个随机元素m次. 如果目标是生成n个数据集,那么这个步骤需要执行n次.

引导聚合

最后,我们有n个数据集,每个数据集的元素个数是m. 下面的python式伪代码展示了引导抽样:

Def bootstrap_sample(original_dataset, m):
    Sub_dataset = []
    对于I在(m)范围内:
        sub_dataset.追加(
            random_one_element (original_dataset)
        )
    返回sub_dataset

打包的第二步是聚合生成的模型. 众所周知的方法,如投票和平均,用于此目的.

整个伪代码看起来像这样:

Def bagging(n, m, base_算法, train_dataset, target, test_dataset):
    预测=矩阵(row_length=len(target), column_length=n)
    对于I在(n)范围内:
        Sub_dataset = bootstrap_sample(train_dataset, m)
        [,i] = base_算法.适合(original_dataset、目标).预测(test_dataset)

    Final_predictions = voting(predictions) #用于分类
    Final_predictions =回归的平均(预测)#

    返回final_predictions

在装袋中,每个子样本可以彼此独立地生成. 所以生成和训练可以并行进行.

你也可以在一些算法中找到装袋策略的实现. 例如, 随机森林 算法采用装袋技术,但有一定的区别. 随机森林使用随机特征选择, 其基本算法是决策树算法.

增强:将弱模型转换为强模型

“增强”一词用于描述能够将弱模型转换为强模型的一系列算法. 如果模型有很大的错误率,那么它就是弱模型, 但是性能不是随机的(导致错误率为0).5为二元分类). 增量增强通过使用相同的数据集训练每个模型来构建一个集成,但其中实例的权重根据上次预测的误差进行调整. 其主要思想是迫使模型专注于困难的实例. 与bagging不同,boosting是一种顺序方法,因此在这里不能使用并行操作.

增强算法的一般过程定义如下:

Def adjust_dataset(_train, errors):
    #使用最困难的实例创建新数据集
    Ix = get_highest_errors_index(火车)
    返回concat(_train[ix], random_select(train))

模型= []
_train = random_select(火车)
对于I在(n)范围内:#n轮
    Model = base_算法.适合(_train)
    预测=模型.预测(_train)
    模型.追加(模型)
    错误= calculate_error(预测)
    _train = adjust_dataset(_train, errors)

Final_predictions = combine(模型,测试)

adjust_dataset函数返回一个包含最困难实例的新数据集, 然后用什么来强迫基本算法学习.

Adaboost是一个广为人知的算法,它是一种增强方法. Adaboost的创始人赢得了 哥德尔奖 为了他们的工作. 主要是, Adaboost首选决策树算法作为基础算法,在sklearn库中Adaboost默认的基础算法是决策树(AdaBoostRegressor和AdaBoostClassifier). 正如我们在前一段所讨论的,同样的增量方法也适用于Adaboost. AdaBoost算法每一步收集的关于每个训练样本的“硬度”的信息被输入到模型中. “调整数据集”步骤与上述步骤不同,“组合模型”步骤通过加权投票计算.

结论

尽管集成方法可以通过设计复杂的算法和产生高精度的结果来帮助你赢得机器学习比赛, 在可解释性更重要的行业中,它通常不受欢迎. 尽管如此, 这些方法的有效性是不可否认的, 在适当的应用中,它们的好处是巨大的. 在医疗保健等领域, 即使是机器学习算法准确性上的微小改进也可能是真正有价值的东西.

就这一主题咨询作者或专家.
预约电话
Necati Demir博士的头像
Necati Demir博士

位于 峰会,新泽西州,美国

成员自 2015年11月17日

作者简介

Necati holds a PhD degree in 机器学习 and has 14 years of experience in software development.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

工作经验

17

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.