随机森林原理与实战:从决策树到集成学习入门
我第一次接触随机森林的时候脑子里全是问号那么多树每棵树还长得不一样最后怎么就能凑出一个更准的结论等我真正把代码跑起来调了几轮参数才明白这东西就是典型的“三个臭皮匠顶个诸葛亮”。对刚入门机器学习、还在纠结分类算法选谁的朋友来说随机森林简直是性价比最高的起点之一不用做太复杂的特征工程能处理表格型数据还能顺带告诉你哪些特征重要简直是一台自带解释能力的分类机器。这篇文章会从“随机森林到底在干什么”讲起然后把核心原理、参数含义、代码实现、常见坑点一次说清楚。内容面向初级学习者但我会尽量讲透“为什么”而不是只甩给你一个 fit 和 predict 的脚本。看完之后你不仅能在自己的数据集上跑出模型还能知道结果为什么好、不好时该往哪个方向调。1. 随机森林到底解决什么问题1.1 单棵决策树的痛想理解随机森林必须先回到单棵决策树。决策树的思路很直观根据特征一步步做判断每个节点选一个特征把数据分成两堆直到分类结果足够纯。训练速度快、结果可解释这是它的优点。但缺点同样明显树一旦长深了就会死记硬背训练数据里的噪声出现严重的过拟合。我常用一个类比来解释——一个学生把所有习题答案都背下来考试换了题目就傻眼。决策树就是这样典型的“死记硬背型选手”。如果只用一棵树做分类你可能面临两难树浅了欠拟合树深了过拟合。更麻烦的是特征一多单棵树的判断逻辑很容易被某些强特征带偏。比如判断植物所属类别时如果“花瓣长度”这个特征区分度特别高那么树几乎每条分支都优先用它其他特征的信息被压制得很惨。单独一棵树决策风格太单一一旦它学歪了最终结果就跟着歪。所以后来有人想了个办法我不训练一棵树而是训练很多棵树让它们各自发挥最后投票决定结果。这个思路听起来简单但实际操作有个关键问题——如果每棵树长得一模一样投票等于没投。要让大家有不同的看法就必须给每棵树喂不同的“经验”也就是不同的样本和不同的特征组合。随机森林的名字里“随机”两个字就落在这里。1.2 Bagging思想与集体投票随机森林的核心框架叫Bagging全称是Bootstrap Aggregating。Bootstrap是统计学里的“有放回抽样”意思是每棵树训练时从原始数据集里随机抽出一部分样本抽完放回下一棵树继续抽。这样每棵树的训练数据都略有差异但又不至于完全偏离原始数据分布。相当于给同一批人每人发一份“略有删改”的教材然后让他们各自考试再综合答案。当分类任务做预测时随机森林里每一棵树都会给出一个分类结果然后所有树进行投票票数最多的类别胜出。这就是“多数表决”。你可能会问为什么投票就比单棵强核心原因是误差抵消。每棵树的预测有随机波动有的偏左有的偏右但投票后多数会落在正确中心附近。数学上只要单棵树预测准确率略好于随机猜测并且彼此之间的相关性不要太高树的数量越多整体准确率越稳定。这正是“群体智慧”的价值。我还记得第一次自己实现Bagging时的感受原来“集体”不是简单叠加而是通过多样性和投票机制把个体会犯的错误互相抵消。随机森林就是在Bagging基础上再进一步除了随机抽样本还随机抽特征进一步降低树与树之间的相关性。后面我会详细拆这层逻辑。2. 随机森林核心原理拆解2.1 随机抽取样本与特征随机森林每棵树的训练流程可以分成两步。第一步从训练集中有放回地抽取N个样本其中N通常等于原始训练集大小。这意味着某些样本会重复出现有些样本可能一次都不出现。这样做的好处是每棵树的“学习材料”不一样产生了天然多样性。第二步在构建每棵树的每个节点时不是从所有特征里挑最优分裂特征而是先随机抽取一个特征子集然后只在这个子集里找最优分裂。特征子集的大小是随机森林最重要的超参数之一一般默认取特征总数的平方根。比如有16个特征每个节点只看4个候选特征。这个设置听起来挺“浪费”但正是这种限制让那些本来被强特征压制的弱特征也有机会参与决策。相比之下单棵决策树总是贪婪地选择当下最优特征很容易陷入局部路径上的“偏见”。这样的双重随机性让每棵树不仅数据不同连“思考方式”都不同。想象一下公司招人面试每位面试官只看候选人简历里随机抽取的几个项目经历最后综合打分这比所有人都盯着同一段经历来判断要全面得多。随机森林本质上就是用这种机制给特征一个“公平发言”的机会。2.2 为什么“随机”能提升模型表现很多人第一次听到“随机”两个字会误以为模型不靠谱。实际情况恰恰相反随机性控制得好模型反而更稳。我先用方差的角度解释单棵决策树是低偏差、高方差的模型对数据变化非常敏感。换个训练集同一套算法可能长出一棵完全不同的树。随机森林通过多棵树平均直接压低了方差。平均的结果不会让偏差变差太多却能让波动大幅下降。再从相关性角度解释如果两棵树几乎长在同一类的训练样本上它们的错误也会高度同步而随机森林强制每棵树使用不同的样本和特征子集有效降低树间相关性。Bagging已经在样本层面制造差异特征随机抽样又在分裂逻辑上增加差异双重保险之下投票结果往往比其中任何一棵都可靠。还有一个容易被忽略的细节随机森林中的每棵树并不需要非常精确。实践中我常常发现就算单棵树拟合得有点粗糙只要树的数量足够整体准确率依然能保持在高位。这个特性给初学者带来的好处是随机森林对参数不敏感不需要像支持向量机那样拼了命调核函数默认配置往往就已经能打七八十分。之后想提升再慢慢调特征数量和树深度就行。当然随机不是越多越好。特征子集选得太小每棵树能用的信息太少单棵性能下降整体也会变弱选得太大树与树又变得太像随机森林退化成普通Bagging。所以“随机”是一门平衡艺术理解原理比单纯调参更重要。3. 动手实现一个随机森林分类器3.1 环境准备与核心参数实际操作时我建议用Python搭配scikit-learn库来实现随机森林这也是目前最友好的入门组合。安装命令很简单如果你用的是Anaconda通常已经自带。没有的话在终端执行安装即可。另外还需要pandas和numpy用于数据处理matplotlib用于画图。这些库都不需要我在这里铺开介绍它们就像厨房里的锅碗瓢盆用惯了就顺手了。pip install scikit-learn pandas numpy matplotlib开始写模型之前先搞清楚随机森林的四个核心参数n_estimators表示树的棵数max_features是每个节点随机抽取的特征数量max_depth控制树的最大深度min_samples_leaf限制叶子节点最少样本数。对初学者来说这四个参数最影响结果。我见过很多人上来就调几十个参数其实完全没必要。n_estimators少了不稳定多了训练慢。默认100是一个不错的起点我通常试300和500看准确率是否还有实质提升。max_features分类问题默认是特征总数的平方根我一般从默认值附近开始再尝试更小和更大的值。max_depth默认None会让树充分生长但容易过拟合。配合min_samples_leaf一起调比单独限制深度更有效。min_samples_leaf值越大模型越保守能在一定程度上防止噪声被记住。还有一个必须注意的点随机森林里有“随机”二字所以每次运行结果可能略有差异。为了让实验结果可复现建议设置random_state为一个固定整数比如42。这样别人复现你的实验时也能得到完全一致的结论。3.2 数据加载、训练、评估全流程为了讲清楚流程我用一个经典的植物特征数据集来做演示。它包含三种类别每种样本有四个数值特征非常适合入门级分类任务。代码分五步加载数据、划分训练集和测试集、创建模型、训练、评估。import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report # 假设 df 是已经读取好的数据特征列为 X目标列为 y # 这里我用示例数据结构说明实际读取时替换为你的文件路径 from sklearn.datasets import load_iris data load_iris() X pd.DataFrame(data.data, columnsdata.feature_names) y data.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) model RandomForestClassifier( n_estimators100, max_featuressqrt, random_state42 ) model.fit(X_train, y_train) y_pred model.predict(X_test) print(准确率:, accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))注意我特意用了stratifyy来划分数据这能保证训练集和测试集里各类别比例和原始数据保持一致。如果是二分类不平衡数据这个参数尤其重要。输出里除了准确率还应该看每一类的精确率、召回率和F1值。只盯准确率在类别不平衡时会骗人这是初学者最容易犯的错误之一。跑完这段代码大多数人会得到一个相当不错的准确率。但别高兴太早拿陌生数据去预测才是真正检验模型的时候。你可以手动构造一条新的样本放到model.predict里面试试看看模型对新记录是什么反应。3.3 参数调节与特征重要性分析随机森林还有一个非常实用的副产品特征重要性。它的大致逻辑是如果某个特征在划分时被频繁使用并且每次都能明显降低不纯度那么这个特征的重要度就高。scikit-learn里通过feature_importances_属性直接输出。下面这段代码可以把重要性画成条形图让你一眼看到哪些特征在主导分类。import matplotlib.pyplot as plt importances model.feature_importances_ indices np.argsort(importances)[::-1] feature_names X.columns plt.figure(figsize(8, 5)) plt.title(特征重要性排序) plt.barh(range(len(indices)), importances[indices], aligncenter) plt.yticks(range(len(indices)), [feature_names[i] for i in indices]) plt.gca().invert_yaxis() plt.tight_layout() plt.show()这个图可以指导你做两件事。第一如果某些特征的重要性极低几乎为零可以尝试删除它们再训练一次看看准确率有没有变化。第二反向思考如果模型效果不好而某个特征重要性异常高可能说明模型过于依赖它需要检查这个特征是否有问题。参数调节方面我不建议直接上网格搜索穷举因为随机森林默认参数通常已经不差。我的习惯是先用默认参数训练一次拿到准确率作为基准线。然后单独调整max_depth比如设置深度从3到15逐个尝试同时保持其他参数不变画出一条“深度-准确率”曲线。接着再调整min_samples_leaf。最后如果训练速度允许把n_estimators从100提高到300看收益是否显著。这样一步一步调你才能清楚每个参数的边际效果而不是换来一个“谜之最优”。如果想系统调参可以用GridSearchCV但数据量大时要控制参数候选数量否则会等得怀疑人生。from sklearn.model_selection import GridSearchCV param_grid { n_estimators: [100, 300], max_depth: [5, 10, None], min_samples_leaf: [1, 2, 4] } gs GridSearchCV( RandomForestClassifier(random_state42), param_grid, cv5, scoringaccuracy, n_jobs-1 ) gs.fit(X_train, y_train) print(最优参数:, gs.best_params_)网格搜索会交叉验证每个组合非常耗时。我一般在确定大致范围后再用而不是一上来就全量搜索。4. 常见问题与排查技巧实录4.1 模型过拟合还是欠拟合怎么判断随机森林天生抗过拟合但不代表完全不会过拟合。一个常见的信号是训练集准确率接近100%测试集准确率明显低一个档次。说明模型把训练数据里的噪声也背下来了。此时该做什么我建议先看树的数量和深度。n_estimators太少会导致模型不稳定但不是过拟合的主因max_depth过深或者min_samples_leaf太小时单棵树可能过度细分。把min_samples_leaf从1调到5或10很多时候过拟合就能缓解。另一个信号是训练集和测试集准确率双双很低这通常是欠拟合。别急着调参先确认特征是否真的包含足够信息数据是否归一化。随机森林对特征缩放不敏感但如果特征全是噪声再多的树也没用。我以前做一个模拟数据时故意用了两个完全无关的随机数当特征结果准确率一直停留在随机水平本质上就是数据问题不是模型问题。判断过拟合和欠拟合最直接的方法是绘制学习曲线固定测试集不变逐步增大训练样本数量观察训练集和验证集准确率的变化。两条曲线最后如果还有很大差距说明过拟合如果两条曲线都很低说明欠拟合。这个诊断手段比盯着一个数值可靠多了。4.2 类别不平衡怎么办现实中的分类问题经常碰到正负样本比例悬殊的情况比如某个可疑交易只占1%。随机森林在训练时偏向多数类导致少数类召回率很低。初级学员很容易在这里栽跟头因为整体准确率可能很高但少数类一个都预测不中。处理方案通常有三条路。第一条调整类别权重在RandomForestClassifier里设置class_weightbalanced让损失函数对少数类错分给更高惩罚。第二条对多数类做欠采样或者对少数类做SMOTE过采样这属于数据处理层面的操作。第三条放弃准确率指标改用ROC-AUC或者PR曲线来评估。我个人的经验是先改class_weight看效果变化是否明显再决定要不要做采样。因为采样会改变原始分布操作不好反而引入偏差。检查类别不平衡还有一个实用技巧查看模型输出的概率值而不是只取最终的0/1预测。随机森林的predict_proba会返回每个类的概率你可以把阈值从默认的0.5往下调比如调到0.3这样更多样本会被判为少数类。这不需要重训模型只需要在决策时调整判定边界。4.3 性能、训练速度与准确率的取舍随机森林的训练速度与三件事有关树的棵数、单个树的规模、样本总数。如果你 데이터 量达到几十万行特征上百个训练几百棵树可能要等很久。我第一回跑百万级数据时没注意n_jobs参数单线程跑了半个多小时后来设置n_jobs-1让所有CPU核心一起干活时间立刻降了三分之二。在scikit-learn里随机森林天然支持并行训练n_jobs-1是值得养成习惯的配置。如果训练依然太慢可以先调低n_estimators到50再把max_features调小一点或者限制max_depth。有人会问减少树的棵数会不会让准确率下降这不一定。很多数据集中50棵树和500棵树的准确率差距很小只是50棵的方差更大。实际操作时我会先用小参数组合做快速实验确认特征和预处理没问题后再上大火力。内存也是容易忽略的点。保存多棵树会占用空间模型文件动不动几十MB甚至上百MB。如果你打算部署到内存受限的环境建议先用feature_importances_筛选特征把不重要的列删掉然后重新训练通常能把模型体积压缩不少准确率损失可以忽略。5. 我的实操体会与扩展建议5.1 踩坑记录随机森林不是万能的我见过不少人把随机森林当万能药拿来处理所有表格数据。但它有几个明显短板我列几个自己踩过的坑。第一随机森林非常擅长处理数值型表格数据但对高维稀疏特征比如文本分类里的词袋表现一般。特征数量达到几万甚至几十万时每个节点只抽平方根个特征可能会漏掉关键信号效果不如线性模型或朴素贝叶斯。我之前处理过一批文本分类数据随机森林准确率一直上不去换成简化后的线性模型反而更好。第二随机森林无法自动处理缺失值。scikit-learn实现里缺失值需要提前填充否则就会报错。很多初学者把含空值的数据直接丢进去结果一脸懵。先做缺失值统计再用均值、中位数或单独填充策略处理这是标准流程。第三随机森林虽然能输出特征重要性但无法给出像线性模型那样的系数方向。比如它告诉你某个特征重要却不会直接告诉你“这个特征越大结果越可能是正类”。如果你需要这种明确的正负相关性解释建议搭配SHAP工具或者在特征层面做单变量分析。5.2 后续可以尝试的方向掌握随机森林之后你可以往几个方向扩展。第一是梯度提升树比如常用实现里的GradientBoostingClassifier或新的直方图实现这类模型常常比随机森林准确率更高但参数调节更复杂、更容易过拟合。第二是极端随机树也就是ExtraTrees它在选择分裂点时比随机森林更随机训练更快有时准确率还更高。第三是随机森林的回归版本RandomForestRegressor处理连续值预测时思路完全一样。如果你对随机性这个话题感兴趣还可以去研究集成学习的底层理论包括偏差-方差分解。理解这些东西之后再看其他集成模型就会觉得非常轻松。我个人建议不要急着追新技术先把随机森林吃透因为它是一把钥匙能打开整个集成学习的大门。最后分享一个小技巧把random_state设好每跑一次实验都记录结果你会慢慢培养出对模型“什么时候靠谱、什么时候不靠谱”的直觉。这种直觉比记住任何参数组合都值钱。

