泰坦尼克号生存预测:从数据清洗到模型构建的完整数据科学实践
1. 从数据到洞察为什么泰坦尼克号预测是数据科学的“Hello World”如果你刚接触数据科学或机器学习大概率会从“泰坦尼克号乘客生存预测”这个项目开始。它就像编程界的“Hello World”看似简单却几乎涵盖了数据科学工作流的所有核心环节数据获取、探索性分析、特征工程、模型构建与评估。很多人把它当作一个练手任务但真正深入下去你会发现这个“经典”项目里藏着无数新手容易踩的坑以及从数据中挖掘故事的艺术。这个项目的目标很明确根据乘客的票务、个人信息、家庭情况等数据预测他们在泰坦尼克号沉没事件中是否幸存。它之所以经典是因为数据集规模适中、特征含义清晰且背后有真实的历史背景让分析过程充满了探索的乐趣。你处理的不是冷冰冰的数字而是一个个曾经鲜活的生命这使得特征工程和模型解释变得尤为重要。在接下来的内容里我不会仅仅给出一个“标准答案”或代码流水账。相反我会带你走一遍一个数据科学从业者面对这个项目时的完整思考路径我们如何从原始数据中发现问题如何通过可视化“看见”数据背后的故事如何创造新的特征来提升模型“智商”以及最终如何选择一个既准确又可解释的模型。更重要的是我会分享那些教程里通常不会写的“脏活累活”和判断依据比如面对缺失值时的几种处理策略及其适用场景特征选择时如何避免“数据泄露”这个初学者杀手以及如何解读模型结果让它不仅仅是冷冰冰的准确率数字。2. 数据初探与清洗你的第一印象往往藏着关键线索拿到泰坦尼克号数据集通常指train.csv很多人的第一步是匆匆瞥一眼就开始建模。这是一个巨大的误区。数据探索EDA不仅是例行公事更是你与数据的第一次“对话”这次对话的质量直接决定了后续所有工作的方向。正确的做法是像侦探勘察现场一样不放过任何蛛丝马迹。2.1 加载数据与整体概览首先我们使用Pandas加载数据并快速查看其结构。这里的关键不是运行代码而是理解每个输出告诉了我们什么。import pandas as pd import numpy as np # 加载数据 train_df pd.read_csv(train.csv) test_df pd.read_csv(test.csv) # 通常用于最终提交但探索阶段也要看 # 查看数据形状和基本信息 print(f训练集形状: {train_df.shape}) print(f测试集形状: {test_df.shape}) print(\n训练集前5行:) print(train_df.head()) print(\n训练集信息:) print(train_df.info())运行train_df.info()后你会立刻发现几个关键问题缺失值Age年龄列有大量缺失约20%Cabin船舱号缺失更严重约77%Embarked登船港口有少量缺失。Fare船票价格在测试集中有个别缺失。数据类型Name、Sex、Ticket、Cabin、Embarked是对象类型字符串需要处理才能用于大多数模型。潜在无关特征PassengerId是纯粹索引Ticket号码混乱初步看可能信息量有限。仅仅知道有缺失值还不够我们需要知道它们如何分布。一个高级技巧是可视化缺失值矩阵这能帮你直观判断缺失是随机发生还是存在某种模式例如某些舱位的乘客年龄信息缺失更严重。如果缺失存在模式直接删除或简单填充可能会引入偏差。2.2 深入分析核心特征与目标的关系接下来我们要看每个特征与生存率Survived的关系。这里不能只看平均数要分维度交叉分析。首先看性别Sex这是最强的预测因子之一。计算分组生存率train_df[[Sex, Survived]].groupby(Sex).mean().sort_values(bySurvived, ascendingFalse)你会发现“女性优先”的原则在数据中体现得淋漓尽致女性的生存率远高于男性。这几乎是一个确定性规则模型会很快抓住这一点。再看乘客等级Pclass它代表了社会经济地位。用分组柱状图来看import matplotlib.pyplot as plt import seaborn as sns sns.barplot(xPclass, ySurvived, datatrain_df) plt.title(Survival Rate by Passenger Class) plt.show()图表会清晰显示一等舱乘客的生存率最高三等舱最低。这揭示了救援时的阶级差异。然后是年龄Age这是分析的重头戏也是难点。不能只看整体生存率要结合分布来看。我常用的方法是绘制“分布对比图”将幸存者和遇难者的年龄分布密度曲线画在一起。# 分离幸存与遇难者数据 survived train_df[train_df[Survived]1][Age].dropna() not_survived train_df[train_df[Survived]0][Age].dropna() plt.figure(figsize(10,6)) sns.kdeplot(survived, shadeTrue, labelSurvived, colorgreen) sns.kdeplot(not_survived, shadeTrue, labelNot Survived, colorred) plt.xlabel(Age) plt.title(Age Distribution by Survival) plt.legend() plt.show()这个图会告诉你很多故事幼儿特别是5岁以下的生存概率很高体现了“妇孺优先”中“孺”的落实而20-40岁的青壮年男性遇难比例显著偏高。这里的一个关键心得是对于Age这样的连续特征直接扔进模型可能不如将其分箱离散化成“儿童”、“青年”、“中年”、“老年”等类别因为生存率与年龄并非线性关系分箱能帮助线性模型更好地捕捉模式。关于同行亲属数量SibSp Parch这两个特征分别代表兄弟姐妹/配偶数量和父母/子女数量。单独看可能规律不强但将它们组合起来创建新特征FamilySize家庭规模 SibSp Parch 1和IsAlone是否独自一人后故事就出现了。通常中等规模家庭2-4人的生存率最高独自出行或家庭非常庞大的乘客生存率较低。独自出行可能意味着缺少互助而大家庭可能在混乱中失散。2.3 制定并执行数据清洗策略基于以上探索我们开始清洗。这不是一步到位的而是一个迭代过程。1. 处理缺失值Age年龄直接删除缺失行会损失20%的数据不可取。简单用整体均值或中位数填充太粗糙会模糊不同群体间的差异。更合理的策略是基于其他特征进行分组填充。例如我们可以根据Pclass舱位和Sex性别分组用该组的年龄中位数来填充该组内的缺失年龄。因为头等舱的乘客平均年龄可能比三等舱大男性的平均年龄可能与女性不同。# 按Pclass和Sex分组计算年龄中位数 age_median_by_group train_df.groupby([Pclass, Sex])[Age].median() # 定义一个函数来填充年龄 def fill_age(row): if pd.isnull(row[Age]): return age_median_by_group[row[Pclass], row[Sex]] return row[Age] train_df[Age] train_df.apply(fill_age, axis1)Cabin船舱缺失率太高且很多记录里的船舱号是字母数字如C85。一个有效策略不是填充具体值而是提取有用信息。我们可以创建新特征Deck甲板从Cabin的第一个字母提取例如‘C’。即使Cabin缺失我们也可以创建一个新类别‘U’Unknown来表示。甲板位置可能与救生艇距离相关从而影响生存。train_df[Deck] train_df[Cabin].apply(lambda x: x[0] if pd.notnull(x) else U)Embarked登船港口只有2个缺失值直接用众数出现最频繁的港口填充即可。Fare票价测试集中有个别缺失。可以用该乘客所在Pclass舱位的票价中位数来填充因为票价与舱位强相关。2. 转换数据类型与编码Sex从‘male’, ‘female’映射为0, 1。Embarked和Deck使用独热编码One-Hot Encoding因为它们是名义变量没有顺序关系。避免使用标签编码Label Encoding给它们强加一个虚假的数值顺序。Age考虑分箱。例如分为[0, 12, 18, 35, 60, 100]对应‘Child’, ‘Teenager’, ‘Young Adult’, ‘Adult’, ‘Senior’。这能更好地捕捉非线性关系。3. 创建新特征特征工程雏形Title称谓从Name中提取‘Mr.’, ‘Mrs.’, ‘Miss’, ‘Master’, ‘Rare’等。称谓隐含了年龄、性别、社会地位信息如‘Master’是对未成年男孩的尊称。FamilySize和IsAlone如前所述。TicketFrequency同一票号出现的频率。这可能代表团体购票团体成员可能一起行动。注意所有在训练集上进行的操作如计算填充值、定义分箱边界、编码映射都必须原封不动地应用到测试集上。这是保证模型评估公正性的铁律否则就会导致“数据泄露”即测试集信息“污染”了训练过程造成模型在实际中表现虚高。3. 特征工程的魔法从原始数据中创造“信息”数据清洗后我们得到的是干净但仍是“原始”的数据。特征工程的目标是利用领域知识在这里是对泰坦尼克号事件的了解和数据分析创造出对模型预测更有力的新特征。这是区分普通分析和出色分析的关键。3.1 深度挖掘姓名Name字段Name字段看起来杂乱但它是金矿。除了提取Title我们还可以思考称谓的稀有度像‘Don’, ‘Lady’, ‘Sir’, ‘Countess’这样的稀有称谓可能指向社会地位极高的乘客他们的生存策略可能不同。我们可以将出现次数很少的称谓归为‘Rare’一类这本身就是一个有区分度的特征。姓氏Surname提取姓氏并结合FamilySize可以更精确地定位家庭成员。虽然最终模型可能不直接使用姓氏但在分析阶段检查同一姓氏家庭的生存情况能验证“家庭互助”或“集体遇难”的假设。3.2 解码船票Ticket与船舱CabinTicket号通常被认为是噪声。但仔细观察部分票号包含字母前缀如‘PC’ ‘CA’ ‘A/5’。这些前缀可能代表票务类型、代理商或团体代码。我们可以将票号分为“纯数字”和“含字母前缀”两类或者直接提取前缀作为一个分类特征。有字母前缀的票号是否与特定舱位或生存率相关这值得探索。对于Cabin我们已提取了Deck。更进一步可以研究不同Deck甲板的生存率。历史上高层甲板如A、B更接近救生艇生存率可能更高。此外Cabin的缺失本身可能就是一个信号缺失Cabin信息的乘客可能是三等舱乘客记录不全或者船员数据集中可能未包含其生存模式可能与有Cabin记录的乘客不同。因此一个简单的HasCabin是否有船舱记录特征可能就有效。3.3 组合特征的威力这是特征工程的核心。单个特征信息有限但组合起来可能产生“112”的效果。Age与Pclass一个年轻的三等舱乘客和一个年轻的一等舱乘客面临的处境可能天差地别。可以创建交互特征如Age*Pclass或者直接生成一个组合类别特征。Fare与FamilySize创建FarePerPerson人均票价特征。一张高昂的一等舱船票如果由一家四口分享其人均消费所代表的社会经济地位可能与独自乘坐一等舱的乘客不同。IsAlone与Sex独自出行的女性和独自出行的男性生存率差异极大。可以创建IsAlone_Female,IsAlone_Male这样的特征。一个重要的实操心得是不要一次性创建几十个新特征然后全部扔进模型。这会导致维度灾难和过拟合。更好的方法是每创建一两个新特征就快速检查它们与目标变量Survived的相关性对于数值特征或者观察在不同类别下的生存率差异对于分类特征。只有那些显示出一定区分度的新特征才值得保留并进入下一步的建模流程。你可以使用相关性矩阵热图或分组柱状图来进行这种快速验证。4. 模型构建、评估与选择寻找最佳的“预测官”特征准备就绪后我们进入建模阶段。这里的目标不是追求一个在训练集上分数最高的“黑箱”模型而是找到一个兼具良好预测性能与可解释性的模型让我们能理解数据背后的故事。4.1 基准模型与多样化尝试首先我们需要一个简单的基准。逻辑回归Logistic Regression是一个完美的起点。它简单、快速、可解释性强。我们用处理好的特征训练一个逻辑回归模型在训练集上通过交叉验证看看它的性能。这个分数将作为我们评估更复杂模型的“及格线”。接着尝试一些经典的机器学习算法随机森林Random Forest它能自动处理非线性关系和特征交互通常能取得不错的基准性能还能给出特征重要性排序。梯度提升树如XGBoost, LightGBM这类模型在结构化数据竞赛中表现强势能高效地捕捉复杂模式。支持向量机SVM可以尝试但对于这种可能特征间存在复杂交互的数据集其表现有时不如树模型。关键步骤数据分割。在训练最终模型前我们必须从原始训练集train.csv中分出一部分作为验证集Validation Set。绝对不能直接用整个训练集训练然后在测试集test.csv上看结果那样你无法在提交前可靠地评估模型。通常使用train_test_split分出20%-30%作为验证集。from sklearn.model_selection import train_test_split # 假设 X 是特征矩阵y 是标签 X_train, X_val, y_train, y_val train_test_split(X, y, test_size0.2, random_state42, stratifyy)参数stratifyy非常重要它确保分割后训练集和验证集中幸存与遇难的比例与原数据集一致避免因随机分割导致的比例偏差。4.2 模型评估超越准确率模型训练后我们看什么指标准确率Accuracy是最直观的但在这个数据不平衡遇难人数多于幸存人数的数据集上它可能产生误导。例如一个模型如果简单预测所有人都遇难它在训练集上的准确率也能超过60%但这显然是个无用的模型。因此我们必须结合其他指标精确率Precision在所有预测为幸存的人中真正幸存的比例。这衡量了“预测幸存”的可靠性。召回率Recall在所有真正幸存的人中被模型预测出来的比例。这衡量了模型发现幸存者的能力。F1分数F1-Score精确率和召回率的调和平均数是一个综合指标。ROC-AUC这个指标衡量模型区分“幸存”和“遇难”两类乘客的能力对类别不平衡相对不敏感是非常好的整体性能指标。查看混淆矩阵能给你最直观的感受你的模型主要错在哪儿是把太多遇难者预测为幸存者假阳性还是漏掉了太多幸存者假阴性根据你对问题的理解你可能需要调整模型的决策阈值来优化精确率或召回率。4.3 模型解释理解模型为何做出预测对于泰坦尼克号这样的项目模型解释和预测本身一样重要。我们想知道是哪些因素主导了生死决策。逻辑回归可以直接查看特征的系数Coefficient。系数的大小和正负代表了该特征对“生存”对数几率的影响。例如Sex_female的系数为正且很大这符合历史事实。树模型随机森林、XGBoost可以查看特征重要性Feature Importance。这告诉我们哪些特征在模型做决策时被用得最多。通常你会发现Sex、Pclass、Age、Fare排名靠前。这验证了我们的探索性分析。更高级的工具如SHAP值可以解释每一个预测是如何做出的。它能告诉你对于某个具体的乘客他的“女性”身份为他增加了多少生存概率他的“三等舱”身份又减少了多少概率。这种个体层面的解释力非常强大。4.4 避免过拟合与超参数调优在验证集上表现良好后你可能会想尝试更复杂的模型或更多的特征来冲击更高分数。但要警惕过拟合——模型在训练集上表现完美但在未知数据验证集/测试集上表现骤降。对抗过拟合的方法正则化在逻辑回归、SVM等模型中加入正则化项如L1, L2。交叉验证使用K折交叉验证来更稳健地评估模型性能而不是单次分割。超参数调优使用网格搜索Grid Search或随机搜索Random Search来寻找模型的最佳参数组合如随机森林的树深度、XGBoost的学习率。切记调优必须在验证集上进行或者使用交叉验证绝对不能用测试集来调优。特征选择如果特征太多可以使用递归特征消除RFE或基于模型重要性的选择剔除不重要的特征简化模型。一个实用的技巧是在调优时同时监控模型在训练集和验证集上的性能。如果训练集分数持续上升而验证集分数停滞甚至下降就是过拟合的明确信号。5. 从结果到洞见模型告诉了我们什么历史当你的最终模型在验证集上取得了稳定且不错的性能例如逻辑回归AUC0.85集成模型AUC0.88并准备好对测试集进行最终预测后工作并未结束。数据分析的终极目的是产生洞见。我们可以利用模型来量化不同因素对生存机会的影响从而更深刻地理解那段历史。例如我们可以用模型模拟一些“反事实”分析如果一位三等舱的年轻女性支付了相当于二等舱的票价高FarePerPerson她的生存概率会比普通三等舱女性高多少“妇孺优先”原则中“孺”的边界在哪里模型是否显示超过一定年龄的“儿童”生存优势就消失了独自出行的头等舱男性与有大家庭陪伴的三等舱男性谁的生存机会更大通过分析特征重要性、SHAP值以及进行这种模拟我们能够超越简单的“女性生存率高”的结论给出更细腻、更量化的历史解读社会经济地位Pclass,Fare在危机中提供了多大的缓冲作用家庭纽带FamilySize在生死关头是助力还是负担个体的某些特征如拥有稀有Title能否在极端环境下带来一丝特例。最终这个项目教会我们的远不止如何使用sklearn拟合一个模型。它训练的是一种数据思维如何带着问题审视数据如何通过巧妙的转换将原始信息变为预测能力如何严谨地评估模型并理解其内在逻辑以及如何将冰冷的数字输出转化为关于人性和历史的温暖洞见。这才是“泰坦尼克号预测”这个经典项目历久弥新的真正价值。

