WOE编码完全指南:从数学原理到Python实现的风控特征工程
在信贷风控、用户增长、营销响应这类二分类问题里特征工程做来做去最后大家都会遇到同一个东西WOE编码。很多刚接触特征工程的读者会把它当成某种“高级黑魔法”其实说白了WOE编码就是把一个原始特征的值或区间换成一组带业务含义的数值核心目的是让模型能更好地利用原始变量中的“区分能力”。今天这篇不打算只讲概念我会把WOE的数学原理、分箱逻辑、完整的Python实现以及生产环境里常见的坑全部串起来直接整理成一份可以照抄的实操方案。这篇内容适合正在做风控评分卡、需要处理大量离散特征或稀疏特征的建模工程师也适合准备入门特征工程、想搞明白“为什么代码里要写那么多边界判断”的算法新人。读完至少能解决三个问题WOE到底在算什么、代码应该怎么写才不出错、上线之后为什么WOE分布会漂移。我还会把我在实际项目里踩过的一些坑一并写出来尽量让大家少走弯路。1. 为什么特征工程里绕不开WOE编码1.1 从业务含义看WOE信息的量化先说个直观的场景。假设我们在做一个“用户是否会再次下单”的二分类模型原始特征里面有“用户历史下单次数”。这个特征本身是连续数值但直接丢给逻辑回归时模型默认“下单次数每增加1对数几率就线性增加一个固定系数”。问题在于真实业务往往不是线性的从0次到1次的边际变化远比从100次到101次要剧烈。WOE编码本质上做了这样一件事把原始特征切分成若干段分箱每一段单独计算“在这个箱子里好样本分布比例”和“坏样本分布比例”的差异程度再取对数。这相当于把一个原始数值转换成了“基于目标变量的一维信息量”。我习惯把它理解成“这个箱子的情报增益”如果某个箱子里好样本的占比明显高于全样本的基准占比那这个箱子的WOE值就会明显偏离0模型就能从中获得正向的区分信号。相比之下自然语言处理里的Embedding把离散ID映射到低维稠密向量WOE编码则是把一维特征映射到一维实数只不过映射规则是由目标变量驱动设计的。这也是它有监督性质的原因同一个特征在不同任务上WOE编码结果完全不同。比如“下单次数”在“是否再购”场景和“是否流失”场景里箱子的边界和WOE值都是两套东西。1.2 WOE在特征工程体系中的位置很多团队的特征工程流程是缺失值填充 - 异常值截断 - 分箱 - 编码 - 进入模型。WOE编码通常出现在“分箱之后”。它和两种常见方案有本质区别。一是独热编码。独热编码对类别特征天然友好不存在顺序假设但遇到高基数特征比如城市、渠道ID有几十上百种就会生成大量稀疏列带来维度爆炸和内存压力。WOE编码不改变维度一个原始特征经过WOE编码之后还是一个新的数值特征且数值携带了目标分布信息它在逻辑回归这类线性模型里表现尤其稳定。二是标签编码。标签编码直接按类别给整数编号比如城市A记1、城市B记2模型会错误学习到“2比1更重要”的顺序关系。WOE编码则不存在这个问题因为它的数值大小只反映好/坏样本占比的对数比值跟类别顺序无关天然破坏了对原始标签的“伪顺序”。从模型链路的角度来看WOE编码的最大优势是“单调性和线性假设的匹配”。评分卡模型以逻辑回归为主逻辑回归的输出是特征线性组合后经过sigmoid映射模型要求特征与logit之间尽量单调。WOE编码后的特征每个箱子的WOE值与logit呈近似的线性关系这在很大程度上能提升模型表现。如果你后续要切换到树模型也能用WOE编码后的特征但树模型对原始值做切分的能力更强所以很多团队在树模型里反而会选其他编码方案。这是选型时第一个需要考虑的取舍。1.3 WOE与IV的连带关系聊WOE编码一定会冒出IVInformation Value这个概念。IV值其实就是所有分组WOE值的加权求和权重是好样本分布比例与坏样本分布比例的差值。我通常会先看IV判断一个变量“有没有信息量”再决定要不要对它做WOE编码。IV值一般有经验参考范围小于0.02说明变量几乎没有区分能力适合直接扔掉0.02到0.1之间属于弱变量可以结合业务决定是否保留0.1到0.3之间是比较理想的区间信息量足够又不至于异常超过0.5的变量要警惕往往意味着存在时间穿越或者与目标定义高度重合上线后稳定性会出问题。这套标准在评分卡场景里被反复验证过可以作为初筛的参考线。2. 从公式到分箱WOE计算的每一步决策2.1 公式拆解别被对数吓到WOE公式长这样WOE_i ln( 该箱好样本占比 / 该箱坏样本占比 )写成更标准的记号就是WOE_i ln( (Good_i / Good_T) / (Bad_i / Bad_T) )其中Good_i是第i个箱子里好样本的个数Bad_i是坏样本个数Good_T和Bad_T分别是全样本的好样本总数、坏样本总数。注意这里用的是“分布比例”而不是“箱内好坏比”这一点很多初学者会搞混。举个例子某个箱子里有30个好样本、10个坏样本全样本有300个好样本、100个坏样本那么该箱的分布比例分别是0.1和0.1WOE是ln(1)0尽管箱内好坏比是3比1但由于箱子的好坏分布与全局一致它没有额外信息量。取对数这个动作第一是为了把小于1的值变成负数、大于1的值变成正数这样正负号天然代表“这个箱子偏向好样本还是坏样本”第二是把比值映射到近似对称的空间避免直接被极小、极大的数值支配。如果某个箱子里坏样本占比明显高于全局坏样本分布比例大于好样本分布比例比值小于1那WOE就是负数这在评分卡里通常意味着“扣分区间”。作为信息量指标IV的公式是IV Σ ( Good_i / Good_T - Bad_i / Bad_T ) * WOE_i每一个箱子的贡献就是好样本分布占比与坏样本分布占比的差值乘以WOE把所有箱子的贡献相加就得到整个变量的IV。如果好样本和坏样本在所有箱子里的分布完全一致WOE全为0IV也就等于0说明变量对目标没有区分能力。2.2 分箱策略等频与最优分箱WOE计算的第一步是分箱分箱方式直接决定编码质量。我用过四类主要方式它们各有适用场景。等距分箱最简单把取值范围等分比如0到100切10段每段间距10。但这种方式的痛点是对数据分布敏感大量样本挤在某个区间时会导致箱子内样本极不均衡WOE估计方差大。除非特征本身近似均匀分布否则我很少直接用它。等频分箱更常用让每个箱子里的样本量尽量接近。pandas里的qcut就能实现指定分位数得到箱子边界。等频分箱的好处是每箱样本量充足WOE指标更稳健尤其适合长尾分布明显的数据比如收入、金额、次数这类变量。缺点是可能为了“样本量相等”而把业务上有意义的区间切碎比如收入在某个税务临界点两侧被硬生生切开。决策树分箱是另一种常用方案。我把目标变量作为标签、特征作为唯一输入训练一个浅层分类树用树的分裂点作为分箱边界。决策树天然选择“区分能力最强”的切分点因此生成的箱子在IV上往往更优。但它有个小隐患浅树对噪声敏感换一份样本可能箱子的边界漂移很大稳定性不如等频分箱。实际操作中我会先用等频或者卡方分箱做一版保底方案再用决策树分箱做对比如果两者IV差距明显就选择更稳的一版。卡方分箱则是基于相邻箱体的分布差异做合并统计上更严谨但实现复杂度高一些如果数据量大还需要额外维护分箱器工程成本并不低。2.3 平滑处理分母为零时的保护机制直接套公式的时候经常会遇到一个箱子内坏样本数或好样本数为0的情况这时分母是0ln值会直接变无穷大或者NaN。我习惯在公式里加一个很小的平滑项比如WOE_i ln( (Good_i / Good_T 0.5) / (Bad_i / Bad_T 0.5) )或者把分子分母都加1这种加1平滑在文本分析里属于常见的拉普拉斯平滑在WOE场景下同样适用。加多少取决于样本量样本量很大时0.5和1的区别微乎其微但在小数据集上平滑参数稍微调大一点WOE的绝对值会明显被压缩这点要注意。顺带说一句如果某个箱子的好坏样本占比极小比如只有几万个样本里挑了5个好样本那一整箱的WOE值会很大但实际上这个箱子的统计意义很弱。这时候我倾向于做“箱体合并”检查每个箱子的样本数小于全局样本量的2%就和相邻箱合并宁可牺牲一点信息也不要把噪声放大进模型。2.4 用完整示例走一遍计算为了更直观我构造一个小例子。设定好样本与坏样本的区分目标是“是否按时还款”好样本数量Good_T300坏样本数量Bad_T100特征为账户注册天数切成三个箱。箱子编号样本范围好样本数Good_i坏样本数Bad_i好分布占比坏分布占比WOE_i单项IV贡献1[0, 30)60500.20.5-0.9160.2752[30, 180)120300.40.30.2880.0293[180, 10000)120200.40.20.6930.139第一个箱子的好分布占比0.2、坏分布占比0.5WOEln(0.2/0.5)ln(0.4)-0.916说明注册天数在30天以内的用户明显偏坏负分第二个箱子的WOE接近0区分能力弱第三个箱子正分。总IV0.443属于区分度比较强的变量。可以看到WOE编码后的数值方向是有业务含义的负值对应风险较高的区间正值对应风险较低或表现更好的区间。这也让后续在评分卡里“扣分/加分”的映射变得可以直接解释。3. 可落地的Python实现与工程化细节3.1 等频分箱加手动计算新手最先掌握的版本在写通用封装之前先用一个零依赖、逻辑透明的代码跑通全流程更容易理解每一步在干什么。下面这段代码基于某开源数据集的模拟分布任何二分类DataFrame都能用。import pandas as pd import numpy as np def woe_single_feature(df, feature, target, bins5): # 等比频分箱duplicatesdrop是为了避免边界重复 df_temp df[[feature, target]].copy() df_temp[bin] pd.qcut(df_temp[feature], qbins, duplicatesdrop) # 汇总每个箱子的好/坏样本数 grouped df_temp.groupby(bin)[target].agg([sum, count]) grouped.columns [bad, cnt] grouped[good] grouped[cnt] - grouped[bad] # 全局好坏样本数 bad_total grouped[bad].sum() good_total grouped[good].sum() # 计算分布占比、WOE、IV grouped[bad_dist] grouped[bad] / bad_total grouped[good_dist] grouped[good] / good_total grouped[woe] np.log(grouped[good_dist] / grouped[bad_dist]) grouped[iv] (grouped[good_dist] - grouped[bad_dist]) * grouped[woe] return grouped, grouped[iv].sum()注意这个版本用的是np.log也就是自然对数。如果哪个地方用np.log10算出来的WOE会差一个常数倍数不影响排序但和行业惯例不一致评分卡里统一用自然对数最稳妥。3.2 完整的WOE编码器封装对齐sklearn风格上线建模时不能每次都在Notebook里手写一遍分箱逻辑。我会封装一个可重复调用的类支持fit、transform、测试集边界截断这样在交叉验证和线上推理时都能保持一致。from sklearn.base import BaseEstimator, TransformerMixin class WOEEncoder(BaseEstimator, TransformerMixin): def __init__(self, colsNone, bins5, min_samples0.02): self.cols cols self.bins bins self.min_samples min_samples self.woe_dict_ {} self.bin_edges_ {} def fit(self, X, y): df X.copy() if self.cols is None: self.cols df.columns.tolist() for col in self.cols: ser df[col] # 如果类别数少直接用类别作为分箱 if ser.nunique() self.bins: cut_points sorted(ser.dropna().unique()) else: try: _, cut_points pd.qcut(ser, qself.bins, retbinsTrue, duplicatesdrop) cut_points cut_points[1:-1] except Exception: cut_points [] self.bin_edges_[col] np.unique(cut_points) # 构造分组区间标签 binned pd.cut(ser, bins[-np.inf] list(self.bin_edges_[col]) [np.inf]) grouped df.groupby(binned)[y].agg([sum, count]) grouped.columns [bad, cnt] grouped[good] grouped[cnt] - grouped[bad] bad_total grouped[bad].sum() good_total grouped[good].sum() grouped[good_dist] grouped[good] / good_total grouped[bad_dist] grouped[bad] / bad_total # 平滑项避免除零 grouped[woe] np.log((grouped[good_dist] 0.5) / (grouped[bad_dist] 0.5)) self.woe_dict_[col] grouped[woe].to_dict() return self def transform(self, X): df X.copy() for col in self.cols: edges self.bin_edges_[col] binned pd.cut(df[col], bins[-np.inf] list(edges) [np.inf]) df[col] binned.map(self.woe_dict_[col]).astype(float) return df这段代码主要做了几件事一是对低基数类别特征直接按原始类别分箱避免qcut强行把离散值切出无意义的区间二是用retbins拿到分箱边界方便后续测试集映射三是在transform阶段用固定的边界进行区间映射保证训练集和测试集的分箱逻辑完全一致四是加了平滑项处理。这个类可以直接放进Pipeline里配合GridSearchCV使用对后续做特征筛选和模型调参都很方便。3.3 测试集和线上特征怎么保持一致性实际项目中常出现这样的问题模型在训练集上表现很好到了验证集却崩了最后发现是测试集的特征编码方式和训练集不一致。比如训练集里“用户访问次数”的最大值是200分箱边界到200但测试集里来了个500次访问的用户pd.cut默认会把它归到NaN箱WOE映射直接变成NaN模型预测值就飘了。解决办法是设置“包含无穷区间”的边界处理还要决定新箱的WOE值怎么定。我通常把超过训练集最大边界的新值落到最后一个箱用最后一个箱的WOE值填充。也可以把无法命中的值统一填充为0代表“无信息”但这样会让线上预测偏离训练分布。我更推荐在模型里保留一个“未知箱”的概念让它独立参与拟合而不是硬编码为0。# transform阶段补充注意替换NaN df[col] binned.map(self.woe_dict_[col]) # 无法映射的箱训练集没出现过的区间填充为0 df[col] df[col].fillna(0.0)3.4 缺失值的处理策略缺失值在WOE体系里不是随便填充一个均值就行正确的思路是把“缺失”本身当成一个独立的箱子。很多人先填充-999再走正常分箱这不是不行但-999可能会把大量正常值挤到一个箱子里导致边界失真。更稳的做法是单独标记“缺失”作为一个类别然后计算缺失箱的WOE值。在封装代码里实现方式是先单独提取缺失值样本计算它们的WOE再对非缺失部分做分箱计算。实测下来如果缺失率不高比如低于5%直接让缺失值落到独立箱体对IV的影响非常小如果缺失率超过20%这个缺失箱往往会有很强的业务含义比如注册时没填年龄的人群整体违约率就是偏高此时缺失箱的WOE值会很极端务必保留而不是填充均值。4. 常见坑与排查实录从理论到部署的最后一公里4.1 分箱数到底选多少分箱数没有一个绝对标准但我用过一条很实用的经验线分箱数控制在3到8之间。分箱太少会丢失信息分箱太多则每箱样本量不足WOE估计方差增大模型在测试集上的泛化能力会下降。以样本量10万、坏样本比例5%即坏样本5000个为例如果分10个箱平均每箱只有500个坏样本分布占比的波动幅度会很可观WOE的置信区间很宽。如果分5个箱每箱1000个坏样本稳定性明显更好。同时还要监督一个现象如果某个箱子的样本量占比低于2%即使它WOE很漂亮也要考虑合并因为线上这个特征分布稍微一波动这个箱子就可能变成空箱子。4.2 好坏样本为0时的处理顺序我在真实数据里遇到最多的错误就是除零。比如某个特征的某个区间恰好全是好样本没有坏样本直接计算会是inf。平滑加在分布占比后必须小心如果先算分布占比再对0加0.5效果等同于给分子加了超小值但我更建议在计算分布占比之前直接给计数加平滑也就是WOE_i ln( (Good_i 1) / Good_T / ( (Bad_i 1) / Bad_T ) )这样分母里不会出现0。在实际工程里也可以配合“箱体合并”策略来处理优先保证每个箱子两个类别的样本都至少有几个。4.3 类别特征的高基数问题WOE编码一个常被忽略的细节是它对类别特征天然友好但前提是类别基数不能太高。当某个类别特征的取值有几百上千种时直接按类别计算WOE会把长尾类别变成独立箱子而这些类别样本量很少WOE值极不稳定。我的处理步骤是先按目标变量的bad rate对类别排序然后合并成若干“风险桶”再计算这些桶的WOE。比如城市特征里有几百个城市可以先把城市按坏样本率从低到高排序切分成5-10个桶后续就按这5-10个桶做WOE编码。这样做既保留了区分能力又规避了高基数噪声。另一种做法是先用计数器统计每个类别的样本数与坏样本占比过滤掉样本量过小的类别把它们统一归为“其他”箱。4.4 时间漂移和WOE稳定性检查在金融风控领域模型上线后最容易出现的问题不是AUC不够高而是WOE分布随季度漂移。常见表现是训练集里某个箱子的WOE是负的到了新的月份这个箱子的好样本占比突然上升WOE的符号反向了导致模型的打分方向都不可信。我每次做完WOE编码都会顺手算一下“按月份分组的WOE”并画趋势图。如果某个箱子在不同月份之间的WOE波动很大说明这个特征不稳定要谨慎纳入最终模型。针对风控场景我还会算PSIPopulation Stability Index它的公式和IV很相似PSI ∑(

