R语言心脏病术后复发预测建模详解:从数据处理到模型评估
简介面向心脏病术后复发预测场景的R语言医学分析教程定位为临床研究与医疗数据分析实操指南适合医学研究人员、临床数据分析师以及具备基础编程概念的R语言学习者。内容围绕医学数据全流程展开从数据集导入与探索、相关系数分析与统计描述到缺失值处理、SMOTE不平衡矫正再到逻辑回归、随机森林、支持向量机、梯度提升机等多种模型的搭建与交叉验证同时涵盖准确率、精确率、召回率、F1、ROC与AUC等评估指标以及基于varImp的特征重要性解释。包体共906个文件压缩包大小约41.52MB主要包含R源码脚本、RMarkdown分析文档、HTML结果报告、PNG可视化图表、CSV/XLSX数据文件及RDS模型对象目录结构清晰便于按章节检索复现。目前已有585人学习浏览。通过这套教程读者可拿到完整可运行的R脚本与配套笔记、图表和模型对象能够独立完成心脏病术后复发风险预测任务为临床决策提供数据支撑。1. 心脏病术后复发预测为什么我选择R语言而不是一把梭Python拿到一批冠心病术后随访数据第一时间想到的往往不是深度学习而先把数据洗干净让模型给出可解释的结论。R语言在生物医学统计里扎根很深从tidyverse的数据清洗到caret的模型训练再到ROCR的评估可视化一堆包能串成一条完整链路。这份教程正是按这条链路组织的导入数据、探索风险因素、处理缺失值和不平衡样本、训练逻辑回归/随机森林/SVM/XGBoost最后用交叉验证和特征重要性让结果向医生解释得通。适合刚接触医学数据分析的R用户也适合想补齐建模评估环节的从业者。读完你就会明白为什么这类预测任务里R比“一把梭Python”更顺手。2. 数据准备与探索从原始病历到可建模的data.frame2.1 数据导入与结构检查readr与data.table的取舍医学随访数据通常是CSV或Excel导出第一件事是把它读成干净的data.frame。基础read.csv()不是不能用但在大文件上慢还会自作主张把字符串列变成因子后面建模时因子顺序很容易搞乱。我习惯优先用readr包它速度快、列类型推断合理能保留字符串原本的样子。library(readr) heart - read_csv(heart_followup.csv) # 看结构每列类型、前几行、缺失情况 str(heart) glimpse(heart)str()输出每个变量的类型和样例值能一眼看出年龄被读成字符还是数值glimpse()是dplyr风格的结构预览适合快速确认列名。这里有个容易被忽略的点read_csv默认把空白字符串读成NA所以不用额外处理。如果文件特别大比如几十万行基因表达数据我会换data.table::fread()它内存占用更小而且支持select和colClasses精准控制读取列但对普通随访数据来说readr已经足够了。读完之后马上做summary()这是我判断数据有没有明显异常的习惯动作。summary(heart)输出会给出每列的均值、中位数、分位数和缺失值数量。比如年龄最小值为0、收缩压最大值为300这种明显逻辑错误就要回头查原始表。很多教程只讲summary()能看统计量但真正有用的动作是把它和领域知识对照心脏病随访人群年龄下限一般不会低于20岁如果出现0说明数据清洗没过关。2.2 相关性分析与缺失值处理cor()、is.na()与填补策略探索阶段的核心问题是哪些因素和术后复发相关先做相关性矩阵把数值变量之间的关系量化出来。注意cor()默认只处理数值列而且对缺失值非常敏感。# 找出所有数值列计算两两相关系数 num_cols - heart %% select_if(is.numeric) cor_mat - cor(num_cols, use complete.obs) # 把矩阵转成长表方便可视化 library(reshape2) melted_cor - melt(cor_mat) head(melted_cor)use complete.obs表示只用没有缺失值的行来计算这是最保守的做法。如果缺失值占比不高这样的结果很稳但缺失超过20%直接用complete.obs会把样本量砍掉一大截相关性估计也可能偏。常见做法是先看缺失分布再做抉择。colSums(is.na(heart))这行代码返回每一列的缺失数量一眼看出哪些变量是“重灾区”。处理方式要看场景如果某列缺失超过30%多数情况下我会直接删除该列比如“术后心绞痛频次”只记录了一半人这种信息缺失本身就可能是有偏的如果缺失很少可以na.omit()删行或者按中位数填补。# 删除含缺失的行不推荐一上来就这么干 heart_clean - na.omit(heart) # 更保守只针对年龄做中位数填补 heart$age[is.na(heart$age)] - median(heart$age, na.rm TRUE)我一般会先看缺失模式再决定。血泪经验是na.omit()一次删掉30%样本后面建模方差大到没法看。更好的方案是保留能用的信息分类变量缺失当作“未知”类别连续变量用中位数或mice多重插补。但这份教程的起点是常规随访数据缺失比例通常不高简单填补就够了。2.3 不平衡数据的处理过采样、欠采样与SMOTE实战心脏病术后复发率一般不高可能只有5%到15%。这种不平衡数据会让模型学出一个“无脑预测不复发”的傻子模型。处理思路有欠采样、过采样和SMOTE三种。欠采样是随机删除多数类样本简单但浪费数据过采样是复制少数类样本容易过拟合SMOTE则是用少数类样本之间的插值生成新样本被广泛使用。# SMOTE两个参数需要调 library(DMwR) heart_balanced - SMOTE(recurrence ~ ., data heart_clean, perc.over 200, perc.under 150) table(heart_balanced$recurrence)perc.over 200表示对少数类样本过采样200%也就是每个少数类样本生成2个新样本perc.under 150表示过采样后从多数类样本中欠采样使多数类与少数类的比例为1.5:1。这个比例不是固定答案我通常会试两三组然后看交叉验证的F1分数。注意recurrence必须是因子变量不然DMwR会报错。SMOTE不是万能的它假设少数类样本之间有线性关系如果特征空间高度非线性插值出来的样本可能落在临床不可能的区域。所以我把它当成一种“数据增强”手段而不是数据生成的金标准。对于严重不平衡还可以考虑caret::upSample()或ROSE包效果大同小异关键是别在测试集上做任何重采样。3. 建模从逻辑回归到集成学习选型依据与代码实现3.1 逻辑回归作为基线glm()的系数比正确率更重要建模第一步永远是逻辑回归。它不是最强模型但提供了一个可解释的基线后续所有复杂模型都该打赢它才有意义。逻辑回归的glm()函数在R里非常成熟支持公式语法还能直接输出每个特征的系数和p值。set.seed(42) train_idx - createDataPartition(heart_clean$recurrence, p 0.7, list FALSE) train - heart_clean[train_idx, ] test - heart_clean[-train_idx, ] model_glm - glm(recurrence ~ age sex hypertension diabetes cholesterol smoking family_history, data train, family binomial) summary(model_glm)createDataPartition来自caret包它做分层抽样保证训练集和测试集里复发比例和原数据接近。这点很重要直接sample()很可能会抽出不平衡的两个子集。summary()输出里最应该看的是回归系数、标准误和Pr(|z|)。系数为正表示该因素增加复发风险p值小于0.05通常被认为有统计显著性。预测阶段要输出概率不能直接输出类别。因为你还需要阈值、AUC这些后续评估。test$pred_glm - predict(model_glm, test, type response)type response返回的是事件发生的概率默认0.5作为阈值只是习惯不是金标准。在复发率偏低的场景阈值应该下调比如0.3具体看敏感度和特异度的权衡。3.2 随机森林与SVM黑匣子与核技巧的取舍随机森林是集成学习里的常青树对特征尺度不敏感能处理非线性关系而且自带importance可以看特征重要性。SVM适合样本量不大、特征维度高的场景但在医学随访数据上往往没有随机森林稳定。library(randomForest) model_rf - randomForest(recurrence ~ ., data train, ntree 500, importance TRUE) print(model_rf)随机森林不需要标准化这是它比SVM省事的地方。ntree一般设500到1000太多了边际收益递减之后调的是mtry也就是每次分裂随机选几个特征。默认值通常是sqrt(p)对p10左右的数据可以尝试3、4、5三组。SVM在e1071包里注意它默认做分类时输出类别标签而非概率。想要概率必须显式开启。library(e1071) model_svm - svm(recurrence ~ ., data train, kernel radial, cost 1, probability TRUE) test$pred_svm - attr(predict(model_svm, test, probability TRUE), probabilities)[,1]kernel radial是高斯核能处理非线性边界cost是惩罚参数越大越容易过拟合。SVM对特征尺度敏感如果数据里有年龄和胆固醇这种量级差异大的变量必须先做z-score标准化不然距离计算会被大数变量主导。我一般会先跑一遍scale()再做SVM效果差距明显。模型可解释性是否需要标准化处理非线性训练速度逻辑回归高不需要弱快随机森林中不需要强中SVM低必须强中XGBoost低不需要强慢3.3 梯度提升机xgboost参数比模型重要xgboost是表格数据的常见天花板但它不是开箱即用的。它不像glm那样接受公式必须手动构造矩阵而且标签必须是0和1不能是因子。这一步很容易翻车。library(xgboost) train_matrix - model.matrix(recurrence ~ . - 1, data train) label - as.numeric(train$recurrence) - 1 dtrain - xgb.DMatrix(train_matrix, label label) params - list( objective binary:logistic, eta 0.1, max_depth 3, subsample 0.8, colsample_bytree 0.8 ) model_xgb - xgb.train(params, dtrain, nrounds 100, verbose 0)model.matrix会自动把因子变量转成哑变量-1表示去掉截距列避免多重共线性。eta是学习率越小越稳但需要更多轮数max_depth控制树的复杂度医学数据通常3到5就够太深容易过拟合subsample是行采样比例colsample_bytree是列采样比例这两个能有效防过拟合。nrounds地调法一般是先设100轮看效果再用xgb.cv配合early stopping确定最优轮数。xgboost的“玄学”在于参数组合我见过很多人拿着默认参数跑AUC反而不如逻辑回归。建议流程先用交叉验证调max_depth和eta固定这两个后再调subsample和colsample_bytree最后用xgb.cv闭环。4. 模型评估与解释不只是AUC还要回答医生“为什么”4.1 交叉验证与混淆矩阵caret的trainControl是标配单次划分训练集和测试集有运气成分交叉验证能给出更稳定的性能估计。caret把整套流程封装得很舒服trainControl()控制方法train()统一调用不同算法。library(caret) ctrl - trainControl(method cv, number 5, classProbs TRUE) model_cv - train(recurrence ~ ., data heart_clean, method gbm, trControl ctrl, metric ROC)method cv表示k折交叉验证number 5就是5折。classProbs TRUE让模型输出概率这是计算AUC的前提。metric ROC让模型按AUC而不是准确率选最优参数对不平衡数据更合适。method gbm是一个轻松切入点caret会自动调参但如果追求效果还是回到xgboost手动调。混淆矩阵看着简单但类别顺序错了会让人迷惑。confusionMatrix(factor(ifelse(test$pred_glm 0.5, Yes, No), levels c(Yes, No)), test$recurrence)第一参数是预测结果第二参数是真实标签两者必须都设为因子而且顺序一致。默认第一个level会被当成正类如果R按字母序把“No”当成正类敏感度和特异度会反掉。我一般显式写levels c(Yes, No)。4.2 ROC曲线与AUC值用ROCR包画完就知道模型有多少水分ROC曲线展示的是不同阈值下真正例率TPR和假正例率FPR的关系AUC则是曲线下面积AUC0.5表示模型和瞎猜没区别。library(ROCR) pred_obj - prediction(test$pred_glm, test$recurrence) perf - performance(pred_obj, tpr, fpr) plot(perf, col blue, lwd 2) abline(a 0, b 1, lty 2) auc_val - performance(pred_obj, auc)y.values[[1]] print(auc_val)prediction()第一个参数必须是概率不能是预测类别第二个参数是真实标签。如果AUC低于0.5先别怀疑模型多半是正类概率和标签顺序反了。y.values[[1]]取的是S4对象的第一个结果值这个语法看起来奇怪但很常见之后换成bootstrap取置信区间也会用到。在医学场景里我不只关注AUC还会看ROC曲线左上角那段如果曲线上拉很快说明可以用较低阈值换取高敏感度这对术后复发筛查很有价值。4.3 特征重要性varImp()让模型从黑匣子变回白匣子随机森林和xgboost都能输出特征重要性varImp()是caret里统一的接口。给医生汇报时这个输出比AUC更能说明问题。importance_rf - varImp(model_rf) print(importance_rf) plot(importance_rf)randomForest在训练时设置了importance TRUE这里才能计算重要性。输出的“MeanDecreaseAccuracy”表示把某个变量打乱后模型准确率下降多少“MeanDecreaseGini”表示该变量对节点纯度贡献多大。两个指标侧重点不同我通常看MeanDecreaseAccuracy因为它和预测能力的关联更直接。对xgboost可以用它自己的函数。xgb_importance - xgb.importance(model model_xgb) xgb.ggplot.importance(xgb_importance)xgb.importance返回特征名和Gain、Cover、Frequency四种指标。Gain是最常用的表示特征贡献的信息增益占比。注意xgboost的特征名带xgb.前缀对应关系要查一下。医学解释上如果年龄、高血压、胆固醇排前几说明模型的生物学逻辑成立如果某个罕见变量排第一我有理由怀疑过拟合。5. 避坑与常见问题拆这份教程时踩过的五个坑5.1 缺失值处理翻车na.omit删光了样本现象数据2000行na.omit()之后只剩400行模型训练直接报错“对比的因子数不一致”。原因好几个变量缺失率超过40%na.omit()按整行删除把有效样本全丢了。解决先跑colSums(is.na(heart)) / nrow(heart)看每列缺失率。超过30%的列直接删除比如“家庭收入”这类记录不全的字段低于5%的列用中位数或众数填补中间比例尝试mice包做多重插补或者把缺失当成一个单独类别。5.2 随机森林过拟合训练AUC接近1测试集只剩0.7现象训练集AUC 0.98测试集AUC 0.71差了整整一个量级。原因默认mtry对特征多的情况可能刚好把最强特征抽进来了再加上不设树深度限制模型把训练集的噪声也背下来了。解决用caret调mtry和nodesize。我一般让mtry从2到sqrt(p)之间取nodesize从5到20之间试。更重要的是把交叉验证作为选择依据而不是训练集表现。5.3 xgboost安装失败报“不存在叫‘getoptlong’这个名字的程辑包”现象install.packages(xgboost)编译报错或者后面跑某个依赖包时突然提示找不到getoptlong程辑包。原因多数时候是包依赖没装全或者包名输错了。getoptlong是另一个包和xgboost无关但R在编译时会因为缺少依赖跳出来容易误导。解决先确保系统里装了Rcpp、BH等依赖然后从CRAN源安装。Windows用户建议用install.packages(xgboost, type binary)跳过编译Linux用户先装系统级的libxml2-dev和libcurl4-openssl-dev。依赖缺失时用install.packages(getoptlong)把它装上再去装xgboost。5.4 ROC曲线反了AUC小于0.5曲线画在yx下方现象明明模型看起来不错AUC却只有0.2曲线对角线下边。原因正类概率和标签方向没对齐。prediction()函数要求第一个参数是正类比如“Yes”的概率而我的预测列存的是“No”的概率或者标签因子的level顺序反了。解决强制统一正类。标签用factor(heart$recurrence, levels c(Yes, No))预测时确认predict(model, type response)输出的是Yes的概率。如果用了SVM的probabilities还要检查列名和标签的对应关系。5.5 数据不平衡导致准确率虚高现象测试集复发率只有5%模型全预测“不复发”准确率95%但混淆矩阵里召回率是0。原因模型学到的先验概率就是5%用0.5作为阈值输出类别当然全部压向多数类。解决不要只看准确率。改用F1分数、召回率和AUC评估。同时在训练阶段用SMOTE或调整阈值把阈值降到和复发率接近的水平比如0.1到0.2。我还会用caret的confusionMatrix(..., positive Yes)显式指定正类让敏感度、特异度一目了然。6. 进阶技巧用Bootstrap重抽样验证模型稳定性顺便看变量顺序每种模型一次跑出来的AUC都是一个点估计换一批数据结果会有波动。医生拿着报告来问我“这个模型稳定吗”我不能只给一个单值。这时候用Bootstrap重抽样给AUC加上一个95%置信区间比单点估计更有说服力。set.seed(123) boot_auc - numeric(100) for (i in 1:100) { idx - sample(nrow(heart_clean), nrow(heart_clean), replace TRUE) d - heart_clean[idx, ] m - glm(recurrence ~ ., data d, family binomial) p - predict(m, heart_clean, type response) roc_obj - performance(prediction(p, heart_clean$recurrence), auc) boot_auc[i] - roc_objy.values[[1]] } quantile(boot_auc, c(0.025, 0.975))这段代码的核心是sample(nrow(d), replace TRUE)它做有放回抽样生成和原始数据同样大小的样本允许重复行。每次抽样都重新训练一次模型然后在完整数据集上预测记录AUC。100次循环后用quantile()取2.5%和97.5%分位数就是AUC的95%置信区间。如果置信区间宽度小于0.05说明模型在不同数据切片下表现稳定如果区间横跨0.8到0.95说明样本量不足或特征噪声大盲目上复杂模型没意义。我还会顺手记录每次Bootstrap的特征重要性排序看前几名是不是稳定出现在同一批变量里。如果一次是“年龄”一次是“胆固醇”轮流坐庄这个模型的可信度就要打问号。从那以后我每次建模都会强制走一遍Bootstrap不管最终结论是AUC 0.85还是0.75我都会把置信区间一起提交。这个习惯帮我挡掉了很多“假模型”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

