基于IF的网站异常流量检测

news2025/2/22 17:29:59

基于IF的网站异常流量检测

小P:最近渠道好多异常数据啊,有没有什么好的办法可以识别这些异常啊

小H:箱线图、 3 σ 3\sigma 3σ 都可以啊

小P:那我需要把每个特征都算一遍吗?不是数值的怎么算啊?

小H:你说的是高维数据啊。。。那就只能用算法去检测了,可以尝试IF(孤立森林)算法

IF全称为Isolation Forest,正如字面含义,在一片森林(数据集)中找到被孤立的点,将其识别为异常值。

数据探索

# 导入库
from sklearn.preprocessing import OrdinalEncoder
from sklearn.ensemble import IsolationForest
import pandas as pd 
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # 导入3D样式库

以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据挖掘-异常检测】自动获取~

# 读取数据
raw_data = pd.read_csv('outlier.txt',sep=',')  # 读取数据
raw_data.head()

image-20230206153503318

特征工程

# 去除全部为空的特征
data_dropna = raw_data.dropna(axis='columns',how='all')
data_dropna = data_dropna.drop(['clientId'],axis=1)
data_dropna.shape
(10492, 44)
# 填充NA列
# 找到NA列
cols_is_na = data_dropna.isnull().any()
na_cols = [cols_is_na.index[ind]
           for ind, na_result in enumerate(cols_is_na) if na_result == True]
print(data_dropna[na_cols].dtypes)
# 填充NA列
print(data_dropna[na_cols].head())
#print(type(data_dropna[na_cols].iloc[2,3]))
fill_rules = {'newVisits': 0, 'pageviews': 0, 'isVideoAd': False, 'isTrueDirect': False}
data_fillna = data_dropna.fillna(fill_rules)
print(data_fillna.isnull().any().sum())
newVisits       float64
pageviews       float64
isVideoAd        object
isTrueDirect     object
dtype: object
   newVisits  pageviews isVideoAd isTrueDirect
0        1.0       11.0       NaN          NaN
1        NaN        9.0       NaN          NaN
2        NaN       11.0       NaN         True
3        NaN       10.0       NaN          NaN
4        NaN        6.0       NaN         True
0
# 拆分数值特征和字符串特征
str_or_num = (data_fillna.dtypes=='object')
str_cols = [str_or_num.index[ind]
           for ind, na_result in enumerate(str_or_num) if na_result == True]
string_data = data_fillna[str_cols]
num_data = data_fillna[[i for i in str_or_num.index if i not in str_cols]]
# 分类特征转换为数值型索引
model_oe = OrdinalEncoder()
string_data_con = model_oe.fit_transform(string_data)
string_data_pd = pd.DataFrame(string_data_con,columns=string_data.columns)
# 合并原数值型特征和onehotencode后的特征
feature_merge = pd.concat((num_data,string_data_pd),axis=1)

数据建模

# 异常点检测
model_isof = IsolationForest(n_estimators=20, n_jobs=1)
outlier_label = model_isof.fit_predict(feature_merge)
# 异常结果汇总
outlier_pd = pd.DataFrame(outlier_label,columns=['outlier_label'])
data_merge = pd.concat((data_fillna,outlier_pd),axis=1)
outlier_count = data_merge.groupby(['outlier_label'])['visitNumber'].count()
print('outliers: {0}/{1}'.format(outlier_count.iloc[0], data_merge.shape[0]))  # 输出异常的结果数量
outliers: 1958/10492

结果展示

# 统计每个渠道的异常情况
def cal_sample(df):
    data_count = df.groupby(['source'],as_index=False)['outlier_label'].count()
    return data_count.sort_values(['outlier_label'],ascending=False)