相关新闻

基于YALMIP的微网优化调度建模与求解实践

基于YALMIP的微网优化调度建模与求解实践

1. 微网优化调度这件事,到底在优化什么?做电力系统优化有一段时间的人,多半会撞上同一个坎:微网调度模型不难理解,但要自己从头写一套能跑、能改、能向别人解释的求解代码,很容易卡在“数学公式和代码之间差…

2026/10/11 18:27:37 阅读更多 →
上线后没人看见?SEO收录与Open Graph分享卡片实操指南

上线后没人看见?SEO收录与Open Graph分享卡片实操指南

“做完能跑”和“被人看见”完全是两件事。我自己上线过几个小项目,第一周打开统计后台,除了自己的浏览器记录,剩下的就是爬虫的抓取日志,再往后连爬虫都不常来了。标题里这句“为什么上线后还是没人看见你”,几乎是每…

2026/10/11 18:27:41 阅读更多 →
Oracle联表查询全解析:从JOIN语法到执行计划的性能优化

Oracle联表查询全解析:从JOIN语法到执行计划的性能优化

最近一次熬夜排查慢查询,问题最终落在一个看起来毫无破绽的联表语句上。那条 SQL 并不复杂,两个表做关联取数,执行计划走完,索引该用的都用了,可报表就是出不来。反复核对之后才发现,连接类型和条件位置都没…

2026/10/11 15:05:03 阅读更多 →

最新新闻

稀疏视角新视角合成:VGGT-Diff几何引导视频扩散模型实战

稀疏视角新视角合成:VGGT-Diff几何引导视频扩散模型实战

1. 稀疏视角新视角合成到底难在哪1.1 从“拍几张照片就能环视物体”说起新视角合成(Novel View Synthesis,NVS)这个任务,说人话就是:给你若干张从不同角度拍的照片,让你“脑补”出从其他没拍过的角度看上去…

2026/10/12 9:24:59 阅读更多 →
给对话AI装上“外置大脑”:Claude外部记忆工具实战指南

给对话AI装上“外置大脑”:Claude外部记忆工具实战指南

1. 为什么需要给Claude装上“记忆”:从一个经常断线的项目说起做AI开发的人大概都经历过这种崩溃瞬间:刚跟对话式助手聊到关键部分,聊了几十轮以后它突然把一个小时前你自己确认过的技术选型给忘了,让你重新解释一遍需求&#xff…

2026/10/12 9:24:59 阅读更多 →
Hyperf 安装部署完全指南:环境要求、Composer 脚手架与 Docker 开发实践

Hyperf 安装部署完全指南:环境要求、Composer 脚手架与 Docker 开发实践

后端Web框架微服务RPC框架异步编程 【免费下载链接】hyperf 🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease. 项目地址: https://gitcode.com/hyperf/hyperf 点击查看 免费下载 …

