文章目录

P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01

前言

2026年的AI圈,张口闭口都是大模型、多模态、AI Agent,仿佛不懂Transformer、不会微调大模型,就不配在AI圈混。上周参加技术沙龙,遇到个刚入行半年的小伙子,张嘴就是GPT-4o、多智能体协同,结果被面试官一句“你这个二分类任务,为什么不用随机森林先打个baseline?”问得当场哑口无言,面试直接凉凉。

还有个做了3年Java后端转AI的朋友,上来就啃深度学习源码,结果做金融风控项目时,非要用大模型做用户逾期预测,最后被监管约谈——原因很简单:大模型是黑盒,你根本没法跟监管解释,为什么系统给这个用户拒贷,到底是哪个特征起了关键作用。最后兜兜转转,还是换回了随机森林,不仅准确率只比大模型低了0.01,推理速度快了100倍,还能清清楚楚输出特征重要性,轻松过了合规审查。

这就是当下很多AI入门者的通病:总想着一步登天啃最前沿的大模型,却把机器学习最经典、最核心的基础模型抛在脑后。就像现在人人都开自动挡新能源车,可你连手动挡的离合原理都不懂,车坏在半路只能干瞪眼。而决策树与随机森林,就是机器学习领域里的“手动挡基础原理”——它不仅是校招社招面试的必考题,更是2026年工业界落地依然离不开的“万金油”模型,还是你理解集成学习、XGBoost/LightGBM,甚至大模型融合策略的核心基础。

很多人觉得决策树、随机森林太老了,已经过时了。但事实是,2026年了,银行的风控系统、医院的辅助诊断系统、工厂的设备故障预测系统里,随机森林依然是绝对的主力。它没有大模型那么高的算力门槛,普通笔记本就能轻松跑;它不用做复杂的数据预处理,小白也能快速上手;它还有着大模型无法比拟的可解释性,在合规要求高的场景里,根本无可替代。

这篇文章,我就用“段子+生活类比”的方式,从零带你搞懂决策树与随机森林的核心原理,再配上2026年最新的Python实战代码,哪怕你只有高中数学基础,哪怕你刚学Python没几天,也能彻底吃透这个经典模型,看完就能直接用到项目里、应对面试。

一、先搞懂:2026年了,为什么我们还要学决策树与随机森林?

在大模型一统江湖的今天,很多人都会问:我直接学大模型不就行了?为什么还要花时间学这些“老掉牙”的传统机器学习模型?我可以很负责任地说,哪怕到2030年,决策树与随机森林,依然是AI从业者必须吃透的基础,原因有3个,每一个都戳中你的核心痛点。

1.1 它是面试的“硬通货”,躲不开也绕不过

不管你是校招投算法岗、数据分析岗,还是社招跳槽做大模型应用开发、AI工程化,面试官一定会问机器学习基础,而决策树与随机森林,就是最高频的考点没有之一。

我见过太多简历上写着“精通大模型微调、多智能体编排”的候选人,被面试官几个基础问题直接问懵:

  • 决策树的分裂准则有哪些?信息增益和基尼系数有什么区别?
  • 随机森林的两大随机性是什么?为什么能降低过拟合?
  • 做分类任务时,为什么要先用随机森林打baseline,再上大模型?

这些问题,你答不上来,哪怕你大模型玩得再溜,面试官也会觉得你的基础不扎实,根本不敢把核心项目交给你。2026年的大厂面试,早就不是比拼谁会的大模型框架多了,而是更看重你对AI技术底层逻辑的理解,而决策树,就是机器学习逻辑最直观、最核心的体现。

1.2 它是工业界落地的“真香模型”,大模型根本替代不了

很多人觉得大模型无所不能,但真正做过工业落地的人都知道,90%的业务场景,根本用不上大模型,随机森林反而比大模型香100倍。