相关新闻

从工具到队友:构建可持续协作的AI编程助手工作流

从工具到队友:构建可持续协作的AI编程助手工作流

1. 项目概述:从“工具”到“队友”的范式转移最近在折腾AI编程助手,发现一个挺有意思的现象:大家用Coding Agent,比如GitHub Copilot、Cursor,或者各种开源的Code Agent框架,大多还是停留在“工具”的层面。…

2026/10/13 10:21:14 阅读更多 →
终极Windows 11精简指南:如何用tiny11builder让旧电脑焕发新生

终极Windows 11精简指南:如何用tiny11builder让旧电脑焕发新生

终极Windows 11精简指南:如何用tiny11builder让旧电脑焕发新生 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 还在为Windows 11的臃肿而烦恼吗&#…

2026/10/13 10:21:16 阅读更多 →
技术分析进阶:OBV、MFI与资金流向指标实战解析

技术分析进阶:OBV、MFI与资金流向指标实战解析

1. 从价格到资金:为什么成交量指标是技术分析的“第二双眼睛”在交易的世界里,绝大多数新手,甚至不少老手,眼睛都死死地盯着价格K线图。价格涨了,欢欣鼓舞;价格跌了,垂头丧气。这就像只通过一个…

2026/10/5 10:56:50 阅读更多 →

