例:建树
∙
\bullet
∙ 根据蘑菇属性判断蘑菇有毒还是可食用:mushroom.csv
P代表有毒,e代表可食用。
∙
\bullet
∙ 将类别型特征进行标签编码:LabelEncoder。Scikit-Learn要求输入为数值特征。
Scikit-Learn中需要的是数字输入,所以就转换为数字了。对于颜色这样本身无序的特征,如果是线性回归、Logistic回归,由于是要与w进行乘积的,是不能用LabelEncode编码乘有序数字。那如果不能这样,又该怎么做呢?但在决策树里,由于只需要判断是否等于大于小于,所以变成数字也没关系,因为数字不同就是原来的取值是不同的,所以不一定要用独热编码,用LabelEncode也是可以的,若非要用OneHot编码也是可以的。那么问题来了,LabelEncode、OneHot的使用场景是什么?线性回归、Logistic回归里对颜色一类的应该如何编码?
∙
\bullet
∙ 对连续属性进行升序排序,只有在决策属性(即分类发生了变化)发生改变的地方才需要切开,这可以显著减少运算量。
1)对特征的取值进行升序排序
2)两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的Gini指数。
3)选择Gini指数最小的分裂点作为该特征的最佳分裂点。
若特征有12个取值,则会有11个分裂点,我怎么觉得应该是12个分裂点呢。排序后,原则上是特征不同取值间都作为一个分裂点进行检测,但为了提高性能,可以在y发生变化的地方,才进行检测。PPT里的决策属性,指的就是y
在计算按特定特征和特定阈值分裂的Gini指数,应该是将分裂后的两个节点各自的Gini指数按照各自样本占比进行加权组合吧?
各节点选取样本最多的那个分类作为本节点的预测分类。
建树停止条件
建树过程是一个自顶向下的递归过程。
递归的停止条件:
∙
\bullet
∙ 分裂带来的损失的减小太小:损失的减少量可定义为:
Δ
=
c
o
s
t
(
D
)
−
(
∣
D
L
∣
∣
D
∣
c
o
s
t
(
D
L
)
+
∣
D
R
∣
∣
D
∣
c
o
s
t
(
D
R
)
)
\Delta = cost(D) - (\frac{|D_L|}{|D|}cost(D_L) + \frac{|D_R|}{|D|}cost(D_R))
Δ=cost(D)−(∣D∣∣DL∣cost(DL)+∣D∣∣DR∣cost(DR))
∙
\bullet
∙ 树的深度超过了最大深度
∙
\bullet
∙ 左/右分支的样本分布足够纯净
∙
\bullet
∙ 左/右分支中样本数目足够少
除了上述四点,老师还讲到了gini指数最少减少量,叶子节点数目。那个计算公式没讲。
剪枝
∙
\bullet
∙ 分类回归树算法容易过拟合,通过剪枝取出部分分支,降低模型复杂度。
∙
\bullet
∙ 剪枝:给定一个完全树,自底向上进行剪枝,直到根节点。
∙
\bullet
∙ 剪枝准则:
1)形式同机器学习模型的目标函数:
J
(
θ
,
λ
)
=
∑
i
=
1
N
L
(
f
(
x
i
;
θ
)
,
y
i
)
+
λ
R
(
θ
)
J(\theta, \lambda) = \sum_{i=1}^{N}L(f(\mathbf x_i;\theta), y_i) + \lambda R(\theta)
J(θ,λ)=i=1∑NL(f(xi;θ),yi)+λR(θ)
2)当
α
\alpha
α从0开始增大,树的一些分支被剪掉,得到不同
α
\alpha
α对应的树
3)采用交叉验证得到最佳的
α
\alpha
α
剪枝可以看目标函数是否更小,如果更小可以去除子节点。目标函数大的形式跟之前的线性、 Logistic回归都差不多,分别是误差项和复杂度(正则项)。T可以是树节点的数目,也可以是叶子节点的数目,T是复杂度。ERR(T),对于分类可以是错分率,也可以是交叉熵损失,对于回归可以是L2、L1损失等。
树模型的优点
∙
\bullet
∙ 容易解释
∙
\bullet
∙ 对特征预处理要求少
1)能处理离散值和连续值得混合的输入(理论上是这样的,实际依赖于工具包的实现情况)
2)对特征的单挑变换不敏感(只与数据的排序有关)
3)能自动进行特征选择
4)可处理缺失数据
∙
\bullet
∙ 可扩展到大数据规模
能处理离散值,可能是说 能处理部分非数字类输入,因为老师特别强调,这时理论上,但Scikit-Learn种实际上是需要要求数字输入,也就是取决于工具。
对特征单调变换不敏感,意味着不需要做指数变换、Log变换、标准化等,因为考虑分裂点的时候只与排序有关系。
自动进行特征选择,刚才有棵树22个特征,实际只用到了6个,类似于之前模型的L1正则。
可处理缺失数据没有怎么讲,只讲到以后的什么什么boost会如何。
可扩展到大规模数据,是因为不用计算梯度。
对这些优点的理解还不深,比如很具体的为什么的问题?
树模型的确定
∙
\bullet
∙ 正确率不高:建树过程过于贪心。可作为Boosting的弱学习器(深度不太深)
∙
\bullet
∙ 模型不稳定(方差大):输入数据小的变化会带来树结构的变化。Bagging:随机森林。
∙
\bullet
∙ 当特征数目相对样本数目太多时,容易过拟合。
选择最佳特征和最佳分裂点,这就是过于贪心的表现。
过早停止(预剪枝)、后剪枝、Boosting、Bagging都是减少过拟合的方法。模型不稳定,为什么是方差大,方差是如何计算的呢?