就拿金融风控场景来说,银行做用户信用卡逾期预测,核心要求有3个:预测准、速度快、能给监管解释清楚决策逻辑。大模型的准确率可能只比随机森林高1%,但推理成本是随机森林的100倍,还没法解释“为什么给这个用户拒贷”,监管一查一个准,罚几十万都是轻的。而随机森林,不仅能做到90%以上的准确率,还能直接输出“用户逾期次数是第一重要特征,月收入是第二重要特征”,清清楚楚,明明白白,轻松过合规审查。

再比如工业制造场景,工厂要做设备故障预测,往往只有几百条故障样本,大模型面对小样本直接“水土不服”,训出来的模型准确率还不如瞎猜。而随机森林,哪怕只有几百条样本,也能轻松训出高准确率的模型,提前十几天预测设备故障,给工厂省几百万的停机损失。

更别说算力成本了,大模型训练推理要A100显卡,一张就要几万块,而随机森林,普通的8核CPU笔记本就能轻松跑,训练几百棵树也就几秒钟,成本差了上千倍。对于中小企业、个人开发者来说,随机森林才是真正能落地、用得起的AI模型。

1.3 它是你吃透AI核心逻辑的“敲门砖”,没有它,后面全是空中楼阁

很多人入门AI,上来就啃Transformer、深度学习,结果越学越懵,因为很多核心思想,都来自传统机器学习。比如现在大模型里常用的集成融合策略、多模型投票,核心就是随机森林的bagging集成思想;现在工业界最火的XGBoost、LightGBM,本质上就是优化后的决策树集成模型。

你连决策树的分裂原理都搞不懂,就不可能理解XGBoost为什么比随机森林快;你连随机森林的集成思想都摸不透,就不可能搞懂大模型的多模型融合怎么优化。AI学习从来都不是一步登天,只有把这些基础模型吃透了,你再去学更复杂的大模型、深度学习,才能真正理解背后的逻辑,而不是只会调API、调参数的“调参侠”。

二、决策树:从“相亲选对象”,彻底搞懂核心原理

很多人一看到决策树,就觉得满屏的公式、术语,头都大了。但其实,决策树的核心逻辑,我们每个人每天都在用,最典型的就是“相亲选对象”。

你想想,女生找相亲对象,脑子里是不是会有这么一套判断逻辑:

  1. 第一层判断:年龄是不是35岁以下?不是,直接pass;是,进入下一层判断。
  2. 第二层判断:在本地有没有稳定住房?没有,直接pass;有,进入下一层判断。
  3. 第三层判断:月收入是不是2万以上?不是,直接pass;是,进入下一层判断。
  4. 第四层判断:性格是不是合得来?不是,pass;是,同意见面。

你看,这套层层递进的“if-then”判断规则,就是一棵完完整整的决策树。决策树的本质,就是通过一系列的特征判断,最终得到一个分类或回归结果,逻辑和我们人脑做决策的方式一模一样,这也是它最容易理解的原因。

2.1 决策树的三大核心组成,一眼就能看懂

一棵完整的决策树,只有三个核心部分,对应到上面的相亲例子,你瞬间就能搞懂:

  • 根节点:整棵树最顶层的判断条件,也就是我们例子里的“年龄是否35岁以下”。它是整个决策的起点,包含了所有的待分类样本。
  • 内部节点:树中间的各个判断条件,也就是例子里的“有没有房”“月收入是否2万以上”“性格是否合得来”。每个内部节点,都对应一个特征的判断,根据判断结果,把样本分到不同的分支里。
  • 叶子节点:树的最末端,也就是最终的决策结果,例子里的“同意见面”和“直接pass”。到了叶子节点,就不会再继续分裂了,直接输出最终结果。

说白了,决策树的构建过程,就是两步:第一步,选哪个特征当节点的判断条件;第二步,这个特征用什么阈值来分裂样本。而整棵树的构建目标,就是让每一次分裂之后,分支里的样本尽可能“纯”——也就是同一个分支里的样本,最终结果尽可能一致。

