Python中使用Scikit Learn做离群点检测时如何指定样本为非离群点
Scikit-learn离群点检测固定指定样本为非离群点的实现方案
可以实现该需求,常用两种方案如下:
方案1:使用半监督新颖点检测模式(推荐)
Scikit-learn中大部分离群点检测算法都支持novelty参数,开启后进入新颖点检测模式:你可以仅用预先确认的非离群点完成模型训练,模型会以这批样本的分布作为正常基准,后续预测时这批已知样本不会被判定为离群点。
支持该模式的算法包括:IsolationForest、OneClassSVM、LocalOutlierFactor、EllipticEnvelope等。
示例代码:
from sklearn.ensemble import IsolationForest # 替换为你预先确认的非离群点特征矩阵 X_known_normal = your_known_normal_samples # 替换为所有待检测样本(包含上述已知非离群点) X_all = your_all_samples # 开启新颖点检测模式 clf = IsolationForest(novelty=True, random_state=42) # 仅用已知正常样本训练 clf.fit(X_known_normal) # 预测结果中1为正常,-1为离群点,已知非离群点都会被标记为1 y_pred = clf.predict(X_all)
方案2:无监督检测后手动修正标签
如果你需要保留无监督算法对全量数据的分布学习结果,不需要调整训练逻辑,也可以在得到预测结果后,手动将指定样本的标签修改为正常即可。
示例代码:
from sklearn.ensemble import IsolationForest # 所有待检测样本 X_all = your_all_samples # 替换为已知非离群点在X_all中的索引列表 known_normal_idx = [0, 3, 5, 9] clf = IsolationForest(random_state=42) y_pred = clf.fit_predict(X_all) # 强制将已知非离群点的预测结果修正为正常 y_pred[known_normal_idx] = 1
注意事项
- 若使用LocalOutlierFactor的默认无监督模式(
novelty=False),只能通过方案2修正结果,该模式下不支持基于已知正常样本训练后预测。 - 方案1的检测结果会更贴合你对正常样本的定义,优先级高于方案2。
内容的提问来源于stack exchange,提问作者Lucas Oliveira
相关产品推荐
相关产品推荐