相关新闻

报错盲注实战解析:从SQL注入闭合判断到数据提取

报错盲注实战解析:从SQL注入闭合判断到数据提取

第一次在某个众测平台的靶场题单里看到第53题时,页面上只有一个ID参数。输入1、2、3都有正常返回,输入4、5、6直接提示无数据。功能越简单,越让人觉得可疑——这几乎就是SQL注入的标准开局。再看题目标注“报错盲注”,心里的方向就…

2026/10/17 4:45:14 阅读更多 →
庖丁解牛:从PHP 8到Redis,打通后端请求全链路优化

庖丁解牛:从PHP 8到Redis,打通后端请求全链路优化

从一个让我尴尬的面试题说起:这四个方向为何被放在一起有段时间我负责给团队做技术面试,问到一道自认为很温和的题:“PHP 8 相比 PHP 7 主要改了哪些东西,你实际用到了几个?”结果让我意外——大多数候选人能背出 JIT、…

2026/10/17 4:45:14 阅读更多 →
superpowers是什么?从安装配置到Java与Codex实战的AI编程工作流指南

superpowers是什么?从安装配置到Java与Codex实战的AI编程工作流指南

先说结论:这年头叫“superpowers”的项目不少,但如果你搜到的是一堆 GitHub 仓库、CLI 工具和“superpowers 安装”“superpowers 使用教程”这类热词混在一起,那九成九不是某个单一软件,而是一套开发工作流增强方案。我把它拆开揉…