还是拿相亲的例子说,我们用“有没有房”这个特征分裂,分裂之后,有房的分支里,90%都进入了最终的见面环节,没房的分支里,99%都被pass了,这就说明这个特征分裂效果很好,分完之后样本特别“纯”。反过来,如果我们用“今天穿什么颜色的衣服”分裂,分裂之后,穿黑衣服的里一半见面一半pass,穿白衣服的也是一半见面一半pass,这就说明这个特征完全没用,分完之后样本还是乱糟糟的。

2.2 决策树的核心:怎么选最优分裂特征?

搞懂了决策树的基本结构,接下来就是最核心的问题:面对一堆特征,我们怎么判断,哪个特征才是最优的分裂特征?这里就涉及到3个核心指标,也是面试最高频的考点,我不用复杂公式,用人话给你讲得明明白白。

在讲指标之前,我们先搞懂一个核心概念:不纯度。简单来说,不纯度就是衡量一个节点里的样本乱不乱。如果一个节点里的样本,全是“见面”,或者全是“pass”,那它的不纯度就是0,特别纯;如果一半见面一半pass,那它的不纯度就是最高的,特别乱。

我们选分裂特征的核心目标,就是让分裂之后,各个分支的不纯度之和,比分裂前的不纯度尽可能低。降得越多,说明这个特征的分裂效果越好。

2.2.1 信息熵与信息增益:ID3算法的核心

信息熵,就是衡量样本不纯度最经典的指标。熵越大,样本越乱;熵越小,样本越纯。它的公式很简单,哪怕你数学不好,也能看懂:
H ( D ) = − ∑ k = 1 K p k l o g 2 p k H(D) = -\sum_{k=1}^{K} p_k log_2 p_k H(D)=k=1Kpklog2pk
这里的 p k p_k pk,就是节点D里,第k类样本占总样本的比例。比如节点里有10个样本,6个见面,4个pass,那 p 1 = 0.6 p_1=0.6 p1=0.6 p 2 = 0.4 p_2=0.4 p2=0.4,代入公式就能算出熵。如果全是见面, p 1 = 1 p_1=1 p1=1,熵就是0,最纯;如果一半一半,熵就是1,最乱。

信息增益,就是分裂前的熵,减去分裂后的熵的加权和。公式如下:
G a i n ( D , A ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) Gain(D, A) = H(D) - \sum_{v=1}^{V} \frac{|D_v|}{|D|} H(D_v) Gain(D,A)=H(D)v=1VDDvH(Dv)
用人话解释就是:用特征A分裂之后,样本的混乱程度下降了多少。增益越大,说明这个特征让样本变纯的效果越好,我们就优先选这个特征当分裂节点。

基于信息增益做分裂的算法,就是ID3算法。但它有个致命的缺点:特别偏向取值多的特征。比如“身份证号”这个特征,每个样本的取值都不一样,用它分裂,每个分支里只有一个样本,熵直接为0,信息增益拉满,但这个特征完全没用,模型直接过拟合,就像你相亲用“手机号尾号”分裂,完全没有实际意义。

2.2.2 信息增益比:C4.5算法的优化

为了解决ID3算法的缺点,大牛们提出了C4.5算法,核心就是用信息增益比替代信息增益,给取值多的特征加了“惩罚项”。

信息增益比的公式,就是信息增益除以特征A的固有值:
G a i n _ r a t i o ( D , A ) = G a i n ( D , A ) I V ( A ) Gain\_ratio(D, A) = \frac{Gain(D, A)}{IV(A)} Gain_ratio(D,A)=IV(A)Gain(D,A)
特征A的取值越多,它的固有值IV(A)就越大,增益比就会被拉低,完美解决了ID3偏向多取值特征的问题。就像相亲里,“手机号尾号”有10种取值,固有值很大,哪怕信息增益高,增益比也会很低,直接被过滤掉。

