Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

11.3 密度异常检测算法

Scikit-learn密度异常检测算法教程:IsolationForest与LOF的原理及实战应用

Scikit-learn 中文教程

本章详细讲解Scikit-learn中的密度异常检测算法,包括孤立森林(IsolationForest)和局部异常因子(LOF),涵盖其原理、使用方法和在欺诈检测、数据清洗等领域的实战应用,适合机器学习初学者快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

第X章:密度异常检测算法在Scikit-learn中的实践

欢迎来到Scikit-learn学习教程!在本章中,我们将深入探讨密度异常检测算法,特别是孤立森林(IsolationForest)和局部异常因子(LOF),它们是如何帮助我们发现数据中的异常值的。此外,我们还将展示这些算法在实际问题如欺诈检测和数据清洗中的应用。

1. 什么是异常检测和密度异常检测?

异常检测(Anomaly Detection)是机器学习中的一个重要任务,旨在识别数据集中与大多数数据点显著不同的观测值(即异常值或离群点)。这些异常值可能表示错误、欺诈或其他重要事件。

密度异常检测算法基于一个简单假设:异常值通常位于数据分布的稀疏区域,即它们的密度较低。通过比较数据点的局部密度,这些算法可以有效地检测出异常。在Scikit-learn中,我们主要使用孤立森林和局部异常因子来实现密度异常检测。

2. 孤立森林(IsolationForest)

孤立森林是一种高效的异常检测算法,尤其适用于高维数据。它的核心思想是“孤立”异常值:由于异常值数量少且与正常数据差异大,它们更容易在随机决策树中被快速隔离。

原理解释

  • 算法通过构建多个随机决策树(称为“孤立树”)来分割数据空间。
  • 在每棵树上,随机选择一个特征和分割点,直到数据点被隔离(即单个点落在叶子节点)。
  • 异常值通常需要更少的路径长度(即更快被隔离),因此计算平均路径长度,路径越短的越可能是异常。
  • Scikit-learn中的IsolationForest类实现了这个算法,参数如n_estimators(树的数量)和contamination(异常值比例)可以调整。

Scikit-learn示例代码

from sklearn.ensemble import IsolationForest
import numpy as np

# 生成示例数据
X = np.random.randn(100, 2)  # 100个正常点
X_outliers = np.random.randn(10, 2) * 2 + 5  # 10个异常点
X = np.vstack([X, X_outliers])

# 创建并训练孤立森林模型
clf = IsolationForest(n_estimators=100, contamination=0.1, random_state=42)
clf.fit(X)

# 预测异常值(-1表示异常,1表示正常)
y_pred = clf.predict(X)
print("预测结果(前10个):", y_pred[:10])

优点和缺点

  • 优点:高效、可扩展,适合高维数据,不需要假设数据分布。
  • 缺点:对于簇状异常或低维数据可能效果不佳;参数如contamination需要预估。

3. 局部异常因子(Local Outlier Factor, LOF)

LOF是一种基于密度的异常检测算法,它比较每个点的局部密度与其邻居的密度来识别异常。异常点的局部密度通常远低于其邻居。

原理解释

  • 对于每个数据点,计算其k个最近邻居(k-nearest neighbors)。
  • 计算局部可达密度(Local Reachability Density, LRD),表示该点与其邻居的平均可达距离。
  • LOF分数是点的LRD除以其邻居LRD的平均值。如果LOF分数远大于1,则该点可能是异常。
  • 在Scikit-learn中,LocalOutlierFactor类提供了实现,参数如n_neighbors(邻居数)和contamination可调整。

Scikit-learn示例代码

from sklearn.neighbors import LocalOutlierFactor

# 使用相同数据
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
y_pred_lof = lof.fit_predict(X)  # -1表示异常,1表示正常
print("LOF预测结果(前10个):", y_pred_lof[:10])

优点和缺点

  • 优点:能检测局部异常,对数据分布假设较少,适用于复杂形状的数据。
  • 缺点:计算成本较高,特别是大数据集;需要选择合适的邻居数k。

4. 实战应用:欺诈检测和数据清洗

欺诈检测

在金融领域,异常检测常用于识别欺诈交易。例如,信用卡交易数据中,欺诈行为往往表现为不寻常的金额、时间或地点模式。

  • 使用IsolationForest:由于交易数据通常是高维的(如金额、商户、时间戳),孤立森林可以快速筛选出异常交易。
  • 使用LOF:如果欺诈模式是局部性的(如特定用户群体的异常),LOF可能更有效。
  • 实践建议:结合业务知识调整参数,并使用交叉验证评估模型性能。

数据清洗

在数据预处理中,异常检测帮助识别和移除错误或离群点,以提高后续分析的准确性。

  • 示例:在销售数据中,错误的录入(如负销售额)或极端值(如异常高的订单)可以使用这些算法检测。
  • 步骤:先应用算法识别异常,然后根据领域知识决定是删除、修正或保留这些点。

5. 比较和建议

  • 何时使用IsolationForest:当数据维度高、需要快速检测,且异常值孤立时(例如,网络入侵检测)。
  • 何时使用LOF:当异常是局部性的,数据分布复杂(例如,图像或文本数据中的异常)。
  • 结合使用:在某些场景下,可以先使用孤立森林进行初步筛选,再用LOF细化检测。

6. 总结和下一步学习

在本章中,我们学习了Scikit-learn中的密度异常检测算法:孤立森林和局部异常因子。它们都是强大的工具,适用于不同的异常检测场景。通过实战应用如欺诈检测和数据清洗,你可以更好地理解其价值。

练习建议:尝试在Kaggle等平台找到相关数据集(如信用卡欺诈数据集),使用Scikit-learn实现异常检测,并评估模型效果。下一章,我们将探讨其他异常检测方法或深入Scikit-learn的高级功能。

记住,异常检测不仅仅是技术问题,还需要结合业务理解和数据探索。祝你学习愉快!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包