2026/10/17 4:44:14 阅读更多 →

最新新闻

freeCodeCamp信息安全认证实操:HelmetJS+Python渗透测试

freeCodeCamp信息安全认证实操:HelmetJS+Python渗透测试

freeCodeCamp的信息安全认证我在去年集中过一段时间认真刷完了,前后花了大概三周。这套认证和其他课程最大的不同在于,它不是为了让你背几个概念,而是逼着你真正去写代码:一边用HelmetJS给Express应用加固防护,一边用P…

2026/10/17 5:24:25 阅读更多 →
景区旅游小程序源码部署与二次开发全流程指南

景区旅游小程序源码部署与二次开发全流程指南

简介:这份PHP经典源码面向希望学习Web应用开发或搭建景区在线服务平台的开发者,以旅游小程序为实战场景,覆盖预订、导航、信息查询等核心业务。源码包共1952个文件,约27.88MB,以1186个PHP文件为主体,辅以ph…

2026/10/17 5:24:25 阅读更多 →
让机器人学会设计下一个自己:Physical RSI与AutoResearch方法论拆解

让机器人学会设计下一个自己:Physical RSI与AutoResearch方法论拆解

1. 从RoboDojo榜单说起:一个成立3个月的团队凭什么登顶RoboDojo这个名字,最近在机器人学习圈子里被反复提起。它本质上是一个面向具身智能体的综合评测基准,覆盖抓取、装配、移动操作、多步任务规划等几十类任务,评分维度不只看成…