2.2.3 基尼系数:CART算法的核心,工业界最常用

前面两个算法,只能做分类任务,而且计算熵需要算对数,速度比较慢。而现在工业界最常用的CART算法,用基尼系数来衡量不纯度,不仅计算更快,还能同时支持分类和回归任务,scikit-learn里的决策树,默认用的就是CART算法。

基尼系数的公式特别简单:
G i n i ( D ) = 1 − ∑ k = 1 K p k 2 Gini(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1k=1Kpk2
它的含义和熵一模一样:基尼系数越小,样本的不纯度越低,越纯。而且它不用算对数,只需要做平方和加减,计算速度比熵快很多,特别适合大数据量的场景。

用个通俗的类比总结一下三个算法:

  • ID3就像找对象只看颜值,颜值高就直接定,很容易踩坑,只看表面效果;
  • C4.5就像除了颜值,还看人品、家境、工作,综合考量,更理性;
  • CART就是相亲界的老江湖,不仅能判断你们能不能处,还能预测你们在一起的幸福指数(回归),全能又高效。

2.3 决策树的致命短板:过拟合,怎么破?

决策树有个天生的毛病:特别容易过拟合。什么叫过拟合?就是它在训练集上准确率能做到100%,把所有样本的细节都记住了,比如相亲里“男生是不是穿黑色袜子”“有没有戴眼镜”这种无关特征,都被它当成了分裂条件,结果一到测试集,面对没见过的样本,准确率直接断崖式下跌。

就像你考试,把题库里的答案全背下来了,可考试的时候换了个数字,你就不会做了,这就是典型的过拟合。

那怎么解决决策树的过拟合问题?核心方法就是剪枝,说白了,就是不让树无限长下去,把没用的分支剪掉,分为预剪枝和后剪枝两种。

2.3.1 预剪枝:提前给树“设限”,从源头控制过拟合

预剪枝,就是在树构建的过程中,提前设置好限制条件,不让它无限分裂,是工业界最常用的方法,简单又高效。常用的限制条件有这几个,也是你调参的时候核心要改的:

  • max_depth:树的最大深度。比如设置最大深度为5,树长到5层就不会再往下分裂了,避免树太深,记住太多无关细节。
  • min_samples_split:内部节点分裂所需的最少样本数。比如设置为5,一个节点里的样本数少于5个,就不会再分裂了。
  • min_samples_leaf:叶子节点所需的最少样本数。比如设置为2,每个叶子节点里至少要有2个样本,避免出现只有1个样本的叶子节点。
2.3.2 后剪枝:先长全再修剪,优化更精准

后剪枝,就是先不设限制,让决策树完整长到最大,然后从下往上,挨个判断每个分支,剪掉那些对模型性能提升没有帮助的分支。

后剪枝的效果通常比预剪枝更好,但它需要先把整棵树长出来,再挨个剪,计算成本更高,速度更慢。所以在实际项目里,我们一般优先用预剪枝,快速控制过拟合,只有对模型性能有极致要求的时候,才会用后剪枝。

三、随机森林:三个臭皮匠,顶个诸葛亮,工业界的万金油模型

单棵决策树虽然好理解,但缺点太明显:容易过拟合,泛化能力差,结果不稳定,稍微改一点训练数据,整棵树的结构就全变了。那怎么解决这个问题?大牛们想到了一个最简单的办法:既然一棵决策树不靠谱,那我就搞几百棵、几千棵决策树,让它们一起投票,少数服从多数,结果不就稳了?

这就是随机森林的核心思想,属于集成学习里的Bagging算法。说白了,就是“群体智慧”,一个人容易犯错,一群人一起决策,犯错的概率就会大大降低。就像你去看病,一个医生可能误诊,你挂100个专家号,99个都说你是感冒,那你基本就是感冒了,不可能99个专家都一起误诊。

3.1 随机森林的两大核心:样本随机 + 特征随机

很多人会问:我如果用同样的训练数据,训100棵一模一样的决策树,那它们投票的结果,和单棵树有什么区别?当然没区别,因为所有树都长一样,犯的错都一样,投票也没用。

所以随机森林的精髓,就在于两次随机,让每棵树都长得不一样,各自有各自的判断逻辑,这样才能互相弥补对方的错误,最终得到一个稳定又准确的结果。

3.1.1 第一次随机:样本随机(Bootstrap抽样)

随机森林在训练每一棵决策树的时候,都不会用全部的训练样本,而是用有放回的随机抽样,也就是Bootstrap抽样。

举个例子,我们总共有1000个训练样本,训练第一棵树的时候,我们随机从1000个样本里抽1000次,每次抽完都放回去,所以有的样本会被抽中好几次,有的样本一次都抽不中(这些没被抽中的样本,叫做袋外样本OOB,还能用来做模型验证)。然后用这个抽出来的样本集,训练第一棵决策树。

训练第二棵树的时候,我们再重新随机抽样1000次,得到一个新的样本集,训练第二棵树。以此类推,每一棵树的训练数据都是不一样的,所以它们学到的决策规则也不一样,自然就不会犯一样的错。

3.1.2 第二次随机:特征随机

光样本随机还不够,随机森林在每棵树的每个节点分裂的时候,还会做第二次随机:不是从所有特征里选最优的分裂特征,而是先随机选出一部分特征,再从这部分特征里,选最优的那个来分裂。

比如我们总共有100个特征,在节点分裂的时候,先随机选出10个特征,再从这10个特征里,选基尼系数下降最多的那个来分裂。这样做的目的,就是进一步降低树与树之间的相关性,避免所有树都盯着同一个强特征,导致所有树的结构都差不多,一起犯错。

在scikit-learn里,分类任务默认的特征抽样数是总特征数的平方根,回归任务是总特征数的1/3,这都是工业界验证过的最佳实践,小白直接用就行,不用瞎改。

就是这两次随机,让随机森林完美解决了单棵决策树的过拟合问题,泛化能力直接拉满。每一棵树都可能过拟合,学到一些样本里的随机噪声,但几百棵树一起投票,这些随机噪声就会被互相抵消,留下来的都是真正有用的规律。

3.2 随机森林为什么是工业界的“万金油”?这6个优势无人能比

2026年了,AI模型层出不穷,但随机森林依然是工业界的首选入门模型,不管是数据分析、特征筛选,还是分类回归、异常检测,它都能轻松搞定,核心就是它有6个无可替代的优势,对小白特别友好,对工业落地特别实用。

  1. 泛化能力极强,几乎不会过拟合
    只要树的数量足够多,随机森林基本不会出现严重的过拟合,这是它最核心的优势。单棵决策树要小心翼翼调剪枝参数,而随机森林,哪怕你不怎么调参,也能得到一个很不错的结果,对新手特别友好。

  2. 可解释性拉满,完美适配合规场景
    随机森林可以直接输出特征重要性,清清楚楚告诉你,在预测结果里,哪个特征起的作用最大,哪个特征基本没用。比如风控场景里,它能告诉你“用户的逾期次数”是第一重要特征,“月收入”是第二重要特征,你能拿着这个结果给监管解释,完全合规。这一点,是黑盒的大模型、深度学习模型根本比不了的。

  3. 对数据预处理要求极低,小白零门槛
    用过深度学习的人都知道,数据预处理能把人逼疯,要做归一化、标准化,要处理缺失值、异常值,还要做各种特征转换。而随机森林,完全不用这些操作:

  • 不用做归一化、标准化:因为它是基于特征的分裂阈值做判断,和特征的数值大小无关,比如收入是0-100万,年龄是0-100,不用归一化,直接就能用。
  • 能自动处理缺失值、异常值:对缺失值不敏感,哪怕有少量异常值,也不会影响整体的投票结果,不用花大量时间做数据清洗。
  1. 全能型选手,什么场景都能打
    随机森林不仅能做分类任务、回归任务,还能做异常检测(孤立森林,就是基于随机森林的思想)、特征筛选、缺失值填充。比如你做数据分析,不知道哪些特征有用,直接拿随机森林跑一遍,把特征重要性低的特征去掉,事半功倍。

  2. 训练速度快,算力成本极低
    随机森林的每一棵树,训练都是完全独立的,所以它天生支持并行训练,2026年的CPU都是8核16核起步,能同时训好几棵树,速度拉满。哪怕是1000棵树,普通笔记本也能几秒钟训完,不用GPU,不用A100,成本只有大模型的零头,个人开发者、中小企业都能用得起。

  3. 对小样本极其友好,数据少也能训出好模型
    大模型、深度学习,都需要海量的训练数据,数据少了根本训不动。而随机森林,哪怕只有几百条、几千条样本,也能训出准确率很高的模型,完美适配工业界很多“样本稀缺”的场景,比如设备故障预测、罕见病诊断等。

3.3 小白也能上手的随机森林调参指南,别再瞎调了

很多人用随机森林,上来就网格搜索所有参数,训了几个小时,结果性能还不如默认参数。其实随机森林的调参,有明确的优先级顺序,按照这个顺序调,事半功倍,小白也能快速调出最优模型。

第一步:先调树的数量 n_estimators

这个参数,就是随机森林里决策树的数量,是最核心的参数。一般从100开始试,逐步加到200、500、1000。当树的数量到一定程度之后,模型的性能就会收敛,不再提升,这时候再增加树的数量,只会增加训练和推理时间,不会有任何收益。

2026年的机器性能,默认100棵树就能满足绝大多数场景,追求极致性能的话,调到500就足够了,不用调到几千棵,纯纯浪费算力。

第二步:调树的复杂度,控制过拟合

这一步,就是我们前面讲的预剪枝参数,核心是这3个,优先级从高到低:

  • max_depth:树的最大深度,默认是None,也就是不限制,很容易过拟合。一般从3开始试,逐步调到10、20,分类任务一般不超过30,回归任务可以适当大一点。
  • min_samples_split:内部节点分裂的最少样本数,默认是2。如果模型过拟合,就把这个值调大,比如5、10,避免树分裂得太细。
  • min_samples_leaf:叶子节点的最少样本数,默认是1。过拟合就调大,比如2、5,减少叶子节点的数量,降低过拟合风险。
第三步:调特征随机的参数 max_features

这个参数,就是节点分裂时,随机抽样的特征数量,分类任务默认是总特征数的平方根,回归任务是总特征数的1/3,一般不用改。如果模型过拟合,就把这个值调小一点,让每棵树的随机性更强;如果模型欠拟合,就把这个值调大一点,让每棵树能用到更多的强特征。

第四步:用随机搜索替代网格搜索,效率提升10倍

很多人调参喜欢用GridSearchCV(网格搜索),把所有参数的组合都试一遍,特别慢。其实更高效的方法,是用RandomizedSearchCV(随机搜索),它会在你设置的参数范围内,随机采样一定数量的组合,不仅速度快很多,最终的效果也和网格搜索差不多,小白直接用这个就行。

四、实战环节:2026年最新Python代码,手把手带你落地

讲完了原理,我们直接上实战,用2026年最新的Python 3.12+和scikit-learn 1.5+,手把手带你实现决策树与随机森林,用经典的泰坦尼克号生存预测数据集,代码复制粘贴就能直接跑,小白也能零门槛上手。

4.1 环境准备

首先,安装所需的依赖库,都是最新稳定版,直接在终端执行下面的命令就行:

pip install scikit-learn pandas numpy matplotlib

4.2 完整代码实现,逐行带注释

# 1. 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import GridSearchCV

# 2. 加载数据集,泰坦尼克号生存预测,经典二分类任务
# 直接从seaborn加载数据集,不用本地下载,小白零门槛
data = pd.read_csv("https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv")

# 3. 数据预处理,简单几步搞定,随机森林对预处理要求极低
# 3.1 去掉没用的特征:姓名、票号、船舱号,对生存预测没用
data = data.drop(["Name", "Ticket", "Cabin"], axis=1)

# 3.2 处理分类特征:把性别、登船港口转成数值型
data["Sex"] = data["Sex"].map({"male": 0, "female": 1})
data["Embarked"] = data["Embarked"].map({"S": 0, "C": 1, "Q": 2})

# 3.3 处理缺失值:年龄用中位数填充,登船港口用众数填充
data["Age"] = data["Age"].fillna(data["Age"].median())
data["Embarked"] = data["Embarked"].fillna(data["Embarked"].mode()[0])

# 4. 划分特征和标签,以及训练集和测试集
# 标签:Survived,是否存活,1=存活,0=遇难
X = data.drop("Survived", axis=1)
y = data["Survived"]

# 7:3划分训练集和测试集,固定随机种子,结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2026)

# 5. 单棵决策树模型训练与评估
print("="*50)
print("单棵决策树模型结果")
print("="*50)

# 初始化决策树,用CART算法,设置最大深度避免过拟合
dt_model = DecisionTreeClassifier(max_depth=5, random_state=2026)
# 训练模型
dt_model.fit(X_train, y_train)
# 预测测试集
dt_pred = dt_model.predict(X_test)
# 评估模型
print(f"决策树测试集准确率:{accuracy_score(y_test, dt_pred):.4f}")
print("\n分类报告:")
print(classification_report(y_test, dt_pred))

# 6. 随机森林模型训练与评估
print("\n" + "="*50)
print("随机森林模型结果")
print("="*50)

# 初始化随机森林,100棵树,固定随机种子
rf_model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=2026)
# 训练模型
rf_model.fit(X_train, y_train)
# 预测测试集
rf_pred = rf_model.predict(X_test)
# 评估模型
print(f"随机森林测试集准确率:{accuracy_score(y_test, rf_pred):.4f}")
print("\n分类报告:")
print(classification_report(y_test, rf_pred))

