公司动态
异常值检测:LOF 与孤立森林实战
一、为什么需要异常检测异常检测是数据科学中一项基础且重要的任务其目标是从数据集中识别出那些显著偏离正常模式的样本。它在多个业务场景中都有广泛应用场景应用风控反欺诈识别异常交易设备故障预警识别异常传感器读数数据清洗训练前去除噪声医疗诊断识别异常体征一句话总结LOF 基于「局部密度」识别异常孤立森林基于「路径长度」识别异常后者更适合大数据和高维场景。二、环境要求在开始之前请确保你的开发环境满足以下版本要求Python 3.14scikit-learn 1.9pandas 3.0numpy 2.4jupyter 1.1notebook 7.5nbconvert 7.17三、LOF 局部离群因子核心思想异常点不一定「离全局远」而是局部邻域密度显著低于周围邻居。优势能识别「在低密度簇内部的异常点」这是传统 3σ 法做不到的。fromsklearn.neighborsimportLocalOutlierFactor lofLocalOutlierFactor(n_neighbors20,n_jobs-1)y_predlof.fit_predict(data)# 1 → 正常; -1 → 异常LOF 分值解读从negative_outlier_factor_访问LOF 分数含义≈ 1自身密度 ≈ 邻居密度正常 1处于高密度簇内部正常 1.5局部异常点需关注 1常见 2明显异常四、孤立森林 IsolationForest核心思想异常点在特征空间里更「孤立」几步随机切分就能隔开路径越短越异常。fromsklearn.ensembleimportIsolationForest outlierIsolationForest(n_estimators100,contamination0.05,# 先验异常比例 5%random_state42)outlier.fit(df)df[outlier_flag]outlier.predict(df)# 1 → 正常; -1 → 异常关键参数参数含义推荐值n_estimators树的数量100-200contamination先验异常比例0.01-0.1按业务经验max_samples每棵树的样本数默认 256random_state随机种子必设可复现获取连续分值outlier.decision_function(df)分数越低越异常。五、LOF vs 孤立森林维度LOFIsolationForest原理局部可达密度随机切分路径长度复杂度O(n²)O(n log n)高维表现易受维度灾难较好大数据❌ 慢✅ 可扩展输出标签 负分值标签 decision_function调参n_neighborsn_estimators、contamination适用低维、强局部异常大数据、高维、线上实时六、contamination 怎么设含义数据集中「你预期」的异常比例用于确定判定阈值。业务场景推荐值信用卡欺诈0.001-0.01设备故障0.01-0.05数据清洗0.05-0.10医疗异常诊断0.001-0.005⚠️ 注意contamination不是「真实异常率」而是「你对异常的容忍度」。七、可视化评估importmatplotlib.pyplotaspltimportseabornassns sns.scatterplot(xdf[item_width],ydf[item_length],huedf[outlier_flag],# 用颜色区分palette{1:blue,-1:red})plt.title(Isolation Forest Outlier Detection)plt.show()判读经验异常点出现在簇的边缘 → 模型工作正常异常点「穿插」在簇内部 →contamination设定不合理八、实战推荐流程IsolationForest 快速初筛找出明显异常LOF 二次精排重点区域识别局部异常业务回查黑名单/规则兜底验证标注高置信异常用于训练九、其他可选算法算法适用场景One-Class SVM训练集「几乎全是正常」学习正常边界DBSCAN 噪声点聚类时同步识别异常EllipticEnvelope数据服从高斯分布PyOD 库集成 20 算法工业首选PyOD 工业示例frompyod.models.iforestimportIForestfrompyod.models.lofimportLOF# 训练多模型并集成iforestIForest(contamination0.05)lofLOF(contamination0.05)iforest.fit(X)lof.fit(X)# 集成:平均分值scores(iforest.decision_scores_lof.decision_scores_)/2十、关键要点孤立森林是工业首选大数据友好无需调 Kcontamination 必设按业务经验影响阈值decision_function 优先连续分值比二值标签更灵活多算法集成更稳单一算法易误判集成可降低风险业务回查不可省异常检测只是「候选」最终判定靠业务十一、常见陷阱❌ contamination 设 0无法检测任何异常❌ contamination 设 0.5一半数据被判异常完全失效❌ 高维数据用 LOF维度灾难优先孤立森林❌ 大数据用 LOFO(n²) 太慢改用孤立森林或 PyOD❌ 异常检测结果直接用必须人工抽查 业务回查十二、关键 API 速查库/类关键方法输出LocalOutlierFactorfit_predict()标签1/-1LocalOutlierFactornegative_outlier_factor_LOF 分数IsolationForestfit()/predict()标签1/-1IsolationForestdecision_function()异常分值越低越异常网络取材来源于ant-exercises-sklearn: scikit-learn 编程练习 100 例