深度森林:常见Warning及解决方案

本文介绍了解决在使用周志华的深度森林算法GcForest时遇到的Warning问题,包括FutureWarning和ConvergenceWarning,通过调整参数如solver、multi_class和max_iter来消除警告,确保程序稳定运行。

本人最近使用周志华的深度森林算法去解决一些问题,于是在github上下载了官方的Gcforest程序,下载地址:https://github.com/kingfengji/gcForest

运行之后发现了一些Warning,有时会导致程序无法运行,下面给出两种常见的Warning和解决方案。

1. FutureWarning

 (1) FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.

 (2) FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning. "this warning.", FutureWarning).

我在第一次运行这个程序的时候,就遇到了这两个警告。原因是因为原先的代码:

     ca_config["estimators"].append({"n_folds": 5, "type": "LogisticRegression"})

逻辑回归中没有具体指明solver和multi_class,而LogisticRegression的solver一般有liblinear,lbfgs,newton-cg,sag(具体可自行百度),所以在此我将这行代码改为

     ca_config["estimators"].append({"n_folds": 5, "type": "LogisticRegression",
                                     "solver": "lbfgs",
                                     "multi_class": "auto"
                                    })

就消除了这个Warning(solver可根据数据情况自行设定,不一定非要lbfgs)。

2. ConvergenceWarning

ConvergenceWarning: lbfgs failed to converge. Increase the number of iterations. "of iterations.", ConvergenceWarning)

在消除第一个警告之后,又来了一个新警告(收敛警告),说的是lbfgs 无法收敛,要求增加迭代次数。LogisticRegression里有一个max_iter(最大迭代次数)可以设置,默认为1000。所以在此可以将其设为3000。所以将上面那段代码完善一下改为:

    ca_config["estimators"].append({"n_folds": 5, "type": "LogisticRegression",
                                     "solver": "lbfgs",
                                     "multi_class": "auto",
                                     "max_iter" : 3000
                                    })


             就消除了这个Warning。

 

 