# 7. 随机森林特征重要性可视化,直观看到哪些特征影响生存
print("\n" + "="*50)
print("特征重要性排名")
print("="*50)
feature_importance = pd.DataFrame({
    "特征": X.columns,
    "重要性": rf_model.feature_importances_
}).sort_values("重要性", ascending=False)
print(feature_importance)

# 可视化特征重要性
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 解决中文显示问题
plt.figure(figsize=(10, 6))
plt.barh(feature_importance["特征"], feature_importance["重要性"], color="#2f54eb")
plt.xlabel("特征重要性", fontsize=12)
plt.ylabel("特征名称", fontsize=12)
plt.title("泰坦尼克号生存预测 随机森林特征重要性", fontsize=14)
plt.gca().invert_yaxis()  # 反转y轴,最重要的在最上面
plt.show()

# 8. 简单调参演示,用网格搜索优化随机森林
print("\n" + "="*50)
print("调参后随机森林模型结果")
print("="*50)

# 设置要调的参数范围
param_grid = {
    "n_estimators": [100, 200, 300],
    "max_depth": [3, 5, 7],
    "min_samples_split": [2, 5, 10]
}

# 初始化网格搜索,5折交叉验证
grid_search = GridSearchCV(RandomForestClassifier(random_state=2026), param_grid, cv=5, n_jobs=-1)
# 训练搜索
grid_search.fit(X_train, y_train)

