【系列开头】开这个系列是因为最近学习某些算法纸上谈兵太久,算法流程背的再熟,没有实现过就没法真正的理解算法的细节。这个系列要实现算法的顺序为逻辑回归、决策树(CART)、AdaBoost、GBDT。其他算法根据后续学习情况进行添加。
AdaBoost是一种二分类的方法,实现起来十分简单,却能大大提升决策树的性能,不得不说十分神奇,至于为什么会有这种效果,书上都有证明,这里只给出算法实现。
代码的步骤主要就是计算样本权重和基分类器的权重。
- 初始化
import numpy as np
from sklearn.tree import DecisionTreeClassifier
class AdaBoostClassifier:
def __init__(self, n_estimators=5):
self.n_estimators = n_estimators
self.estimators_ = [DecisionTreeClassifier(max_depth=1) for _ in range(self.n_estimators)]
self.estimators_weights_ = [None] * self.n_estimators
- 更新参数
def __update_w(self, w, y_true, y_pred):
weight_err = np.sum(w * (y_true != y_pred)) / np.sum(w)
alpha = np.log(1 / weight_err - 1)
w = w * np.exp(alpha * (y_true != y_pred))
w = w / np.sum(w)
return w, alpha
- 拟合与预测
def fit(self, X_train, y_train):
y_train[y_train == 0] = -1
n_samples, n_features = X_train.shape
w = np.array([1 / n_samples