最新新闻

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

我不会起名字322 后端 / 算法 / 数据库 📘 技术栈 | 🧩 力扣 Hot100 | 🐹 Go 项目 | 🟥 Redis | 🐬 MySQL 文章目录K8s 探针配置的 3 个反直觉行为:为什么 P…

2026/10/13 10:20:50 阅读更多 →
Linux 6.12 源码深度剖析: shrink_node

Linux 6.12 源码深度剖析: shrink_node

Linux 6.12 内核深度解析:内存回收核心引擎 shrink_node 1. 📌 技术点速览 在 Linux 内存管理系统中,当物理内存紧张、达到或低于特定的水位线(Watermark)时,内核必须启动页面回收(Page Reclaim)机制以释放物理内存。shrink_node 函数是整个内存回收子系统的核心控制…

2026/10/13 10:20:50 阅读更多 →
闲鱼自动回复不生效怎么办?叮当小宝CS排查三步

闲鱼自动回复不生效怎么办?叮当小宝CS排查三步

闲鱼的自动回复是卖家最常用也最常出状况的功能:明明设了话术,买家发来消息却没有回。这篇按三步排查把常见原因过一遍,再说说闲鱼自带工具的边界,以及单量上来之后怎么补位。## 先查:设置是否真的保存生效路径再走一遍…

2026/10/13 10:20:50 阅读更多 →
十六进制转十进制C语言代码实现

十六进制转十进制C语言代码实现

本文章主要讲解: 将输入的十六进制数转化为十进制数的C语言代码实现过程知识较为基础&#xff0c;若有不足请各位多多指教首先给出完整实现代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define weish…

2026/10/13 10:20:50 阅读更多 →
Godot VisibleOnScreenNotifier2D 实战指南:基于渲染剔除的 2D 屏幕可见性检测

Godot VisibleOnScreenNotifier2D 实战指南:基于渲染剔除的 2D 屏幕可见性检测

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 VisibleOnScreenNotifier2D 是 Godot Engine 官方文档&#xff08;本仓库 godot-docs&#x…

2026/10/13 10:20:50 阅读更多 →
HANA数据库HA高可用双机架构原理

HANA数据库HA高可用双机架构原理

HA双机架构的核心概念与设计思路拆解1. 主流HA模式&#xff1a;共享存储 vs. 存储复制HANA HA主要有两种实现模式&#xff0c;选择哪一种&#xff0c;取决于你的基础设施策略和成本考量。共享存储架构&#xff08;Shared Storage&#xff09; &#xff1a;这是较为传统和经典的…

2026/10/13 10:19:49 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →