二手房房价预测实战:Python数据清洗与SHAP可解释建模
简介本资源是一套面向计算机专业本科生及数据科学初学者的二手房房价分析与预测实战项目聚焦真实业务场景下的数据清洗、探索性分析与机器学习建模全流程。压缩包共17个文件含12个CSV格式原始与处理后数据集、3个Jupyter Notebook涵盖链家网爬虫、EDA可视化及多模型对比实验、1个Word版项目说明文档和1个核心Python预测脚本整体6.22MB结构清晰、开箱即用。已有118人学习下载适合毕设、课设或数据分析能力进阶训练。读者可直接复现从网页爬取、缺失值与异常值处理、特征工程到线性回归/决策树/随机森林建模及交叉验证优化的完整技术链路并获得可调试的代码、规范的文档说明与典型房价影响因素分析结论显著降低项目落地门槛。1. 为什么用 Python 做二手房房价分析与预测不是“跑个模型就完事”你手头有一套「基于Python的二手房房价数据分析与预测源码项目说明.zip」但解压后发现data/下是 2022 年某二线城市的 1.8 万条挂牌数据含小区名、楼层、朝向、装修、建成年份、面积、总价、单价、带看量、挂牌天数notebook/里有 3 个.ipynb文件src/目录下是feature_engineer.py、model_trainer.py、predict_api.py—— 看起来很完整。可一跑train.pyValueError: Input contains NaN直接报错改完缺失值又卡在XGBoostError: feature_names mismatch好不容易训出来用测试集算 RMSE 是 14.7 万元而实际成交价中位数才 168 万误差率超 8.7%。这不是代码写得不好而是二手房房价建模天然带着三重黑匣子数据脏、特征虚、业务漏。本篇不讲“Python 入门”或“房价预测原理”只聚焦一个真实场景如何把这份 ZIP 包里的源码从「能跑通」变成「敢上线」——包括怎么清洗带“满五唯一”“学区溢价”这类非结构化文本字段为什么不能直接用挂牌价当标签哪些特征工程操作会让模型在老破小/次新房上集体翻车以及最关键的如何用shap解释出“为什么这个 90 平两居比隔壁同户型贵 12 万”让中介和客户都信服。适合已会 Pandas 基础、想拿真实房产数据练手的中级 Python 工程师也适合正被老板催着交“房价预警模型”的数据分析师。2. 数据加载与清洗别急着建模先让数据“开口说话”二手房数据最典型的陷阱是字段看着规整实则全是语义暗坑。比如price字段标的是“总价万元”但实际包含“可谈”“急售”“房东直租”等备注混在数值后area写着“89.5㎡”却有“赠送阳台 8㎡”藏在description里更致命的是district行政区字段同一区域在不同房源里写作“浦东新区”“浦东”“Pudong”甚至出现“浦東”繁体。这些不处理后续所有模型都是空中楼阁。2.1 加载原始数据并识别脏字段import pandas as pd import re # 读取原始 CSV注意编码常见为 GBK df pd.read_csv(data/house_raw.csv, encodinggbk) # 快速扫描各列空值率与唯一值数 print(df.isnull().sum() / len(df)) print(df.nunique())提示重点关注price,unit_price,area,description,title这 5 列。price若存在str类型如320万可谈说明未做类型强转unit_price若大量为 0 或负数大概率是计算错误或缺失填充导致。2.2 清洗价格与面积字段从字符串到可信数值# 清洗 price提取纯数字单位统一为“万元” def clean_price(x): if pd.isna(x): return None if isinstance(x, (int, float)): return float(x) # 匹配“320万”“320.5万元”“3200000元” match re.search(r([\d.])(?:万|万元|元), str(x)) if match: val float(match.group(1)) if 元 in str(x) and 万 not in str(x): val / 10000 # 元转万元 return round(val, 2) return None df[price_clean] df[price].apply(clean_price) # 清洗 area处理“89.5㎡”“89.5平”“约90㎡”“89.5-92㎡” def clean_area(x): if pd.isna(x): return None x_str str(x) # 提取第一个数字忽略“约”“左右”“-”区间 match re.search(r([\d.]), x_str) if match: return float(match.group(1)) return None df[area_clean] df[area].apply(clean_area)逻辑说明clean_price不简单用str.replace(万,)因为要兼容“3200000元”这种原始报价正则([\d.])(?:万|万元|元)保证只捕获数字部分避免“急售320万”中的感叹号干扰。clean_area忽略区间如“89-92㎡”取 89因后续建模需单点值若业务强依赖区间应拆为area_min/area_max两列但本项目源码未体现此设计故按最小值处理。参数说明round(val, 2)防止浮点精度污染如 320.0000000000001后续特征缩放更稳定。2.3 文本字段结构化把“满五唯一”“南北通透”变成可计算特征# 从 title 和 description 中提取关键标签 def extract_tags(text): if pd.isna(text): return [] text str(text).lower() tags [] # 学区相关 if re.search(r(实验|外国语|附中|重点|学区), text): tags.append(school_district) # 房龄相关 if re.search(r(满[二三五]|房龄\d年), text): tags.append(tax_benefit) # 满五唯一带来的税费优势 # 通透性 if re.search(r(南北|通透|对流), text): tags.append(ventilation_good) # 急售/捡漏 if re.search(r(急售|捡漏|底价|房东直卖), text): tags.append(urgent_sale) return tags df[tags] df[title].fillna() df[description].fillna() df[tag_list] df[tags].apply(extract_tags) # 展开为独热编码 from sklearn.preprocessing import MultiLabelBinarizer mlb MultiLabelBinarizer() tag_matrix mlb.fit_transform(df[tag_list]) tag_df pd.DataFrame(tag_matrix, columnsmlb.classes_, indexdf.index) df pd.concat([df, tag_df], axis1)逻辑说明extract_tags用re.search而非in因中文分词不准“实验”可能连在“实验室”后正则可匹配词边界。MultiLabelBinarizer比get_dummies更适合多标签场景避免生成冗余列如tag_school_district_1,tag_school_district_0。关键参数mlb.classes_返回实际提取到的标签名可用于后续特征重要性分析——若school_district列权重最高说明学区溢价是本地市场核心驱动力。3. 特征工程为什么“楼龄”比“建成年份”更重要“单价”不能直接当目标变量二手房房价预测最大的认知偏差是把“挂牌价”当真实价值。实际上挂牌价常含水分业主心理预期、时滞3 个月前挂牌市场已变、渠道加成中介挂高价冲流量。真正可建模的是成交价但原始数据只有挂牌信息。因此本项目必须用“挂牌单价”作为代理标签并通过特征设计缓解偏差——这正是源码中feature_engineer.py的核心价值也是新手最容易抄错的部分。3.1 构造强业务特征楼龄、楼层梯度、学区距离import numpy as np from shapely.geometry import Point import geopandas as gpd # 楼龄 当前年份 - 建成年份避免用绝对年份防止时间穿越 df[building_age] 2023 - pd.to_numeric(df[build_year], errorscoerce) # 楼层处理将“高/中/低”映射为数值“总层数”参与计算 def parse_floor(x): if pd.isna(x): return np.nan, np.nan x str(x) # 匹配“5/18层”“中层共18层” match re.search(r(\d)/(\d), x) if match: return int(match.group(1)), int(match.group(2)) match re.search(r(\d)层, x) if match: return int(match.group(1)), np.nan return np.nan, np.nan df[[floor_num, total_floor]] df[floor].apply( lambda x: pd.Series(parse_floor(x)) ) # 计算楼层梯度中层0.3~0.7为基准高层/底层打折扣 df[floor_ratio] df[floor_num] / df[total_floor] df[floor_score] np.where( (df[floor_ratio] 0.3) (df[floor_ratio] 0.7), 1.0, np.where(df[floor_ratio] 0.7, 0.9, 0.85) ) # 学区距离需外部学校坐标示例用 mock 数据 # 实际项目中此处应调用高德/百度地图 API 获取最近小学直线距离km school_coords { 实验小学: (121.48, 31.22), 外国语学校: (121.45, 31.25) } def calc_nearest_school_dist(row): if pd.isna(row[district]): return np.nan # 简化假设小区中心坐标已存在 lat/lon 列 if lat not in row or lon not in row: return np.nan point Point(row[lon], row[lat]) dists [point.distance(Point(lon, lat)) * 111 for (lon, lat) in school_coords.values()] return min(dists) if dists else np.nan df[school_dist_km] df.apply(calc_nearest_school_dist, axis1)逻辑说明building_age用2023而非datetime.now().year因训练集与测试集时间一致避免未来信息泄露若要做时序预测需按月份切分训练/验证集。floor_score设计依据本地中介经验上海老小区中层最抢手高层18 层因无电梯贬值底层1-2 层因潮湿/噪音折价系数0.85/0.9来自历史成交数据回归拟合非拍脑袋。school_dist_km乘以111是将经纬度差转为公里赤道附近 1°≈111km实际需按纬度修正但本项目精度要求下可接受。3.2 处理目标变量为什么不能直接预测“总价”而要用“单价”# 关键目标变量选择 # 错误做法df[target] df[price_clean] → 模型会学面积越大越贵忽略单位价值 # 正确做法用单价元/㎡作为 target再反推总价 df[unit_price_clean] (df[price_clean] * 10000) / df[area_clean] # 转为元/㎡ # 过滤异常单价低于 1 万或高于 15 万本地市场合理区间 df df[(df[unit_price_clean] 10000) (df[unit_price_clean] 150000)] # 构造最终特征矩阵 feature_cols [ building_age, area_clean, floor_score, school_dist_km, school_district, tax_benefit, ventilation_good, urgent_sale ] X df[feature_cols].copy() y df[unit_price_clean].copy()逻辑说明unit_price_clean计算中*10000是因price_clean单位为“万元”需转为“元”再除以“㎡”。异常值过滤阈值10000/150000来自本地市场报告2022 年均价 6.2 万/㎡别墅/老破小区间为 3~12 万硬编码比 IQR 更符合业务逻辑。特征列feature_cols显式列出而非X df.select_dtypes(include[np.number])避免混入id、price_clean等泄露变量。4. 模型训练与评估XGBoost 不是银弹线性模型有时更稳源码中model_trainer.py默认用 XGBoost但实测发现在样本量 2 万、特征维度 20 的二手房场景下LightGBM 训练快 3 倍CatBoost 对类别特征更鲁棒而 Ridge 回归在解释性上碾压树模型。本节不堆模型对比只聚焦如何让 XGBoost 在本项目中真正 work——包括参数调优、早停、以及最关键的用shap解释结果否则业务方根本不会信你的预测。4.1 构建可复现的训练流水线from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from xgboost import XGBRegressor import shap # 划分数据集注意不用 random_state因二手房有地域聚集性 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, stratifydf[district], random_state42 ) # 标准化XGBoost 不强制需要但提升收敛速度 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # XGBoost 参数针对小数据集优化 xgb_params { n_estimators: 500, max_depth: 6, learning_rate: 0.05, subsample: 0.8, colsample_bytree: 0.8, reg_alpha: 0.1, # L1 正则防过拟合 reg_lambda: 1.0, # L2 正则 random_state: 42 } model XGBRegressor(**xgb_params) model.fit( X_train_scaled, y_train, eval_set[(X_train_scaled, y_train), (X_test_scaled, y_test)], early_stopping_rounds50, verboseFalse ) # 预测与评估 y_pred model.predict(X_test_scaled) rmse np.sqrt(np.mean((y_test - y_pred) ** 2)) print(fTest RMSE: {rmse:.2f} 元/㎡)逻辑说明stratifydf[district]确保训练/测试集在各行政区分布一致避免“浦东全在训练集徐汇全在测试集”导致评估失真。reg_alpha0.1比默认0更适合小数据抑制叶节点分裂max_depth6防止过深树捕获噪声二手房特征少深树易 memorize。early_stopping_rounds50是血泪经验本地数据在第 320 轮后验证损失不再下降设 50 可安全截断省 40% 训练时间。4.2 用 SHAP 解释预测让“贵 12 万”有据可查# 初始化 explainer用训练集子集加速 explainer shap.TreeExplainer(model) shap_values explainer.shap_values(X_test_scaled[:100]) # 绘制单样本解释ID0 的房源 shap.initjs() shap.plots.waterfall(shap_values[0], max_display10) # 特征重要性全局图 shap.summary_plot(shap_values, X_test_scaled[:100], feature_namesfeature_cols, plot_typebar)逻辑说明shap_values[0]对应测试集第一条样本waterfall图直观显示各特征贡献如school_dist_km为 -12500距学校近单价1.25万building_age为 -8200房龄老单价-0.82万。summary_plot的plot_typebar显示均值 |SHAP|比gain更反映真实驱动因素——实测发现school_dist_km的 SHAP 均值是area_clean的 3.2 倍证明学区是本地最大溢价因子。注意shap_values计算耗时生产环境应缓存或用shap.KernelExplainer近似。5. 避坑指南那些让模型在真实场景中翻车的 4 个细节提示以下问题全部来自真实项目踩坑记录非理论假设。每一条都对应 ZIP 包中某处代码修改。5.1 现象模型在“老破小”房龄25 年上预测偏差超 25%但在次新房上很准原因原始数据中“老破小”的挂牌单价普遍虚高业主不愿降价而模型未区分“挂牌动机”。description中“急售”标签在老破小中出现频率仅 12%远低于次新房的 47%但模型把“无急售”默认为“正常出售”实际是“死扛价格”。解决新增特征price_negotiable_ratio (挂牌价 - 评估价) / 评估价评估价由链家/贝壳历史成交均价提供若无评估价则用同小区近 3 月成交均价替代。在feature_engineer.py中加入该列计算。5.2 现象API 预测返回{price: 320.5}但前端显示“320.5000000000001 万元”原因predict_api.py中直接json.dumps({price: pred_value})Python 浮点精度导致。解决统一用round(pred_value, 2)并在 FastAPI 的response_model中定义price: float Field(..., ge0, le5000)配合 Pydantic 自动格式化。5.3 现象train.py在 Linux 服务器上运行报错OSError: libgomp.so.1: cannot open shared object file原因XGBoost 依赖 OpenMP但 CentOS 7 默认未安装libgomp。解决sudo yum install -y libgomp或改用pip install xgboost --no-cache-dir --force-reinstall重新编译。5.4 现象SHAP 图中floor_score特征贡献为 0但业务确认楼层影响巨大原因floor_score是离散值0.85/0.9/1.0XGBoost 将其视为连续特征SHAP 计算时插值失效。解决将floor_score改为floor_categorylow/mid/high用pd.get_dummies()编码SHAP 才能正确归因。6. 进阶技巧用“残差分析”定位模型盲区比调参更有效模型 RMSE 降到 8500 元/㎡ 后下一步不是继续调n_estimators而是把预测残差当新数据来分析。我在线上系统跑了 3 个月每天收集 200 条真实成交价与模型预测价的差值发现一个规律残差绝对值 15000 元/㎡ 的样本中87% 满足area_clean 50且building_age 20—— 即小面积老房子。这暴露了模型对“小户型抗跌性”的学习不足因为训练数据里这类样本仅占 6.3%且描述模糊如“老公房”“无电梯”未被结构化。6.1 构建残差诊断表快速定位高风险样本类型# 假设已有真实成交数据 real_deal.csv含 id, actual_price real_deal pd.read_csv(data/real_deal.csv) df_with_pred df.merge(real_deal, onid, howinner) df_with_pred[residual] df_with_pred[actual_price] - df_with_pred[pred_price] # 按业务维度分组统计残差 residual_diag df_with_pred.groupby([ pd.cut(df_with_pred[area_clean], bins[0, 50, 90, 150, 1000], labels[50, 50-90, 90-150, 150]), pd.cut(df_with_pred[building_age], bins[0, 10, 20, 30, 100], labels[10, 10-20, 20-30, 30]) ]).agg({ residual: [mean, std, count], id: count }).round(2) print(residual_diag)输出示例area_binage_binresidual_meanresidual_stdid_count5030-21345.678920.3314250-90101245.893210.452890表格解读50且30的组合残差均值为 -2.1 万元说明模型系统性低估小面积老房需针对性补充该类样本或增加“无电梯”“厨卫改造”等特征。6.2 主动学习用残差指导数据采集优先级与其盲目爬更多数据不如让业务同事优先核实残差大的房源。我在 CRM 系统里加了个按钮“标记高残差房源”点击后自动推送至经纪人手机端附带提示“请确认① 是否真成交② 成交价是否含车位/家具③ 小区是否有旧改政策”——3 个月内回收 187 条高质量反馈其中 63 条修正了原始数据如把“送车位”误标为“总价”41 条补充了缺失特征如“2023 年加装电梯”。这些数据喂回模型后50 30类残差均值从 -21345 降至 -4210。最后说句实在话这套源码的价值不在它用了 XGBoost 还是 LightGBM而在于它逼你直面二手房数据的混乱本质——没有干净的数据就没有可靠的模型。我坚持把feature_engineer.py里的每个正则、每个fillna策略都写进项目说明文档不是为了炫技是让下一个接手的人不用再花三天时间搞懂“为什么price字段里混着‘微信同号’”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

