从零开始学习人工智能(机器学习基础知识)(二)

决策树(Decision Tree)

在生活日常中,我们会遇到一个又一个需要做的决定,而一些因素会左右你的决定。做决策的过程,在计算机中可以抽象成一个树状结构。其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出。一般情况下,一棵决策树包含一个根节点,若干内部节点和若干叶节点。
这是一张半夜睡梦中收到微信,决定是否回复的决策树
在这里插入图片描述

在这里插入图片描述

我们在做决策树的时候,会经历两个阶段:构造和剪枝

构造

构造就是生成一棵完整的决策树。简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点:

根节点:就是树的最顶端,最开始的那个节点。在上图中,“女朋友”就是一个根节点;

内部节点:就是树中间的那些节点,比如说“发微信”;

叶节点:就是树最底部的节点,也就是决策结果,比如说“继续睡觉”。

节点之间存在父子关系。那么在构造过程中,你要解决三个重要的问题:

  1. 选择哪个属性作为根节点;

  2. 选择哪些属性作为子节点;

  3. 什么时候停止并得到目标状态,即叶节点。

剪枝

剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。之所以这么做,是为了防止“过拟合”(Overfitting)现象的发生。

过拟合:指的是模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。

欠拟合:指的是模型的训练结果不理想。

造成过拟合的原因:

一是因为训练集中样本量较小。如果决策树选择的属性过多,构造出来的决策树一定能够“完美”地把训练集中的样本分类,但是这样就会把训练集中一些数据的特点当成所有数据的特点,但这个特点不一定是全部数据的特点,这就使得这个决策树在真实的数据分类中出现错误,也就是模型的“泛化能力”差。

泛化能力:指的分类器是通过训练集抽象出来的分类能力,你也可以理解是举一反三的能力。如果我们太依赖于训练集的数据,那么得到的决策树容错率就会比较低,泛化能力差。因为训练集只是全部数据的抽样,并不能体现全部数据的特点。

剪枝的方法:

预剪枝:在决策树构造时就进行剪枝。方法是,在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。
后剪枝:在生成决策树之后再进行剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。方法是:用这个节点子树的叶子节点来替代该节点,类标记为这个节点子树中最频繁的那个类。

下面展示一段构建决策树的代码

@Data
public class TreeNode {
    private String feature;
     //key=条件 value = 子节点
    private HashMap<String, TreeNode> featuresMap;
}

@Data
public class DecisionTreeUtils {

    //每次插入时叶子节点位置
    private TreeNode treeNode;
    //返回的根节点
    private TreeNode treeRoot;

    public TreeNode addDecision(TreeNode root, List<FeatureAndConditionBean> featureAndConditionBeanList){
        String beforeCondition = null;
        treeRoot = root;
        treeNode = root;
        for (FeatureAndConditionBean featureAndConditionBean : featureAndConditionBeanList) {
            beforeCondition = create(beforeCondition,featureAndConditionBean);
        }
        return treeRoot;
    }

    private String create(String beforeCondition,FeatureAndConditionBean featureAndConditionBean){
        if (beforeCondition == null){
            if (treeNode == null){
                treeNode = new TreeNode();
            }
            treeNode.setFeature(featureAndConditionBean.getFeature());
            treeRoot = treeNode;
            return featureAndConditionBean.getCondition();
        }
        HashMap<String,TreeNode> treeNodeHashMap = treeNode.getFeaturesMap();
        if (treeNodeHashMap == null){
            treeNodeHashMap = new HashMap<>(16);
        }
        TreeNode treeNode1 = treeNodeHashMap.get(beforeCondition);
        if (treeNode1 == null){
            treeNode1 = new TreeNode();
            treeNode1.setFeature(featureAndConditionBean.getFeature());
            treeNodeHashMap.put(beforeCondition,treeNode1);
        }
        treeNode.setFeaturesMap(treeNodeHashMap);
        treeNode = treeNode1;
        return featureAndConditionBean.getCondition();
    }

