机器学习
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类实现决策树的分类任务;此外对决策树的补充知识,点击查看