2026/10/12 9:24:59 阅读更多 →
SAML 2.0 SSO单点登录实战:从XML断言解析到会话治理避坑指南

SAML 2.0 SSO单点登录实战:从XML断言解析到会话治理避坑指南

简介:一份面向.NET与Java开发者的SAML 2.0单点登录实现资源包,覆盖VS2005、VS2008、VS2010三个版本,并附带部分Java代码与说明文档。包内完整展示了客户端发起SAML请求、SSO响应验证信任、加密断言返回、客户端解密及有效性校验的登录闭环&am…

2026/10/12 9:24:59 阅读更多 →
轻型AI中台:面向中企的OCR+规则引擎数据协同方案

轻型AI中台:面向中企的OCR+规则引擎数据协同方案

1. 项目概述:为什么一个“轻型AI中台”能真正撬动业务一线的痛点我做企业数字化落地快十二年了,从最早帮工厂装ERP,到后来给银行做RPA流程自动化,再到最近三年密集接触中小金融机构、区域型连锁零售、本地生活服务商——发现一个反…

2026/10/12 9:24:59 阅读更多 →
数据复制深度拆解:从HDFS块复制到CDC同步的机制、实践与容灾设计

数据复制深度拆解:从HDFS块复制到CDC同步的机制、实践与容灾设计

大数据领域做久了,你会发现一个很朴素但又绕不开的现实: 数据复制 几乎贯穿了所有核心系统的生命周期。无论是离线数仓里的表同步、实时链路里的CDC采集,还是跨机房容灾里的镜像复制,本质上都在做同一件事——把一份数据从A点搬…

2026/10/12 9:23:59 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →