• 【机器学习】使用scikitLearn进行决策树分类与回归:DecisionTreeClassifier及DecisionTreeRegressor


    集成学习导航:决策树与随机森林
    【机器学习】集成学习:使用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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    上图中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])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    算法最终预测实例值,是该实例所在叶节点所有实例的平均值。

    6.回归时的成本函数:
    成本函数由不纯度调整为了均方误函数:
    在这里插入图片描述

    7.决策树的特点:
    (1)决策树的突出特点是基本无需对数据进行预处理工作
    (2)它是一种白盒模型,易于对分类的结果进行解释。
    (3)决策树在预测时,预测需要从根到叶遍历决策树,由于本文是二叉树,m个样本共O(log2(m))个节点,每节点检查一个特征值,故其时间复杂度为:O(log2(m)),,与特征数无关,在大样本集时也预测较快。其训练时的时间复杂度为O (nmlogm) =每层n个特征,m个值,及树的深度
    对于小训练集(少于几千个实例),Scikit-Learn可以通过对数据进行预排序(设置presort=True)来加快训练速度,但是这样做会大大降低大训练集的训练速度。
    注意,这里的特征数n指每个样本的坐标分量的个数。
    (4)决策树喜欢正交的决策边界,其决策边界总垂直于坐标轴,因此对数据的旋转敏感。

  • 相关阅读:
    Nacos配置的加载规则详解(spring cloud 组件教程大全六)
    学习JAVA第四课:封装、继承以及多态性
    Go语言学习11-测试
    npm内部机制与核心原理
    WPF控件10
    算法每日一题(python,2024.05.27) day.9
    【Vue】Vue3 Swiper 插件 loop 无限滚动、并且暂停的问题
    MySQL语法基础
    【ICLR 2021】半监督目标检测:Unbiased Teacher For Semi-Supervised Object Detection
    一体化Ethercat通信伺服电机在汇川H5U PLC上的应用案例介绍(上)
  • 原文地址:https://blog.csdn.net/hh1357102/article/details/126891897