树模型总结

树模型

  1. 决策树
    回归树和分类树,核心是根据特征和信息对样本空间进行划分
    —分类树:穷举每一个feature的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的熵最大的feature和阈值,到叶子节点后,进行投票
    回归树:穷举每一个feature的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的最小化均方差–如(每个人的年龄-预测年龄)^2 的总和 / N,重复这个过程直到停止条件。最终模型如下。
    在这里插入图片描述
    —预测时,若x属于Rj,则预测结果为cj。代码实现时,根据特征和分割点,逐个结点判断x属于的R。
    CART先求每棵子树的alpha,然后再根据求得的alpha计算测试数据的测试误差。

  1. 随机森林
    核心是bootstrap和bagging,袋外数据做验证
    —样本bootstrap
    —袋外数据做验证
    —特征bootstrap
    —bagging弱分类器加权形成强分类器
  2. AdaBoost
    AdaBoost是自适应提升决策树,核心是加权,bagging
    —提高那些被前一轮弱分类器错误分类样本的权值
    —加大分类误差率小的弱分类器的权值
  3. GBDT
    GBDT是梯度提升决策树,核心是梯度和boosting
    —梯度:每个样本的残差形成的向量,如有四个样本,则梯度为[1,2,-1,-2]
    —树的类型:GBDT中的树都是回归树,不是分类树
    —Y变化:每一棵树学的是之前所有树结论和的残差,即因变量y变为负的梯度
    —Shrinkage:本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,即学习率step,但和Gradient并没有关系
    —损失函数的数值优化可以看成是在函数空间,目标是学习最优的函数
    原理原理+案例
    代码

&&&AdaBoost是通过提升错分数据点的权重来定位模型的不足而Gradient Boosting是通过算梯度(gradient)来定位模型的不足
5. XGBOOST
Xgboost是添加惩罚项的GBDT,核心是惩罚项。
—Xgboost是GB算法的高效实现
—基学习器可以是CART(GBDT),也可以是线性模型(GBlinear)
—给定参数λ和γ,每棵树之前的所有树都已经计算出来的,因此相应的式子都可以看作常数项,gi和hi都可以计算出来,最后的目标函数化简为:
在这里插入图片描述
在分割时,就可以根据gain来寻找最优分割变量及最优分割点。
在这里插入图片描述
6. LightGBM
LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架。核心是GOSS(去掉小梯度的样本)和EFB(捆绑互斥的特征)。
—为什么叫lightgbm,因为快像灯(light)一样快
—2017年1月,微软发布首个稳定版LightGBM
—预测效果与xgboost相当,速度快8倍左右,内存小8倍左右
------直方图算法、做差
------GOSS
------EFB
------leaf-wise
------支持类别特征
------支持并行学习
7. 其他
pGBRT梯度提升回归树
gcforest(stacking)
二、模型评价及参数优化方法

  1. 交叉验证
    交叉验证(Cross Validation)是用来验证模型性能一种统计分析方法,基本思想是原始数据(dataset)进行分组,一部分做为训练集(training set),另一部分做为验证集(validation set),首先用训练集对模型进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。
    需要注意的是:当有额外的测试集时,可以对原始训练数据直接进行交叉验证。
    当没有额外的测试集时,需要将原始数据拆分为训练集和测试集,对训练集进行交叉验证。
    此外,为了防止过合,有额外的测试集时,也可以将原始数据进行拆分,只用一部分数据进行训练,但通常这样减少了数据量,笔者不建议采用。
    有以下几种具体实现方法:
    ----Hold-Out Method。
    将数据随机分成两份,一份作训练集用来训练模型,一份用作测试集用来评估模型,不是严格意义上的交叉验证。
    ----K-fold Cross Validation(K-折交叉验证,记为K-CV)
    将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。这K个模型超参数是相同的,目的就是为了评价该超参数确定的模型的好坏,但参数可以不同,可以由模型训练出来。
    ----Leave-One-Out Cross Validation(记为LOO-CV)
    每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。
    ----可以用来干什么?交叉验证可以用来选择超参。对一个超参确定不同的取值,对每种取值进行交叉验证,即在进行k次训练和测试,得到k个性能指标,可以求出这k个性能指标的均值和方差作为此超参值的性能。
    ----sklearn中的相关函数
    train_test_split----Hold-Out-Method
    cross_val_score(model, X, Y, cv=5)#返回的是评测效果,默认scoring=‘f1_macro’
    cross_val_predict#每一个训练样本的预测结果
    KFold:kf = KFold(n_splits=2),for train, test in kf.split(X):n_splits子样本个数
    LeaveOneOut:loo = LeaveOneOut(),for train, test in loo.split(X):
    LeavePOut
    ShuffleSplit:ss = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)有放回的抽样
    StratifiedKFold:StratifiedKFold(n_splits=3)无放回抽样,指定分组,可实现分层抽样
    GroupKFold:gkf = GroupKFold(n_splits=3),gkf.split(X,y,groups=groups):
    TimeSeriesSplit
  2. 网格搜索
    也叫超参数搜索,是用来调参的,每组超参数都采用交叉验证来进行估计
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
    param={‘n_neighbors’:[3,5,10]}
    knn = KNeighborsClassifier()
    gc = GridSearchCV(knn,param_grid=param,cv=2)
    gc.fit(x_train,y_train)
    网格搜索中的交叉验证只用分割出来的训练数据,分割出的测试数据做最后的验证。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值