# 输出最优参数和最优结果
print(f"最优参数:{grid_search.best_params_}")
print(f"交叉验证最优准确率:{grid_search.best_score_:.4f}")

# 用最优模型预测测试集
best_rf_model = grid_search.best_estimator_
best_rf_pred = best_rf_model.predict(X_test)
print(f"调参后测试集准确率:{accuracy_score(y_test, best_rf_pred):.4f}")

4.3 结果解读

运行上面的代码,你会看到几个核心结果:

  1. 随机森林的准确率,明显比单棵决策树高,一般能达到82%以上,完美体现了集成学习的优势。
  2. 特征重要性排名里,性别(Sex)是第一重要特征,其次是船舱等级(Pclass)、年龄(Age),这和我们的常识完全一致:泰坦尼克号沉船时,优先让妇女和儿童上救生艇,头等舱的乘客生还概率更高。
  3. 调参之后,模型的准确率还能进一步提升,一般能到83%-85%。

五、2026年,决策树与随机森林的5个常见误区,别再踩坑了

我见过太多人,用了很久的随机森林,却一直踩在误区里,不仅模型性能上不去,还觉得这个模型不好用。这里我总结了5个最高频的误区,帮你一次性避坑。

误区1:决策树、随机森林已经过时了,学了没用

这是最大的误区。2026年了,在金融、医疗、工业等对可解释性、合规性、算力成本有严格要求的场景,随机森林依然是首选模型。而且它是面试必考点,是你理解集成学习、进阶XGBoost/LightGBM的核心基础,哪怕你做大模型,也需要用它打baseline、做特征筛选,根本不可能过时。

