机器学习算法[4]--决策树原理详解及sklearn实现

1. 决策树

1.1 原理

决策树(Decision Trees)是一种用于分类或回归任务的无参数学习方法,其基于树形结构从数据特征中学习对应决策规则(特征选择)用于分类或预测目标值

假设对于博客是否需要及时阅读建立决策树模型,如图:
在这里插入图片描述

  • 叶子节点为最终的分类或预测结果
  • 非叶子节点为对应的决策规则(特征/属性)

决策树的学习包含三个步骤:①特征选择②决策树生成③决策树剪枝

①特征选择

特征选择决定了使用何种特征来进行分类或预测,即对应决策规则,其思想是选取分类或预测能力较强的特征;根据学习任务的不同(分类或回归),特征选择的准则不同:

在这里插入图片描述

  • 分类:信息增益,信息增益比,Gini指数
  • 回归:平方误差,绝对误差

对于分类问题通过最大信息增益最大信息增益比最小Gini指数作为特征选择准则;而回归问题通过最小平方误差绝对误差作为特征选择准则

②决策树生成

根据对应决策规则选择最优特征作为节点特征,通过不断的选取局部最优特征递归的生成决策树,直到输入数据都被基本正确的分类(预测)或没有合适的特征为止,最后所有输入数据都被分到相应的叶子节点上,即完成决策树的生成

③决策树剪枝

决策树剪枝通过裁剪决策树的部分分支结构,从而简化树模型降低过拟合风险,提高泛化能力;根据剪枝顺序不同,分为预剪枝和后剪枝

  • 预剪枝:在决策树模型学习前规定相关条件达到剪枝效果,如限制决策树深度
  • 后剪枝:在决策树生成后根据相关条件裁剪部分分支结构,如限制决策树叶子节点的个数

1.2 sklearn实现

参考官方文档:点击查看

决策树用于分类任务时可通过sklearn库中tree下的DecisionTreeClassifier类实现
在这里插入图片描述

有关参数

  • criterion:特征选择的准则,即对应的决策规则
  • splitter:控制每个节点拆分后对特征选择(分配)的方法
  • max_depth:决策树的最大深度
  • min_samples_split:节点拆分时需要的最少数据量
  • min_samples_leaf:叶子节点需要的最少数据量
  • min_weight_fraction_leaf:叶子节点的权重总和中需要的最小加权分数
  • max_features:模型学习时考虑的特征数量
  • random_state:控制决策树分类模型拆分时特征选择(分配)的随机性
  • max_leaf_nodes:最大叶子节点数
  • min_impurity_decrease:递归生成决策树时相应准则数值减少量的最小阈值
  • class_weight:各类别的权重
  • ccp_alpha:控制最小化复杂度剪枝的阈值,默认不剪枝

有关属性
在这里插入图片描述

  • classes_:各类别标签
  • feature_importances_:各特征的重要程度
  • max_features_:参数max_feature的推断值
  • n_classes_:类别数量
  • n_features_:已弃用
  • n_features_in_:自变量(特征值)的个数
  • feature_names_in_:自变量的名称,仅当输入自变量有(字符)名称时可用
  • n_outputs_:输出类别数量
  • tree_:生成的决策树实例对象

有关方法
在这里插入图片描述

  • apply:获取每个叶子节点上输入数据的索引
  • cost_complexity_pruning_path:获取最小化复杂度剪枝过程中的裁剪路径
  • decision_path:获取输入数据的决策路径(过程)
  • fit:生成决策树模型
  • get_depth:获取决策树深度
  • get_n_leaves:获取决策数叶子节点数
  • get_params:获取对应模型参数
  • predict:预测类别
  • predict_log_proba:预测类别概率的对数
  • predict_proba:预测类别概率
  • score:获取给定数据集的平均准确度
  • set_params:设置对应模型参数

使用案例

>>> import numpy as np
>>> from sklearn import tree

#建立所示图例的决策树模型,输入数据中第一维代表是否包含决策树,第二维代表是否包含sklearn实现
>>> clf = tree.DecisionTreeClassifier() #实例化决策树分类模型对象
>>> X = np.array([[1, 1], [1, 0], [0, 1]]) #输入数据,1代表是,0代表否
>>> y = np.array(['yes', 'no', 'no']) #类别结果,'yes'代表需要及时阅读,'no'代表暂不阅读
>>> clf.fit(X, y) #拟合求解
>>> clf.classes_
['no', 'yes']
>>> clf.n_features_in_
2
>>> clf.predict([[1, 0]])
['no']
>>> clf.score(X, y)
1.0

另外tree下通过DecisionTreeRegressor类实现决策树的分类任务;此外对决策树的补充知识,点击查看

猜你喜欢

转载自blog.csdn.net/qq_56749449/article/details/125405288