异常检测(Outlier Detection)简述:检测出发生不符合预期以及不符合正常逻辑的数据。
简介:有明确的特征值和目标结果值
举例:线性回归算法(房价预测,销售额预测,贷款额度预测),K近邻算法,决策树,朴素贝叶斯算法
概念:即通过已知历史学习到的经验与规律,我们只需要给定输入样本集,就可以从中推演出指定目标变量的可能结果
简介:即有特征值,无目标值
举例:常见聚类算法,PCA(主成分分析)
概念:即我们需要直接从样本中总结对应的规律,强调的是自我总觉归纳,目标值并不存在,从样本数据中直接发现有价值的东西
简介:有少部分有特征值与目标值的数据集,以及多数只有目标值和特征值的数据
举例: self-training(自训练算法),SVMs半监督支持向量机等等
概念:主要用于有目标值样本少,难以获取,无目标值数据相对容易获取,例如:在生物学中,对某种蛋白质的结构分析或者功能鉴定,可能会花上生物学家很多年的工作,而大量的无目标值的数据却很容易得到
下面是异常检测的一些应用场景:
异常检测的方法有很多,基于统计的方法,基于机器学习的方法,基于时间序列的方法等。所有这些方法都是基于一个异常点的稀有性或者与正常数据点的不一致性。异常点或者目标一般都比较稀有,即出现频率低。比如我们说一件事是“万里挑一”,说的就是稀有性。
通常可以使用两种指标:Z分数 和 四分位距(IQR)。
Z分数:
计算一个样本的 z 分数,就是减去均值再除以标准差,如果绝对值大于三倍标准差,就认为这个样本异常,属于离群点。
对于正态分布的数据,用 Z 分数为指标,有千分之三的离群点。
四分位距(IQR):
用 IQR 为指标,判定的方式为:在四分位点上加上1.5倍IQR,这个范围之外的都是离群点,正态分布有千分之七的离群点。
两者简单介绍图:
简介图:
拉伊达(3 σ )准则剔除异常值
例如:
有一堆训练资料{x1,x2,x3,…xN},要实现,输入一个x_test,此x_test与训练数值是相像的还是相向的
例如:
可使用统计学方法,以及一些常用算法进行异常检测,让机器学习进行有监督以及无监督学习。
异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程。有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。以在轨航天器为例,由于航天器昂贵且系统复杂,未能检测到危险可能会导致严重甚至无法弥补的损害。异常随时可能发展为严重故障,因此准确及时的异常检测可以提醒航天工程师今早采取措施。
一般而言很多异常可以通过人工的方式的来判断。然而当业务组合复杂,时序规模变大后,依靠传统的人工和简单的同比环比等绝对值算法来判断就捉襟见肘了。面对各种各样的工业级场景,系统的了解时间序列的异常检测方法显得尤为重要。
简介:给定一组时间序列X = xi ,异常时间序列 xi ∈ X 是在 X 上与大多数时间序列值不一致的部分。
概述:Scikit-learn(以前称为scikits.learn,也称为sklearn)是针对Python 编程语言的免费软件机器学习库 [1] 。它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度提升,k均值和DBSCAN,并且旨在与Python数值科学图书馆NumPy和SciPy。
优势简介:
自2007年发布以来,scikit-learn已经成为最给力的Python机器学习库(library)了。scikit-learn支持的机器学习算法包括分类,回归,降维和聚类。还有一些特征提取(extracting features)、数据处理(processing data)和模型评估(evaluating models)的模块。作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。
scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。
概述:PyOD提供了约20种异常检测算法,同时该工具库也包含了一系列辅助功能,包括数据可视化及结果评估等。
优势简介:
包括近20种常见的异常检测算法,比如经典的LOF/LOCI/ABOD以及最新的深度学习如对抗生成模型(GAN)和集成异常检测(outlier ensemble)
支持不同版本的Python:包括2.7和3.5+;支持多种操作系统:windows,macOS和Linux
简单易用且一致的API,只需要几行代码就可以完成异常检测,方便评估大量算法
使用JIT和并行化(parallelization)进行优化,加速算法运行及扩展性(scalability),可以处理大量数据
安装命令:pip install scikit-learn -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
简单例子:
字典特征抽取:
from sklearn.feature_extraction import DictVectorizer
def dictvec():
"""
字典数据抽取
:return: None
"""
# 实例化
dict = DictVectorizer(sparse=False)
# 调用fit_transform
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(dict.get_feature_names())
print(dict.inverse_transform(data))
print(data)
return None
if __name__ == "__main__":
dictvec()
安装命令:pip install pyod -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
注意:目前 PyOD 不支持 Python3.9,目前测试 Python3.8 支持安装。
官方文档实例:
# -*- coding: utf-8 -*-
"""Example of using kNN for outlier detection
"""
# Author: Yue Zhao
# License: BSD 2 clause
#from __future__ import division
#from __future__ import print_function
#import os
#import sys
# temporary solution for relative imports in case pyod is not installed
# if pyod is installed, no need to use the following line
#sys.path.append(
# os.path.abspath(os.path.join(os.path.dirname("__file__"), '..')))
from pyod.models.knn import KNN #KNN algorithm
from pyod.utils.data import generate_data #test generation
from pyod.utils.data import evaluate_print #evaluate the result
from pyod.utils.example import visualize # draw the result
if __name__ == "__main__":
contamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points
# Generate sample data
X_train, y_train, X_test, y_test = \
generate_data(n_train=n_train,
n_test=n_test,
n_features=2,
contamination=contamination,
random_state=42)
# train kNN detector
clf_name = 'KNN'
clf = KNN()
clf.fit(X_train)
# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_ # raw outlier scores
# get the prediction on the test data
y_test_pred = clf.predict(X_test) # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test) # outlier scores
# evaluate and print the results
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
# visualize the results
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure=True, save_figure=True)
Thank for all those who had helped me in the past。I will pray for them and wish their happiness。
Life Motto:Stay hungry, stay foolish。Cheer for freedom。