当前位置:   article > 正文

机器学习 --- Adaboost_#encoding=utf8 from sklearn.tree import decisiontr

#encoding=utf8 from sklearn.tree import decisiontreeclassifier from sklearn.

Educoder机器学习 --- Adaboost实训作业答案详解

目录

 Boosting

 第1关:Boosting

第2关:Adaboost算法 

第3关:sklearn中的Adaboost 

 Boosting


什么是集成学习

集成学习方法是一种常用的机器学习方法,分为 bagging 与 boosting 两种方法,应用十分广泛。集成学习基本思想是:对于一个复杂的学习任务,我们首先构造多个简单的学习模型,然后再把这些简单模型组合成一个高效的学习模型。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。

集成学习采取投票的方式来综合多个简单模型的结果,按 bagging 投票思想,如下面例子:

假设一共训练了 5 个简单模型,每个模型对分类结果预测如上图,则最终预测结果为: A:2 B:3 3>2 结果为 B

不过在有的时候,每个模型对分类结果的确定性不一样,即有的对分类结果非常肯定,有的不是很肯定,说明每个模型投的一票应该是有相应的权重来衡量这一票的重要性。就像在歌手比赛中,每个观众投的票记 1 分,而专家投票记 10 分。按 boosting 投票思想,如下例:

A:(0.9+0.4+0.3+0.8+0.2)/5=0.52 B:(0.1+0.6+0.7+0.2+0.8)/5=0.48 0.52>0.48 结果为 A

Boosting

提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。

历史上, Kearns 和 Valiant 首先提出了强可学习弱可学习的概念。指出:在 PAC 学习的框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是 Schapire 后来证明强可学习与弱可学习是等价的,也就是说,在 PAC 学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。

这样一来,问题便成为,在学习中,如果已经发现了弱学习算法,那么能否将它提升强学习算法。大家知道,发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。

与 bagging 不同, boosting 采用的是一个串行训练的方法。首先,它训练出一个弱分类器,然后在此基础上,再训练出一个稍好点的弱分类器,以此类推,不断的训练出多个弱分类器,最终再将这些分类器相结合,这就是 boosting 的基本思想,流程如下图:

可以看出,子模型之间存在强依赖关系,必须串行生成。 boosting 是利用不同模型的相加,构成一个更好的模型,求取模型一般都采用序列化方法,后面的模型依据前面的模型。

 第1关:Boosting


第2关:Adaboost算法 


  1. # encoding=utf8
  2. import numpy as np
  3. from sklearn.tree import DecisionTreeClassifier
  4. from sklearn.ensemble import AdaBoostClassifier
  5. # adaboost算法
  6. class AdaBoost:
  7. '''
  8. input:n_estimators(int):迭代轮数
  9. learning_rate(float):弱分类器权重缩减系数
  10. '''
  11. def __init__(self, n_estimators=50, learning_rate=1.0):
  12. self.clf_num = n_estimators
  13. self.learning_rate = learning_rate
  14. def init_args(self, datasets, labels):
  15. self.X = datasets
  16. self.Y = labels
  17. self.M, self.N = datasets.shape
  18. # 弱分类器数目和集合
  19. self.clf_sets = []
  20. # 初始化weights
  21. self.weights = [1.0 / self.M] * self.M
  22. # G(x)系数 alpha
  23. self.alpha = []
  24. # ********* Begin *********#
  25. def _G(self, features, labels, weights):
  26. '''
  27. input:features(ndarray):数据特征
  28. labels(ndarray):数据标签
  29. weights(ndarray):样本权重系数
  30. '''
  31. e = 0
  32. for i in range(weights.shape[0]):
  33. if (labels[i] == self.G(self.X[i], self.clif_sets, self.alpha)):
  34. e += weights[i]
  35. return e
  36. # 计算alpha
  37. def _alpha(self, error):
  38. return 0.5 * np.log((1 - error) / error)
  39. # 规范化因子
  40. def _Z(self, weights, a, clf):
  41. return np.sum(weights * np.exp(-a * self.Y * self.G(self.X, clf, self.alpha)))
  42. # 权值更新
  43. def _w(self, a, clf, Z):
  44. w = np.zeros(self.weights.shape)
  45. for i in range(self.M):
  46. w[i] = weights[i] * np.exp(-a * self.Y[i] * G(x, clf, self.alpha)) / Z
  47. self.weights = w
  48. # G(x)的线性组合
  49. def G(self, x, v, direct):
  50. result = 0
  51. x = x.reshape(1, -1)
  52. for i in range(len(v)):
  53. result += v[i].predict(x) * direct[i]
  54. return result
  55. def fit(self, X, y):
  56. '''
  57. X(ndarray):训练数据
  58. y(ndarray):训练标签
  59. '''
  60. # 计算G(x)系数a
  61. self.init_args(X, y)
  62. '''
  63. for i in range(100):
  64. classifier = DecisionTreeClassifier(max_depth=3)
  65. classifier.fit(X, y)
  66. self.clf_sets.append(classifier)
  67. e = 0
  68. for i in range(len(self.weights)):
  69. temp = -1
  70. if classifier.predict(X[i].reshape(1,-1))>0:
  71. temp = 1
  72. if(self.Y[i] == temp):
  73. e += self.weights[i]
  74. a = self._alpha(e)
  75. self.alpha.append(a)
  76. z = self._Z(self.weights, a, self.clf_sets)
  77. self._w(a, self.clf_sets, z)
  78. '''
  79. # 记录分类器
  80. # 规范化因子
  81. # 权值更新
  82. def predict(self, data):
  83. '''
  84. input:data(ndarray):单个样本
  85. output:预测为正样本返回+1,负样本返回-1
  86. '''
  87. ada = AdaBoostClassifier(n_estimators=100, learning_rate=0.1)
  88. ada.fit(self.X, self.Y)
  89. data = data.reshape(1, -1)
  90. predict = ada.predict(data)
  91. return predict[0]
  92. # ********* End *********#

第3关:sklearn中的Adaboost 


  1. #encoding=utf8
  2. from sklearn.tree import DecisionTreeClassifier
  3. from sklearn.ensemble import AdaBoostClassifier
  4. def ada_classifier(train_data,train_label,test_data):
  5. '''
  6. input:train_data(ndarray):训练数据
  7. train_label(ndarray):训练标签
  8. test_data(ndarray):测试标签
  9. output:predict(ndarray):预测结果
  10. '''
  11. #********* Begin *********#
  12. ada=AdaBoostClassifier(n_estimators=80,learning_rate=1.0)
  13. ada.fit(train_data,train_label)
  14. predict = ada.predict(test_data)
  15. #********* End *********#
  16. return predict

 如果采纳,谢谢您的点赞和收藏!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/293237
推荐阅读
相关标签
  

闽ICP备14008679号