【机器学习实战】 决策树

训练决策树

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的方式拆分训练集而不是以最小化来拆分训练集。

 

posted @ 2021-09-29 22:58  鱼儿冒个泡  阅读(79)  评论(0编辑  收藏  举报