前言
上星期写了Kaggle竞赛的详细介绍及入门指导,但对于真正想要玩这个竞赛的伙伴,机器学习中的相关算法是必不可少的,即使是你不想获得名次和奖牌。那么,从本周开始,我将介绍在Kaggle比赛中的最基本的也是运用最广的机器学习算法,很多项目用这些基本的模型就能解决基础问题了。
那么,今天就开始更新集成学习之Gradient Boosting梯度提升。
一、集成学习的思路
共 3 种思路:
- Bagging:独立的集成多个模型,每个模型有一定的差异,最终综合有差异的模型的结果,获得学习的最终的结果;
- Boosting(增强集成学习):集成多个模型,每个模型都在尝试增强(Boosting)整体的效果;
- Stacking(堆叠):集成 k 个模型,得到 k 个预测结果,将 k 个预测结果再传给一个新的算法,得到的结果为集成系统最终的预测结果;
图1 集成模型
学习Gradient Boosting之前,我们先来了解一下增强集成学习(Boosting)思想:
- 先构建,后结合
- 个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,然后使用组合策略,得到最终的集成模型,这就是boosting的思想
图2 增强集成学习思想图示
二、增强集成学习(Boosting)
1. 基础理解
- Boosting 类的集成学习,主要有:Ada Boosting 和 Gradient Boosting 两类;
- 由于每个子模型要使用全部的数据集进行训练,因此 Ada Boosting 算法中没有 oob 数据集,在使用 Ada Boosting 算法前,需要划分数据集:train_test_split;
- 每个 Ada Boosting 集成学习算法的模型只使用一个基本算法进行训练子模型;
- 相对于集成学习方法,决策树算法、SVM 算法、逻辑回归算法等,称为基本的学习方法;
2. Ada Boosting 集成学习算法
AdaBoost详细学习可参考机器学习----集成学习(Boosting)https://blog.csdn.net/love_wanling/article/details/70238403
2.1 思想
图3 Ada Boosting算法思想图示
- 假设是一个回归问题:图的最下层代表全部的训练数据集,深色的点为模型预测错误的点,定义为权重高样本,需要下一次生成的子模型时被重点对待;浅色的点为模型预测成功的点,定义为权重低样本;
- 图的中间层代表一种基本算法;
- 图的最上层代表算法根据拥有不同权重的样本的数据集,所训练出的模型;
- 箭头表示不同的子模型按一定规律生成;
解释上图过程(Ada Boosting 的思路):第一次进行学习得到第一个子模型,根据第一子模型的预测结果重新定义数据集——将预测错误的点(深色点)划分较高权重,将预测成功的点(浅色点)划分较低权重;第二次进行学习时,使用上一次学习后被重新定义的数据集进行训练,再根据模型的预测结果重新定义数据集——将预测错误的点(深色点)划分较高权重,将预测成功的点(浅色点)划分较低权重;以此类推,最终得到 n 个子模型;
主要原理: 通过给已有模型预测错误的样本更高的权重,不断更新样本数据分布,每轮训练中(根据训练后的分类对错,调整样本权重)为每个训练样本重新赋予一个权重。
2.2 特点:
- 每一次生成的子模型都在想办法弥补上一次生成的子模型没有成功预测到的样本点,或者说是弥补上一子模型所犯的错误;也可以说,每一个子模型都在想办法推动(Boosting)整个基础系统,使得整个集成系统准确率更高;
- 每一个子模型都是基于同一数据集的样本点,只是样本点的权重不同,也就是样本对于每一个子模型的重要程度不同,因此每份子模型也是有差异的;最终以所有子模型综合投票的结果作为 Ada Boosting 模型的最终学习结果;
怎么为样本赋权值,让下一子模型对不同权值的样本区别对待?
2.3 Python实现
scikit-learn 中封装的 Ada Boosting 集成学习算法:
AdaBoostClassifier(): 解决分类问题;
AdaBoostRegressor(): 解决回归问题;
使用格式:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2), n_estimators=500) ada_clf.fit(X_train, y_train)
注:AdaBoostingClassifier() 的参数的使用可查文档;
请接下文继续阅读,讲解集成学习GBDT(Gradient Boosting Decision Tree)。
参考文献:
————————————————
[1] 机器学习之集成学习(四)GBDT 原文链接:https://blog.csdn.net/ivy_reny/article/details/79290745
[2] 集成学习,adaboosting与Gradient Boosting 原理解析 原文链接:
https://blog.csdn.net/zhuimeng999/article/details/80387078
[3] 机器学习:集成学习(Ada Boosting 和 Gradient Boosting) 原文链接:
https://www.cnblogs.com/volcao/p/9490651.html
[4] 机器学习集成学习算法——boosting系列 原文链接:https://blog.csdn.net/myy1012010626/article/details/80793074
[4] 机器学习相关知识整理系列之三:Boosting算法原理,GBDT&XGBoost 原文链接: