【机器学习实战】 决策树
训练决策树
Scikit-Learn使用分类和回归树算法来训练决策树
工作原理: 使用单个特征k和阈值tk将训练集分为两个子集, 通过选择(k, tk)最小化成本函数/搜索最纯子集。并重复该过程, 直到到达最大深度或找不到减少不纯度的分割, 停止递归。 其他一些超参数也可以控制停止条件(稍后叙述)
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) tree_clf.fit(X, y)
做出预测和估计概率
tree_clf.predict_proba([[5, 1.5]]) # array([[0. , 0.90740741, 0.09259259]]) tree_clf.predict([[5, 1.5]]) # array([1])
基尼不纯度或熵
默认使用基尼不纯度进行测量, 但可以将超参数criterion设置为“entropy”选择作为熵作为不纯度的测量方式。
基尼不纯度倾向于从树枝中分裂出最常见的类别,且计算速度略快一些, 而熵倾向于产生更平衡的树。
正则化超参数
决策树是非参数模型:极少对训练数据做出假设, 训练之前没有确定参数的数量。 如果不加限制, 树的结构将跟随训练集变化, 严密拟合, 并且很有可能过拟合。
正则化: 为了避免过拟合, 需要在训练过程中降低决策树的自由度:
max_depth 最大深度,默认None,表示无限制
min_samples_split 分裂前节点的最小样本数
min_samples_leaf 叶节点必须有的最小样本数量
min_weight_fraction_leaf 与min_samples_leaf一样, 但表现为加权实例总数的占比
max_leaf_nodes 最大叶节点的数量
max_features 分裂每个节点评估的最大特征数量
也可以先不加约束的训练模型,再对不必要的节点进行剪枝(删除)
回归
from sklearn.tree import DecisionTreeRegressor tree_reg = DecisionTreeRegressor(max_depth=2) tree_reg.fit(X, y)
与分类树不同, 每个节点预测一个值而不是一个类别; 以最小化MSE的方式拆分训练集而不是以最小化来拆分训练集。