数据建模中的树模型常用于分类和预测,本文简要介绍三种典型的树模型。
损失函数
先介绍一下损失函数的概念,它被广泛用做构造树时调整树形和衡量模型性能的标准,主要涉及两个概念:1)方差(variance):某一模型对不同测试集的预测结果波动程度;2)偏差(bias):某次预测结果与实际数据的差。总的来说,模型简单,偏差大、方差小,欠拟合;模型复杂,偏差小、方差大,过拟合。因此模型优化也是这样一个寻找最佳平衡点的过程。
- 决策树
决策树是一种树状结构,它的每个叶节点对应一个分类,非叶节点对应在某个属性上的划分,根据样本在该属性上的不同取值划分成若干子集。构造决策树的核心问题是每一步对样本属性如何做拆分。对于一个分类问题,从已知数据做训练,生产决策树是一个自上而下的分治过程。
from sklearn.Tree import DecisionTreeRegressor
决策树算法 | 算法描述 |
---|---|
ID3算法 | 决策树的各级节点上使用信息增益作为属性的选择标准,只适用离散变量 |
C4.5算法 | 改进ID3,使用信息增益率来选择节点,离散或连续变量都适用 |
CART算法 | Classification And Regressor Tree(分类与回归树),通过Gini**系数选择节点,通过剪枝、评估树构造一棵二叉树。当叶节点是离散量时,该树为分类树;当叶节点是连续量时,该树为回归树。 |
- 随机森林
多棵决策树组成, 基于Bagging思想,有放回抽样。每轮结果之间相互独立,因此损失函数的方差不对太大。
max_leaf_nodes
参数决定迭代次数,也就是树的深度,选取不当会导致模型过(欠)拟合,后果是虽然训练结果准确度很高,但 在实际部署时会发生意想不到的错误,这被称为数据泄露(data leakage)。二叉树并不是越深越好,太深会带来overfitting(过拟合)的问题,随机森林构造器的默认参数往往最优。
from sklearn.ensemble import RandomForestRegressor
- XGBoost
梯度提升决策树。专门处理表格型数据,如pd.DataFrame,基于Boosting。
Boosting: 初始建立M个模型,大多简单,每完成一次训练,将出错的 数据权重上升,下次重点训练,最终模型由各个子模型按权重相加,也就是说,程序越往后运行,越关注那些权重大的数据。
下面是一些关键的参数:
- n_estimator: 迭代次数,通常选较大的数,1000.
- early_stopping_rounds:
model.fit(early_stopping_rounds=5)
,当模型训练到一个理想值时自动停止训练,即使没有到n_estimator
指定的轮数 - learning_rate: 将预测结果乘以一个因子再加到下一轮,而不是简单相加
- n_jobs: 并行作业数,取计算机CPU核数
from xgboost import XGBoostRegressor
xgb = XGBRegressor(n_estimator=1000, learning_rate = 0.05, n_jobs=4)
xgb.fit(train_X, train_y, early_stopping_rounds=5)
一个问题:为什么RandomForest往往比GBDT深
GBDT每轮迭代数据都与上一轮结果有关,就信息元来说可以保证结果尽可能接近真实数据,偏差不会很大,但联系紧密的数据拟合会使得方差过大,因此需要浅一点的树来降低方差。
而基于Bagging的随机森林,各分类相互独立,受不同输入数据的影响小,目标是如何提高准确度,因此采用很深甚至不剪枝的树群。
数据挖掘小白一枚,如有错误,恳请大家指正~