    public static void main(String[] args) {
        List<FeatureAndConditionBean> featureAndConditionBeanList = new ArrayList<>(10);
        FeatureAndConditionBean featureAndConditionBean = new FeatureAndConditionBean();
        featureAndConditionBean.setFeature("脸部");
        featureAndConditionBean.setCondition("胖");
        FeatureAndConditionBean featureAndConditionBean2 = new FeatureAndConditionBean();
        featureAndConditionBean2.setFeature("眼睛");
        featureAndConditionBean2.setCondition("大");
        FeatureAndConditionBean featureAndConditionBean3 = new FeatureAndConditionBean();
        featureAndConditionBean3.setFeature("鼻子");
        featureAndConditionBean3.setCondition("挺拔");
        FeatureAndConditionBean featureAndConditionBean4 = new FeatureAndConditionBean();
        featureAndConditionBean4.setFeature("是帅哥");
        featureAndConditionBeanList.add(featureAndConditionBean);
        featureAndConditionBeanList.add(featureAndConditionBean2);
        featureAndConditionBeanList.add(featureAndConditionBean3);
        featureAndConditionBeanList.add(featureAndConditionBean4);
        DecisionTreeUtils decisionTreeUtils = new DecisionTreeUtils();
        TreeNode treeNode = decisionTreeUtils.addDecision(null,featureAndConditionBeanList);
        List<FeatureAndConditionBean> featureAndConditionBeanList2 = new ArrayList<>(10);
        FeatureAndConditionBean featureAndConditionBean5 = new FeatureAndConditionBean();
        featureAndConditionBean5.setFeature("脸部");
        featureAndConditionBean5.setCondition("胖");
        FeatureAndConditionBean featureAndConditionBean6 = new FeatureAndConditionBean();
        featureAndConditionBean6.setFeature("眼睛");
        featureAndConditionBean6.setCondition("小");
        FeatureAndConditionBean featureAndConditionBean7 = new FeatureAndConditionBean();
        featureAndConditionBean7.setFeature("鼻子");
        featureAndConditionBean7.setCondition("低");
        FeatureAndConditionBean featureAndConditionBean8 = new FeatureAndConditionBean();
        featureAndConditionBean8.setFeature("不是帅哥");
        featureAndConditionBeanList2.add(featureAndConditionBean5);
        featureAndConditionBeanList2.add(featureAndConditionBean6);
        featureAndConditionBeanList2.add(featureAndConditionBean7);
        featureAndConditionBeanList2.add(featureAndConditionBean8);
        treeNode = decisionTreeUtils.addDecision(treeNode,featureAndConditionBeanList2);
        System.out.println(treeNode);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习人工智能需要一定的数学基础和编程能力。具体步骤如下: 1. 了解人工智能的基本概念,如机器学习、深度学习、自然语言处理等。 2. 学习数学知识,如线性代数、微积分、概率论等,这些都是人工智能常用的工具。 3. 学习编程语言,如Python,是人工智能开发的主要语言。 4. 学习常用的人工智能框架和库,如TensorFlow、PyTorch、scikit-learn等。 5. 实战练习,参加相关比赛或完成项目练习。 6. 不断学习和更新知识,保持对人工智能发展的关注。 ### 回答2: 学习人工智能的第一步是建立一个坚实的基础知识。这包括了解人工智能的历史、定义和应用,理解机器学习、深度学习和自然语言处理等关键概念。 接下来,学习数学和统计学原理对于理解人工智能算法至关重要。线性代数、概率论和统计学是重要的知识领域,你需要掌握它们的基础概念和应用方法。 学会编程是学习人工智能的关键步骤之一。Python是最常用的人工智能编程语言,它易于学习且有丰富的工具和库。通过编写代码并实践常见的人工智能算法,你可以加深对这些算法的理解并提高实践能力。 参加在线课程和培训班可以加速学习进程,例如Coursera、Udacity和edX等平台提供了许多与人工智能相关的课程。这些课程由专业人士设计,可以帮助你系统地学习人工智能的理论和实践。 进行实践项目是巩固学习成果并提高技能的好方式。找到一些开源项目或小型项目,应用你所学的概念和算法,解决实际问题。这将使你熟悉人工智能的应用场景,并增强解决问题的能力。 与人工智能社区保持联系也是非常有益的。加入相关的在线论坛、社交媒体群组或参加相关的研讨会和会议。与其他学习者和专业人士交流,分享经验和获取建议,可以加速学习进度,并且还可以探索新的发展和趋势。 最后,持续学习和不断更新知识也是至关重要的。人工智能领域发展迅速,你需要保持对新技术、新研究和新方法的关注,并不断扩展自己的技能和知识。 ### 回答3: 学习人工智能需要一定的基础知识和方法。以下是从零开始学习人工智能的步骤: 1. 基础数学知识:掌握线性代数、概率论和微积分等数学基础,这些知识对于理解人工智能的相关算法和原理非常重要。 2. 学习编程语言:选择一门常用的编程语言,如Python或Java,并学习其基础语法和面向对象编程等概念。编程是实现人工智能算法和模型的基础。 3. 机器学习基础:学习机器学习的基本概念、算法和模型。可通过在线课程、教材或公开课程等资源学习,例如斯坦福大学的《机器学习课程》。 4. 实践项目:找一些小而简单的实践项目来应用所学知识,如基于已有数据集的分类、回归等预测任务。通过实践提高自己的编程和建模能力。 5. 深度学习学习深度学习的基本概念和原理。深度学习是目前人工智能领域的热门技术,如卷积神经网络、循环神经网络等,它们在图像、声音等领域有广泛应用。 6. 参与竞赛和社群:参加人工智能相关的比赛和社群,如Kaggle等,与其他学习者互相交流、分享经验和解决方案。 7. 持续学习和更新:人工智能领域不断发展和突破,要保持持续学习的态度,并关注最新的研究和应用,参与相关的学术会议和讨论。 总之,学习人工智能需要耐心和坚持,掌握基础知识,进行实践和项目应用,并与其他学习者积极互动,不断更新自己的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值