看了一下周志华老师讲的boosting25年报告(B站),讲的真的很棒,但是有写还是有点不能理解彻底,在这里推荐一下,没事可以多看看。
对于Adaboost来说,解决上述的两个问题的方式是:
使用最简单的鸢尾花的数据集进行分析:
# 引入数据科学相关工具包: import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.style.use("ggplot") %matplotlib inline import seaborn as sns 1234567
# 加载训练数据: data = pd.read_csv("iris.csv") data.columns = ['Sepal.Length','Sepal.Width','Petal.Length','Petal.Width','Species'] 123
print("Species",np.unique(data["Species"])) data.head() 12
# 数据预处理 # 仅仅考虑2,3类葡萄酒,去除1类 wine = data[data['Species'] != 0] y = data['Species'].values X = data[['Sepal.Length','Sepal.Width']].values # 将分类标签变成二进制编码: from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y = le.fit_transform(y) # 按8:2分割训练集和测试集 # stratify参数代表了按照y的类别等比例抽样 from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1,stratify=y) 123456789101112131415
# 使用单一决策树建模 from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=1) from sklearn.metrics import accuracy_score tree = tree.fit(X_train,y_train) y_train_pred = tree.predict(X_train) y_test_pred = tree.predict(X_test) tree_train = accuracy_score(y_train,y_train_pred) tree_test = accuracy_score(y_test,y_test_pred) print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test)) 12345678910
Decision tree train/test accuracies 0.916/0.875
使用sklearn实现Adaboost(基分类器为决策树) ''' AdaBoostClassifier相关参数: base_estimator:基本分类器,默认为DecisionTreeClassifier(max_depth=1) n_estimators:终止迭代的次数 learning_rate:学习率 algorithm:训练的相关算法,{'SAMME','SAMME.R'},默认='SAMME.R' random_state:随机种子 ''' from sklearn.ensemble import AdaBoostClassifier ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=1) ada = ada.fit(X_train,y_train) y_train_pred = ada.predict(X_train) y_test_pred = ada.predict(X_test) ada_train = accuracy_score(y_train,y_train_pred) ada_test = accuracy_score(y_test,y_test_pred) print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))
1234567891011121314151617Adaboost train/test accuracies 1.000/0.917
结果分析:单层决策树似乎对训练数据欠拟合,而Adaboost模型正确地预测了训练数据的所有分类标签,而且与单层决策树相比,Adaboost的测试性能也略有提高。然而,为什么模型在训练集和测试集的性能相差这么大呢?我们使用图像来简单说明下这个道理!
# 画出单层决策树与Adaboost的决策边界: x_min = X_train[:, 0].min() - 1 x_max = X_train[:, 0].max() + 1 y_min = X_train[:, 1].min() - 1 y_max = X_train[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1)) f, axarr = plt.subplots(nrows=1, ncols=2,sharex='col',sharey='row',figsize=(12, 6)) for idx, clf, tt in zip([0, 1],[tree, ada],['Decision tree', 'Adaboost']): clf.fit(X_train, y_train) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) axarr[idx].contourf(xx, yy, Z, alpha=0.3) axarr[idx].scatter(X_train[y_train==0, 0],X_train[y_train==0, 1],c='blue', marker='^') axarr[idx].scatter(X_train[y_train==1, 0],X_train[y_train==1, 1],c='red', marker='o') axarr[idx].set_title(tt) axarr[0].set_ylabel('Alcohol', fontsize=12) plt.tight_layout() plt.text(0, -0.2,s='Sepal.Width',ha='center',va='center',fontsize=12,transform=axarr[1].transAxes) plt.show()
12345678910111213141516171819
从上面的决策边界图可以看到:Adaboost模型的决策边界比单层决策树的决策边界要复杂的多。也就是说,Adaboost试图用增加模型复杂度而降低偏差的方式去减少总误差,但是过程中引入了方差,可能出现过拟合,因此在训练集和测试集之间的性能存在较大的差距,这就简单地回答的刚刚问题。值的注意的是:与单个分类器相比,Adaboost等Boosting模型增加了计算的复杂度,在实践中需要仔细思考是否愿意为预测性能的相对改善而增加计算成本,而且Boosting方式无法做到现在流行的并行计算的方式进行训练,因为每一步迭代都要基于上一部的基本分类器。
推荐博客和视频:
https://zhuanlan.zhihu.com/p/27126737
https://www.bilibili.com/video/BV1Cs411c7Ztfrom=search&seid=17605151703335311695
https://link.medium.com/udXDrLndAfb
相关知识
Adaboost实现鸢尾花分类
如何降低数据噪声对机器学习的影响
基于卷积神经网络和集成学习的材质识别和分割方法研究
金属集成墙板,集成装饰墙板,集成墙面
03
环保集成墙面是什么 环保集成墙面有什么优缺点
构建智能化玉米病虫害检测系统:深度学习与实时UI集成详解
Python学习:作业03
机器学习算法应用于智能农业植物病虫害检测.pptx
有了华帝集成烹饪中心,家常便饭也可以新奇趣味
网址: 集成学习03:Boosting https://m.huajiangbk.com/newsview546463.html
上一篇: 对鸢尾花数据用matlab实现K |
下一篇: 花西子销售数据分析报告,揭示销售 |