前言:简单介绍集成学习,无公式推导,并用sklearn实现,参考博文链接
机器学习专栏:机器学习专栏
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
集成方法是将几种机器学习技术组合成一个预测模型的算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。
Bagging(bootstrap aggregating,装袋)是并行式集成学习方法代表。
随机森林是Bagging的一个拓展,RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即 bootstrap 样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。
因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。
# -*- coding:utf-8 -*-
"""
@author: Tao_RY
@file: RF.py
@time: 2020-04-16 00:18:18
"""
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
df = pd.read_csv(r"C:\Users\1\WorkSpace\python\machine learning\data\iris.csv", sep=',')
iris_data = df.iloc[:, 0:3]
iris_target = df.iloc[:, 4]
iris_data_train, iris_data_test, iris_target_train, iris_target_test = train_test_split(iris_data, iris_target,
train_size=.80)
model = RandomForestClassifier(n_estimators=1000)
model.fit(iris_data_train, iris_target_train) # 创建一个随机森林
y_predict = model.predict(iris_data_test) # 对新的样本Z做预测
print('accuracy_score:', accuracy_score(iris_target_test, y_predict))
其主要思想是将弱分类器组装成一个强分类器。在PAC(probably approximately correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。通过加法模型将弱分类器进行线性组合。
刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
# -*- coding:utf-8 -*-
"""
@author: Tao_RY
@file: adaboost.py
@time: 2020-04-16 00:44:16
"""
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
df = pd.read_csv(r"C:\Users\1\WorkSpace\python\machine learning\data\iris.csv", sep=',')
iris_data = df.iloc[:, 0:3]
iris_target = df.iloc[:, 4]
iris_data_train, iris_data_test, iris_target_train, iris_target_test = train_test_split(iris_data, iris_target,
train_size=.80)
model = AdaBoostClassifier(n_estimators=1000)
model.fit(iris_data_train, iris_target_train)
y_predict = model.predict(iris_data_test)
print('accuracy_score:', accuracy_score(y_predict, iris_target_test))
GBDT(梯度提升迭代决策树)每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算法上一篇文章已经介绍);区别如下:AdaBoost 算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT 也是迭代,但是 GBDT 要求弱学习器必须是 CART 模型,而且 GBDT 在模型训练的时候,是要求模型预测的样本损失尽可能的小。
# -*- coding:utf-8 -*-
"""
@author: Tao_RY
@file: GBDT.py
@time: 2020-04-16 00:51:42
"""
# -*- coding:utf-8 -*-
"""
@author: Tao_RY
@file: adaboost.py
@time: 2020-04-16 00:44:16
"""
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
df = pd.read_csv(r"C:\Users\1\WorkSpace\python\machine learning\data\iris.csv", sep=',')
iris_data = df.iloc[:, 0:3]
iris_target = df.iloc[:, 4]
iris_data_train, iris_data_test, iris_target_train, iris_target_test = train_test_split(iris_data, iris_target,
train_size=.80)
model = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
model.fit(iris_data_train, iris_target_train)
y_predict = model.predict(iris_data_test)
print('accuracy_score:', accuracy_score(y_predict, iris_target_test))