误区2:随机森林的树越多,性能越好

很多人觉得,树越多,模型越准,直接把n_estimators调到10000,纯纯浪费算力。实际上,当树的数量达到一定阈值后,模型的性能就会完全收敛,再增加树的数量,只会让训练和推理速度变慢,不会有任何性能提升。绝大多数场景,100-500棵树就完全足够了。

误区3:随机森林不会过拟合

随机森林只是通过两次随机,大大降低了过拟合的风险,不是完全不会过拟合。如果你把树的最大深度设为无限大,每棵树都在训练集上过拟合了,那随机森林最终也会过拟合。所以,哪怕用随机森林,也要通过max_depth等参数,限制树的复杂度,避免过拟合。

误区4:用随机森林必须做数据归一化、标准化

完全不用。决策树是基于特征的分裂阈值做判断的,和特征的数值尺度无关,比如一个特征是0-100,另一个是0-1000000,不用做任何归一化,直接就能用。这也是随机森林对小白特别友好的核心原因之一,不用花大量时间做数据预处理。

误区5:随机森林只能做分类和回归

随机森林的能力远不止于此。基于它的思想衍生出来的孤立森林(Isolation Forest),是工业界最常用的异常检测算法;它输出的特征重要性,是数据分析里特征筛选最常用的方法;它还能用来做缺失值填充、半监督学习,是真正的全能型模型。

六、总结

写到这里,相信你已经彻底搞懂了决策树与随机森林的核心原理,也能通过实战代码,自己动手实现一个完整的分类模型了。

很多人说,AI时代,传统机器学习已经没用了,但事实恰恰相反。大模型就像一把屠龙刀,威力巨大,但门槛高、成本高,很多场景根本用不上;而决策树与随机森林,就像一把随身携带的瑞士军刀,小巧、灵活、实用,90%的业务场景,它都能轻松搞定,而且门槛极低,普通人也能快速上手。

对于AI入门者来说,最忌讳的就是好高骛远,总想着一步登天啃大模型,却忽略了最核心的基础。决策树与随机森林,就是你AI学习路上的第一块基石,把它吃透了,你再去学更复杂的集成模型、深度学习、大模型,才能真正理解背后的逻辑,而不是只会调API的“调参侠”。

2026年,AI技术迭代得再快,基础的逻辑永远不会变。把经典模型学扎实,你才能在AI的浪潮里,走得更稳、更远。

P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