目录
概念
依据树形结构,基于特征对实例进行划分。特征最优选择的方法、构建决策树(树的生成)、剪枝。
(属性值离散、分类问题)当前数据集有k类(label)样本,再选择最优特征后,特征值为离散属性的时候,根据每个属性的几个离散属性将数据集划分到每个节点下边。目的是使每个节点下的样本尽量属于同一类别。
公式
-
信息熵: 信息熵越大越混乱
-
条件熵: ,这里指定为给定属性A作为划分,新的各个数据集的信息熵的期望。
-
信息增益: 用A划分数据集后,混乱减少的程度。
流程
常用划分节点的方法
- 信息增益(ID3):如上,缺点是选择的最优特征结果偏向于属性值较多的特征,分得越细,节点下的样本越统一。
- 信息增益率(C4.5):在信息增益的基础上,加上了正则化。
- 基尼指数(CART):classification and regression tree 分类和回归树,分类与回归任务都可用。基尼指数的定义可以理解为随机从数据种抽取两个样本,其类别不一致的概率,优化目标是使基尼指数降低。
- CART分类(二叉树):
- 基尼值:、
- 基尼指数(相当于条件熵):,被特征A的值a分为两部分
- 计算:对每个特征的每个点,都将样本分为两部分,都计算基尼指数,最后在所有特征中选择最小的值作为划分依据,在子结点中仍可使用该特征作为划分属性。
CART回归: 思想是一致的,只不过采用均方误差作为最优特征的属性值,对每个特征每个值遍历,最为划分属性计算(划分后样本的均值作为最终的Y,于样本中每个值进行均方误差计算)
三种划分方法的比较:
- 使用信息增益或者信息增益率时,如果属性为离散的,作为最优特征划分后,则不能出现在之后的划分节点中。如果是连续属性进行离散化后的离散属性,则还可以继续作为最优划分属性。
- 使用基尼指数处理分类和回归问题时,需要比较每个特征的每个属性值作为划分点后计算的基尼指数,然后选择最小的作为最优划分点(使用过的在之后仍可以使用),在接下来重复,直到满足条件(回归是设定的阈值,分类是属性划分完、节点都为一类)
剪枝步骤
- 预剪枝:在决策树生成的时候,使用验证集来衡量当前节点分类是否能带来好的泛化性能,是就分裂,否则不分裂。
- 后剪枝:在决策树构建完成后,对树自底而上,使用验证集来衡量删除当前子树是否能带来好的泛化性能,是就删除,否则不删除。
优缺点
信息增益适合处理数据比较混乱的,效果比较明显。基尼指数随对较纯的数据集区分清楚。原因是信息增益根据使混乱度降低的程度来选择特征。而基尼指数根据分后的数据纯程度来选择,本质一样,但是出发点不一样,导致有细微的差别。
信息增益偏向于处理离散数据,基尼指数偏向于处理连续数据。
处理缺失值、连续值
- 删除缺失值、插值、等
- C4.5:Information Gain (Ratio) based Threshold
- CART:遍历所有输入变量j 和切分点s,根据最小化平方误差准则选取;
特征重要性:
参考 对于单棵树,当前特征作为划分点后,数据集的基尼指数*样本数量-子数据集的基尼指数。最后对每个特征归一化。(信息熵的化,则就是减少的程度)整体来说就是计算为减少混乱的贡献度。
集成模型的化,为每个树计算后的加权平均。
集成模型
bagging与boosting两种集成方式:传送门
随机森林RF
GBDT
xgboost
lightGBM
GDBT更详细(DT,RF,GBDT,xgboost,lightGBM)
代码
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 30 14:28:58 2020
@author: dabing
"""
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV
#加载数据集,x为矩阵float64,y为标签int32(未经过one-hot编码)
X, y = load_iris(return_X_y=True)
#参数,每种可能做5折交叉验证
param_grid = {
'criterion':['gini','entropy'],
'max_depth':[1,2,3,6,12,15],
'min_samples_split':[2,3,4,5]
}
search_grid = GridSearchCV(DecisionTreeClassifier(),param_grid, scoring='accuracy', cv=5 )
search_grid.fit(X,y)
#最优参数
print(search_grid.cv_results_['mean_test_score'])
print(search_grid.best_params_)
print(search_grid.best_score_)
#最优模型中的特征重要性
best_model = search_grid.best_estimator_
print(best_model.feature_importances_)