ThreadLocalRandom高并发随机数生成原理与实战优化

ThreadLocalRandom高并发随机数生成原理与实战优化

1. 为什么需要重新认识ThreadLocalRandom1.1 从一次压测事故说起前阵子帮一个朋友排查线上问题,场景很典型:一个订单号生成服务,QPS 一上来就出现大量线程阻塞,CPU 飙高但吞吐上不去。用工具抓了线程栈,发现一堆线程卡…

2026/10/12 23:21:53 阅读更多 →
CSS核心机制与实战技巧:从层叠、盒模型到Flex/Grid布局

CSS核心机制与实战技巧:从层叠、盒模型到Flex/Grid布局

1. 核心技巧背后的设计逻辑:先搞懂CSS到底在解决什么问题做前端这些年,我见过太多开发者把CSS当成“会了就行的样式语言”,上来就背属性、抄代码,结果一到真实项目就露怯:样式永远差几像素,页面一缩放就乱&…

2026/10/12 23:21:53 阅读更多 →
Python网络舆情分析系统实战:从数据采集到情感分析可视化

Python网络舆情分析系统实战:从数据采集到情感分析可视化

简介:这是一套面向高校学生的Python网络舆情分析系统完整项目,可作为Python毕业设计或课程设计使用,适合具备Python基础、需要完成综合实践项目的学习者。项目采用Python 3.7或3.8开发,配合PyCharm与Navicat,数据库为M…