# 取出异常样本
outlier_source = data_merge[data_merge['outlier_label']==-1]
outlier_source_sort = cal_sample(outlier_source)
# 取出正常样本
normal_source = data_merge[data_merge['outlier_label']==1]
normal_source_sort = cal_sample(normal_source)
# 合并总样本
source_merge = pd.merge(outlier_source_sort,normal_source_sort,on='source',how='outer')
source_merge = source_merge.rename(index=str, columns={'outlier_label_x':'outlier_count','outlier_label_y':'normal_count'})
source_merge=source_merge.fillna(0)
# 计算异常比例
source_merge['total_count'] = source_merge['outlier_count']+source_merge['normal_count']
source_merge['outlier_rate'] = source_merge['outlier_count']/(source_merge['total_count'])
print(source_merge.sort_values(['total_count'],ascending=False).head())
       source  outlier_count  normal_count  total_count  outlier_rate
0      google          731.0        3749.0       4480.0      0.163170
1    (direct)          441.0        2567.0       3008.0      0.146609
6    webgains           62.0         571.0        633.0      0.097946
4  shareasale           98.0         381.0        479.0      0.204593
2   linkshare          124.0         297.0        421.0      0.294537

总结

IF使用起来很方便,因此在高维数据中识别异常值可以考虑它~

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 三篇完整论文及代码

【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 建25页完整论文及代码 1 题目 2023年MCM 问题Y:理解二手帆船价格 和许多奢侈品一样,帆船的价值也会随着年代和市场条件的变化而变化。所附的“2023_MCM_Problem_Y_Boats.xlsx”文件包括2…

【dfn序+DP】树

把一棵树转化成一个序列有三种方法: dfs序 dfn序(时间戳) 欧拉序 关于这三者的区别,参考这篇博客,讲的超级好! 重谈DFS序、时间戳和欧拉序 - Seaway-Fu - 博客园 (cnblogs.com) 题意: 思路…

【SpringBoot】七:Web服务---Servlet Filter Listener

