集成学习导航:决策树与随机森林
【机器学习】集成学习:使用scikitLearn中的VotingClassifier综合多个不同模型进行软硬投票
【机器学习】集成学习:使用scikitLearn中的BaggingClassifier实现bagging和pasting策略
【机器学习】集成学习:使用scikitLearn中的RandomForestClassifier及RandomForestRegressor实现随机森林
【机器学习】集成学习:scikitLearn实现AdaBoost及梯度提升GradientBoosting,及XGBT库
决策树是一种无参数模型,事先不知道参数的个数,如果不对决策树进行正则化处理,则决策树很容易对数据过拟合。
1.决策树生成示例
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data[:, 2:] # petal length and width
y = iris.target
#定义了决策树的最大深度
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X, y)
2.将生成的决策树模型转化为图片
from graphviz import Source
from sklearn.tree import export_graphviz
export_graphviz(
tree_clf,
#dot所在路径
out_file=os.path.join(IMAGES_PATH, "iris_tree.dot"),
#特征名
feature_names=iris.feature_names[2:],
#目标名
class_names=iris.target_names,
rounded=True,
filled=True
)
Source.from_file(os.path.join(IMAGES_PATH, "iris_tree.dot"))
上图中gini是不纯度,用1减去各类别在本节点占比的平方之和得到。
也可以使用熵来计算不纯度,公式为:
熵值越小越纯,两者区别是熵倾向于产生平衡树,任意节点对应的两颗子树高度差越小,则越平衡。
samples是到达此节点训练的样本数,values代表每个类别训练的实例数。。
scikitlearn中使用CART算法,Classification And Regression Tree ,即分类回归树算法。其特点是只生成2叉树。
3.输出类别的概率
决策树可以输出样本类别的概率,当一个实例样本到达底层的叶节点时,按照实例比例输出最终的概率,其代码如下:
#预测样本的概率
tree_clf.predict_proba([[5, 1.5]])
#输出值为array([[0. , 0.90740741, 0.09259259]])
#预测样本的类别
tree_clf.predict([[5, 1.5]])
#输出值为array([1])
4.决策树分类时的训练过程:
其成本函数为:
m为样本数,是按左右分支样本数的比例进行不纯度加权。
寻找最优树的过程的时间复杂度是指数级的,故很难寻找到一颗最优树,所以算法可以理解为一种贪心算法,不追求全局最优,要确保每个树的节点其不纯度最优,再依次向下分裂。
5.正则化手段
除了max_depth参数外,
min_samples_split(分裂前节点必须有的最小样本数)、min_samples_leaf(叶节点必须有的最小样本数量)、min_weight_fraction_leaf(与min_samples_leaf一样,但表现为加权实例总数的占比)、max_leaf_nodes(最大叶节点数量),以及max_features(分裂每个节点评估的最大特征数量)。增大超参数min_或减小max_,起到平衡作用,将使模型正则化。
6.使用决策树进行回归操作:
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
tree_reg.fit(X, y)
算法最终预测实例值,是该实例所在叶节点所有实例的平均值。
6.回归时的成本函数:
成本函数由不纯度调整为了均方误函数:
7.决策树的特点:
(1)决策树的突出特点是基本无需对数据进行预处理工作
(2)它是一种白盒模型,易于对分类的结果进行解释。
(3)决策树在预测时,预测需要从根到叶遍历决策树,由于本文是二叉树,m个样本共O(log2(m))个节点,每节点检查一个特征值,故其时间复杂度为:O(log2(m)),,与特征数无关,在大样本集时也预测较快。其训练时的时间复杂度为O (nmlogm) =每层n个特征,m个值,及树的深度
对于小训练集(少于几千个实例),Scikit-Learn可以通过对数据进行预排序(设置presort=True)来加快训练速度,但是这样做会大大降低大训练集的训练速度。
注意,这里的特征数n指每个样本的坐标分量的个数。
(4)决策树喜欢正交的决策边界,其决策边界总垂直于坐标轴,因此对数据的旋转敏感。