2026/10/12 23:21:53 阅读更多 →

最新新闻

手写Tool Use面试题:从函数到生产级工具调度系统

手写Tool Use面试题:从函数到生产级工具调度系统

1. 面试现场的真实压力:当“手写 Tool Use”成为临场能力试金石“请手写一个 Tool Use 实现。”这句话从面试官嘴里说出来的时候,我正端着一次性纸杯喝第三口温水——不是因为紧张,而是前两轮算法题刚结束,嗓子发干。但这句话一落…

2026/10/13 5:34:33 阅读更多 →
Carla 0.9.15 zlib-1.2.13 编译避坑指南:ABI兼容与符号导出实战

Carla 0.9.15 zlib-1.2.13 编译避坑指南:ABI兼容与符号导出实战

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

2026/10/13 5:34:33 阅读更多 →
Kudu线上集群性能优化实战:内存、IO与RPC调优指南

Kudu线上集群性能优化实战:内存、IO与RPC调优指南

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

2026/10/13 5:34:33 阅读更多 →
电动牙刷BLE上传刷牙时长至家长App的芯片方案与低功耗设计

电动牙刷BLE上传刷牙时长至家长App的芯片方案与低功耗设计

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

2026/10/13 5:34:33 阅读更多 →
开源BOM管理系统:从Excel到可追溯数据库的实战落地

开源BOM管理系统:从Excel到可追溯数据库的实战落地

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

2026/10/13 5:34:33 阅读更多 →
IIS管理器打开全攻略:本机启动、远程连接与排错实战

IIS管理器打开全攻略:本机启动、远程连接与排错实战

搞Windows服务器的同学都清楚,IIS管理器这个窗口,看着不起眼,却是撑起大量Web业务的关键工具。很多人以为它就是个“打开就能用”的图形界面,但在实际运维里,光是怎么把它顺利打开、正常连上远程站点,就能筛…

2026/10/13 5:33:32 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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