文章目录 1.Servlet1.1 使用WebServlet创建Servlet1.2 使用编码方式创建Servlet 2.Filter2.1 使用WebFilter创建Filter2.2 使用编码方式创建Filter2.3 Filter排序2.4 使用框架中的 Filter 3. Listener 1.Servlet 1.1 使用WebServlet创建Servlet (1)编写servlet WebServlet(…

数仓建模理论

一、数仓建模理论 (一)前言 数仓建模就好比是图书馆的书能够分门别类的存放,不仅合理,齐全,而且易于查找。 数据模型就是数据组织和存储方法,强调从业务、数据存取和使用角度合理存储数据。只有将数…

数据结构课程设计——航空客运订票系统

航空客运订票系统 一、引言 1.1 问题的提出 随着时代的发展,智能化生产给社会带来方便与精确,本系统以方便大众,妥善管理机场票务操作为基旨而开发。 本程序以数据结构(c语言描述)存储结构进行开发。利用单链表等存储方式为基础…

字节技术面都过了,薪资都谈好了20K*13结果还是被刷了,问HR,原因是。。

面试被拒开端 分享下自己的求职小故事。在一家公司软件测试技术面试已经过了,然后和最终面试官沟通了下,面试官提出来一个薪资数字,我接受了这个提议并和hr同步了这个数字。再然后被拒了,理由就是期望薪资和职级不匹配。我询问后…

鸿蒙元服务万能卡片开发-stage模型和fa模型的卡片区别

一、项目类型 Application: 应用开发 Atomic Service:原子化服务开发 这里选择Empty Ability模板创建项目。 二、Stage模型卡片开发 Api:9 Model:stage Language:ArkTS AppScope :应用的全局配置信息。…

Flutter非常常用的几个布局小控件Center,SizeBox,Divider

Center简介 Center是Flutter中的一个布局小部件,用于将其子部件居中显示在父部件中。 Center的特点 Center小部件具有以下特点: 将子部件在水平和垂直方向上居中显示。默认情况下,Center会尽可能将子部件展开以填充可用空间。如果Center没…

docker未授权rce+docker逃逸复现

docker未授权rcedocker逃逸复现 前言:这段时间跟着bnessy师傅一起打内网,跟着bnessy师傅也学到了很多有用的姿势,这里就来复现几个内网的漏洞(大佬轻喷) 1、老规矩,还是fscan扫到的漏洞 通过访问&#xff1…

AI突袭景观设计界,这次是真的卷起来了!

目前,AI已经成为内容创作者的灵感来源和效率工具,从设计、内容、视频等创意性工作中,我们看到AI助力下提升了数倍效率,正是如此,也迎来了更多企业的关注,想要将AI融入到各行各业中。 神采PromeAI在不断更新…

Mybatis源码

Mybatis简介 持久层ORM框架,执行sql比较简单,扩展性强,与传统jdbc相比,省去了手写连接的几个步骤,可以通过配置。 节约数据库连接资源,代码易于维护。mybatis 在SqlMapConfig.xml 中配置数据库连接池&#…

【服务器数据恢复】raid离线磁盘上线失败导致分区不识别的数据恢复

服务器数据恢复环境: HP ProLiant DL某系列服务器,三块SAS硬盘组建raid阵列。 上层系统部署有数据库,数据库存放在D分区,备份存放在E分区。 服务器故障: 磁盘故障导致RAID瘫痪,其中一块硬盘状态灯显示红色…

接口测试:Eolink Apikit 和 Postman 哪个更好用?

接口测试:Eolink Apikit 和 Postman 哪个更好用? 很多做服务端开发的同学,应该基本都用过 Postman 来测试接口,虽然 Postman 能支撑日常工作,但是总感觉还是少了点什么,比如需要 Swagger 来维护接口文档&am…

故障分析 | innodb_thread_concurrency 导致数据库异常的问题分析

作者通过分析源码定位数据库异常,梳理参数 innodb_thread_concurrency 设置的注意事项。 作者:李锡超 一个爱笑的江苏苏宁银行数据库工程师,主要负责数据库日常运维、自动化建设、DMP 平台运维。擅长 MySQL、Python、Oracle,爱好骑…

【coding加油站】vue单页面手机商城设计

1、引言 设计结课作业,课程设计无处下手,网页要求的总数量太多?没有合适的模板?数据库,java,python,vue,html作业复杂工程量过大?毕设毫无头绪等等一系列问题。你想要解决的问题&am…

【Python】判断语句 ② ( if else 语句 | if else 语句语法 | Python 中的空格缩进 | 代码示例 )

文章目录 一、if else 语句语法二、Python 中的空格缩进三、代码示例 一、if else 语句语法 if else 语句语法 : if 条件判定:满足条件要执行的代码1满足条件要执行的代码2满足条件要执行的代码3 else:不满足条件要执行的代码1不满足条件要执行的代码2不满足条件要执行的代码3…

佳能打印机删掉又会自动加载的原因及解决方案

驱动人生分析出现佳能打印机删掉又会自动加载的原因可能是因为在系统中,存在着佳能打印机的自动驱动程序。将打印机删除后,系统会自动重新安装该驱动程序,导致打印机重新加载。 特别在一台新的佳能打印机设备到位时,也会出现电脑…

2023自动化测试工具还有什么新鲜事?

我们准备了一份详细指南,介绍了在一个好的测试自动化工具中应该寻找什么,以及哪些工具在 2023 年值得考虑。 尽管手动测试仍然是软件质量保证的强大工具,正如我们在最近关于手动测试与自动测试的长期阅读中再次确立的那样,越来越…

1700页,卷S人的 软件测试《八股文》PDF手册,涨薪跳槽拿高薪就靠它了

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

【Linux】权限管理,谁动了我代码?!

目录 一,shell命令以及运行原理 二 ,Linux用户权限 1. su —— 用户切换 三,权限管理 1. 理解 2. 用户 3. 文件类型 4. 文件基本权限 5. 设置文件权限方法 1. chmod —— 修改文件访问权限 2. chown —— 修改文件拥有者 3. chg…