非常感谢你提供的完整运行日志和诊断输出! 我们来**深度解析当前问题本质**,并给出**精准解决方案**。 --- ## 🔍 核心问题定位 ### ✅ 已知信息汇总: | 项目 | 内容 | |------|------| | 📊 源域样本分布 | Normal: 4, Outer: 40, Inner: 40, Ball: 40 → **Normal 极度稀缺!** | | ⚙️ 特征重要性前五 | `'ENV_FR', 'ENV_OI_Ratio', 'ENV_BSF', 'ENV_BPFO', 'ENV_BPFI'` → 全为**包络谱故障频率相关特征** | | ✅ 伪标签数量 | 5/15(top 30%)→ 半监督有效参与 | | ❌ 预测结果中 Ball 类缺失 | 条形图无 Ball 数据 → 模型未预测任何样本为 Ball | --- ## 🧨 根本原因分析 ### ❌ 真正的问题是:**Normal 类只有 4 个样本!** 虽然 Ball 有 40 个,但: - 包络特征对 **Ball Fault 的共振频率敏感** - 而 Normal 样本太少 → 模型无法建立“健康状态”模板 - 导致所有“不像故障”的样本也被迫归类到最像的故障类 —— Inner 或 Outer - 最终出现:✅ Ball 存在但 ❌ 从未被预测! > 💥 这是一个典型的 **类别不平衡 + 关键类样本不足 → 决策偏移** 问题。 --- ## ✅ 终极修复策略(三步走) --- ### ✅ 第一步:重采样增强 Normal 类(SMOTE) ```python from imblearn.over_sampling import SMOTE print("🔄 正在使用 SMOTE 增强 Normal 类...") X_source_balanced, y_source_balanced = X_source_scaled.copy(), y_source.copy() # 只对 Normal 类进行过采样至 40 个 smote = SMOTE(sampling_strategy={0: 40}, random_state=42) # 将 Normal 补到 40 X_source_balanced, y_source_balanced = smote.fit_resample(X_source_balanced, y_source_balanced) print(f"✅ 重采样后各类数量:") for i, cls in enumerate(['Normal', 'Outer', 'Inner', 'Ball']): count = np.sum(y_source_balanced == i) print(f" {cls}: {count}") ``` 📌 这样才能让模型真正“认识”什么是正常状态。 --- ### ✅ 第二步:重新训练源域模型(使用平衡数据) ```python # 使用平衡后的数据训练初始 RF 模型 rf_model_balanced = RandomForestClassifier(n_estimators=100, random_state=42) rf_model_balanced.fit(X_source_balanced, y_source_balanced) # 保存供后续迁移使用 joblib.dump(rf_model_balanced, 'random_forest_model_balanced.pkl') print("🧠 平衡版随机森林模型已保存") ``` > ⚠️ 否则你在用一个“没见过几次正常机器”的模型去诊断目标设备! --- ### ✅ 第三步:特征选择优化(避免过度依赖故障频率) 当前特征重要性集中在: > `ENV_BPFO`, `ENV_BPFI`, `ENV_BSF`, `ENV_FR`, `ENV_OI_Ratio` 这些是**基于理论故障频率提取的带通滤波能量比值**,适合检测特定故障,但: ❌ 对早期退化不敏感 ❌ 在 Normal 状态下无稳定模式 → 易误判 #### ✅ 推荐加入更鲁棒的统计特征: | 特征类型 | 推荐补充 | |--------|---------| | 🌡️ 幅值特征 | RMS, Peak, Crest Factor | | 📈 形状特征 | Kurtosis, Impulse Factor, Margin Factor | | 🔊 非线性特征 | Approximate Entropy, Sample Entropy(可选) | 👉 如果你的 `extracted_features_with_domain.csv` 中已有这些,请确保它们没有被标准化“抹平”。 --- ### ✅ 第四步:后期校准 —— 强制激活 Ball 类 即使模型不信,我们也应根据物理逻辑给予 Ball 一定机会。 ```python # 计算每个目标样本与四类中心的距离 def get_class_template(X, y, class_label): return X[y == class_label].mean(axis=0) templates = {} for i in range(4): templates[i] = get_class_template(X_source_balanced, y_source_balanced, i) distances = np.zeros((len(X_target_scaled), 4)) for i in range(4): distances[:, i] = np.linalg.norm(X_target_scaled - templates[i], axis=1) # 距离越近,越可能是该类 → 转换为相似度 similarity = 1 / (1 + distances) # 对原始概率进行加权融合:模型 + 几何距离 final_proba_fused = rf_transfer.predict_proba(X_target_scaled) * 0.6 + \ (similarity / similarity.sum(axis=1, keepdims=True)) * 0.4 # 新预测 final_pred_fused = np.argmax(final_proba_fused, axis=1) # 输出每类预测数量 unique, counts = np.unique(final_pred_fused, return_counts=True) print("🎯 最终预测分布(融合后):") for i, cnt in zip(unique, counts): print(f" {['Normal', 'Outer', 'Inner', 'Ball'][i]}: {cnt}") ``` 这样可以显著提升 Ball 和 Normal 的召回率。 --- ## ✅ 修改可视化代码(解决警告 + 显示真实分布) 原警告: > FutureWarning: Passing `palette` without assigning `hue` is deprecated... #### ✅ 修复方式: ```python # 替换旧的 countplot 代码 plt.figure(figsize=(6, 4)) pred_labels = [ ['Normal', 'Outer', 'Inner', 'Ball'][i] for i in final_pred_fused ] sns.countplot(x=pred_labels, palette='Set2', order=['Normal', 'Outer', 'Inner', 'Ball']) plt.title('Final Predicted Distribution on Target Domain') plt.ylabel('Sample Count') plt.xlabel('Fault Type') plt.grid(True, axis='y', alpha=0.5) plt.tight_layout() plt.savefig('target_distribution_final_fixed.png', dpi=150) plt.show() ``` --- ## ✅ 总结:必须做的 5 件事 | 步骤 | 操作 | |------|------| | 1️⃣ | ✅ 使用 SMOTE 将 Normal 类从 4 扩充到 40 | | 2️⃣ | ✅ 用平衡数据重新训练源域模型 | | 3️⃣ | ✅ 加入 RMS、峰度等通用特征以增强泛化能力 | | 4️⃣ | ✅ 使用模板距离融合修正最终预测(几何+概率) | | 5️⃣ | ✅ 修正绘图代码,消除警告并正确显示类别 | --- ## 🎯 最终建议 > 🔔 **不要让模型“靠猜”它没见过的状态。** 你现在的设置相当于: > “请医生诊断癌症,但他只见过3个健康人和40个肺癌患者。” 所以他会把所有模糊病例都判为肺癌。 🔧 解决方案就是:**给模型看足够的健康案例**,并结合**物理先验知识引导决策**。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值