2026/10/17 5:24:25 阅读更多 →
Claude Code模板全解析:从CLAUDE.md到Hooks的工程化实践

Claude Code模板全解析:从CLAUDE.md到Hooks的工程化实践

claude-code-templates 这个名字,最近在开发者圈子里出现的频次明显高了起来。拆开看其实很直白:一组围绕 Claude Code 这个终端级 AI 编程助手设计的模板方案,涵盖 CLAUDE.md 项目指令文件、斜杠命令、权限策略、hooks 钩子配置等一整套可复…

2026/10/17 5:24:25 阅读更多 →
Vim快速上手指南:从模式到高效编辑的完整攻略

Vim快速上手指南:从模式到高效编辑的完整攻略

说实话,每次有新人问我“如何快速学会vim”,我都有点不知道怎么回答。因为vim这东西,用“学会”这个词其实不太准确,更贴切的说法是“习惯”——它是把你从鼠标和菜单的舒适区里硬拽出来,逼着你的手指和思维重新建立一…

2026/10/17 5:24:25 阅读更多 →
Claude Code模板化实战:把项目约定固化,让AI编程助手真正懂你

Claude Code模板化实战:把项目约定固化,让AI编程助手真正懂你

项目标题往那摆,说白了就是一句话的事儿:Claude Code 的真正效率,不在于你问得多细,而在于你给它的模板有多靠谱。今年 Claude Code 这类命令行 AI 编程工具火了之后,最容易被忽略的就是“模板化”这件事。很多人拿到 …

2026/10/17 5:23:24 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →