2021-01-11

向日葵🌻—task01

1. 什么是异常检测

异常检测(Outlier Detection),是识别与正常数据不同的数据,与预期行为差异大的数据。识别如信用卡欺诈,工业生产异常,网络流里的异常(网络入侵)等问题,针对的少数的事件。

1.1 异常的类别

点异常:少数个体实例是异常的,大多数个体实例是正常的。
上下文异常:在特定情景下个体实例是异常的,在其他情景下是正常的。
群体异常:指的是在群体集合中的个体实例出现异常的情况,而该个体实例可能本身不是异常。

1.2 异常检测任务分类

有监督:训练集中的正例和反例均有标签
无监督:训练集无标签
半监督:在训练集中只有单一类别(正常实例)的实例,没有异常实例参与训练。

1.3 异常检测场景

  1. 故障检测
  2. 物联网异常检测
  3. 欺诈检测
  4. 工业异常检测
  5. 时间序列检测
  6. 视频异常检测
  7. 日志日常检测
  8. 医疗异常检测
  9. 网络入侵检测

2.异常检测常用方法

2.1 传统方法

2.1.1 基于统计学的方法

  1. 统计学方法对数据的正常性做出假定。
  2. 假设正常的数据对象由一个统计模型产生。不遵守该模型的数据是异常点。
  3. 统计学方法的有效性高度依赖于给定数据所做的统计模型是否成立。
  4. 思想:学习一个拟合给定数据集的生成模型,然后识别该模型低概率区中的对象,把它们作为异常点。

2.1.2 线性模型

PCA

2.1.3 基于相似度的方法

  1. 情况:数据点的聚集成度高,离群点较少的情况。
  2. 缺点:计算量大
  3. 类别
    1. 基于集群(簇)的检测
    2. 基于距离的度量
    3. 基于密度的度量

2.2 集成方法

  1. feature bagging:和bagging类似,对象是feature
  2. 孤立森林
    1. 算法过程:随机超平面切割数据空间,切一次可以生成两个字空间,重复该过程,直到每个字空间只有一个数据点为止。
    2. 算法思想:高密度簇需要被切割许多次,低密度的簇需要切割的很快。孤立森林认为这些很快被孤立的点就是异常点。

2.3 机器学习

  1. 有标签:使用树模型,例如gbdt,xgboost进行分类。
  2. 缺点:异常检测场景下数据标签是不均衡的
  3. 优点:可以构造不同的特征

3. 异常检测常用开源库

  1. Scikit-learn
  2. PyOD

4. 代码练习

代码参考


from pyod.models.knn import KNN
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize

contamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points

# 生成虚拟数据
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)

# 训练KNN模型
clf_name = ‘KNN’
clf = KNN()
clf**.**fit(X_train) # 注意训练模型的时候,不需要输入y参数

# 得到训练标签和训练分数
y_train_pred = clf**.labels_ # 0正常,1异常
y_train_scores = clf
.**decision_scores_ # 数值越大越异常

# 用训练好的模型预测测试数据的标签和分数
y_test_pred = clf**.predict(X_test)
y_test_scores = clf
.**decision_function(X_test)

# 评估并打印结果
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(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure**=True, save_figure=**True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印的示例代码: ```java import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtils { // 获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印 public static void showCurrentDateTime() { DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date date = new Date(); String dateTime = dateFormat.format(date); System.out.println(dateTime); } // 计算并显示若干天后的日期值 public static void showDateAfterDays(String currentDate, int days) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = dateFormat.parse(currentDate); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_YEAR, days); Date newDate = calendar.getTime(); String newDateString = dateFormat.format(newDate); System.out.println(newDateString); } catch (ParseException e) { e.printStackTrace(); } } // 计算并显示两个日期之间相距的天数 public static void showDaysBetweenDates(String date1, String date2) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date startDate = dateFormat.parse(date1); Date endDate = dateFormat.parse(date2); long diff = endDate.getTime() - startDate.getTime(); long diffDays = diff / (24 * 60 * 60 * 1000); System.out.println(diffDays); } catch (ParseException e) { e.printStackTrace(); } } } ``` 使用示例: ```java public static void main(String[] args) { // 获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印 DateUtils.showCurrentDateTime(); // 计算并显示若干天后的日期值 DateUtils.showDateAfterDays("2021-01-01", 10); // 计算并显示两个日期之间相距的天数 DateUtils.showDaysBetweenDates("2021-01-01", "2021-01-11"); } ``` 输出结果: ``` 2021年05月01日 15:23:45 2021-01-11 10 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值