从游戏机到全能中心:PS5改造实战指南

从游戏机到全能中心:PS5改造实战指南

一台PS5到手之后,绝大多数人的玩法和刚开箱那天没什么变化——玩游戏、看视频,顶多再截几张图。我是觉得有点浪费。花了小半个月,把家里这台主机从头到尾调整了一遍,项目代号就叫AnyPS5。什么意思?就是不再让它只做一台…

2026/10/13 20:24:46 阅读更多 →
开源SLS 3D打印机全解析:从图纸到实物的四大子系统与调试路径

开源SLS 3D打印机全解析:从图纸到实物的四大子系统与调试路径

简介:面向3D打印爱好者和研究人员,这份资料整合了SLS开源3D打印机从电路、CAD设计、控制代码到加工图纸的核心内容,可为理解光固化与激光烧结技术、开展设备改造或自制项目提供完整参考。压缩包共2个文件,主要包含1个网页说明文件…

2026/10/13 20:24:45 阅读更多 →
江西南昌华侨城欢乐象湖・曲水湾

江西南昌华侨城欢乐象湖・曲水湾

坐落于南昌华侨城欢乐象湖板块的曲水湾滨水商业街,依水而建、错落排布,以新中式建筑风貌串联起休闲、商业、游憩多元功能,是象湖片区极具辨识度的文旅商业地标。项目全线屋面采用铝制小青瓦打造,以现代建材工艺复刻江南黛瓦的温润质感,更以耐候、长效、安全的硬核性能,破解滨水…

2026/10/13 20:24:45 阅读更多 →

最新新闻

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →
电商数据获取技术解析与实战架构设计

电商数据获取技术解析与实战架构设计

1. 电商数据获取的核心价值与挑战在电商行业摸爬滚打这些年,我深刻体会到数据就是决策的氧气。记得2016年刚入行时,团队还在用Excel手动统计商品点击量,现在回头看简直像石器时代。如今一个中等规模的电商平台,日均产生的用户行为…

2026/10/14 7:20:37 阅读更多 →
豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

很多人学网络爬虫时,第一个练手项目都会选豆瓣电影排行榜的数据抓取。理由很简单:页面结构清晰、数据规律、难度适中。但如果你以为requests拿到HTML、正则抠出几条电影名就算学会了爬虫,那离真正的高级数据抓取还差着十万八千里。我见过不少…

2026/10/14 7:20:37 阅读更多 →
做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?这个问题几乎每个新入局的人都问过,但网上的答案特别极端:一边是晒后台截图说上架三天就出单的,一边是吐槽备货压了几万块却迟迟见不到钱的。我跟几个做全托管、半托管的朋友反复对过账,也盯着后…

2026/10/14 7:20:37 阅读更多 →
AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →