localoutlierfactor是scikit-learn中lof算法的唯一正确类名,必须从sklearn.neighbors导入,不支持lof或lof缩写;它无fit_predict方法,需调用fit()后通过labels_(布尔数组)或negative_outlier_factor_(连续得分)获取结果,且n_neighbors需合理设置以避免过敏感或过度平滑。

LOF算法在scikit-learn里叫LocalOutlierFactor,不是lof或LOF
很多人搜“LOF”直接写from sklearn import lof或LOF(),会报ModuleNotFoundError或NameError。它藏在sklearn.neighbors模块下,且类名是LocalOutlierFactor——大小写、全称、无缩写,必须写对。
正确导入方式:
from sklearn.neighbors import LocalOutlierFactor
-
LocalOutlierFactor默认不做训练/预测分离,fit时直接输出异常分值和标签,不提供predict()方法(区别于IsolationForest) - 它没有
fit_predict()的返回值顺序陷阱:返回的是布尔数组inlier = True表示正常点,False才是离群点——这点容易和直觉反着记 - 若用
contamination参数设为0.1,模型会自动把得分最低的10%样本标为False;但实际数据中离群程度可能不均匀,这个阈值未必可靠
LocalOutlierFactor必须用fit,不能跳过直接fit_predict
常见错误是照搬DBSCAN或KMeans习惯,写lof.fit_predict(X),结果报AttributeError: 'LocalOutlierFactor' object has no attribute 'fit_predict'。
它只支持fit(),然后通过属性读取结果:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.05) y_pred = lof.fit(X).labels_ # 注意:是 .labels_,不是 .predict() 或 .fit_predict()
-
.labels_是布尔数组:True= 正常点,False= 离群点 -
.negative_outlier_factor_是原始LOF得分(越小越异常),比.labels_更精细,适合画分布图或自定义阈值 - 如果X含缺失值(
np.nan),会直接报ValueError: Input contains NaN,必须提前用SimpleImputer或删行处理
n_neighbors设太小或太大都会让LOF失效
n_neighbors控制局部邻域大小,不是随便设个20就完事。它直接影响密度估计的粒度:
- 设太小(如
n_neighbors=5):邻域过窄,噪声被误判为离群,尤其在稀疏区域 - 设太大(如
n_neighbors=100):邻域覆盖过广,局部结构被平滑掉,真实离群点变得“正常” - 经验法则是:取数据集规模的1%–2%,且不低于20;若样本少于200,建议从
min(20, len(X)//2)起步试 - 注意:该参数只影响
fit阶段,不参与后续推理——LOF本身是无监督,没有独立的predict阶段
用negative_outlier_factor_比labels_更能看出异常梯度
contamination强制截断得分,会掩盖异常程度差异。比如两个样本得分分别是-2.1和-4.8,都被标为False,但后者明显更异常。
推荐做法:
lof = LocalOutlierFactor(n_neighbors=20) lof.fit(X) scores = lof.negative_outlier_factor_ # 负得分,越小越异常 # 手动选阈值,例如取下5%分位数 threshold = np.percentile(scores, 5) is_outlier = scores
-
negative_outlier_factor_是浮点数组,长度等于X.shape[0],可直接用于排序、绘图、加权 - Scikit-learn 1.2+版本中,该数组已按升序排列(最小即最异常),但别依赖这个顺序,显式用
np.argsort(scores)更稳 - 多维数据上LOF对量纲敏感:务必先用
StandardScaler或MinMaxScaler归一化,否则某列单位大(如收入万元 vs 年龄岁)会主导距离计算
真正麻烦的是高维稀疏数据——LOF在>10维时距离失效问题会凸显,这时得考虑降维或换用IsolationForest。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










