【数据挖掘】基于 LightGBM 的系统访问风险识别(附源码)

基于 LightGBM 的系统访问风险识别

文章目录

  • 基于 LightGBM 的系统访问风险识别
    • 一、课题来源
    • 二、任务描述
    • 三、课题背景
    • 四、数据获取分析及说明
      • (1)登录https://www.datafountain.cn并获取相关数据
      • (2)数据集文件说明
      • (3)训练集和测试集含义说明
    • 五、实验过程详细描述及程序清单
      • (1)数据处理
      • (2)特征抽取
      • (3)模型训练
      • (4)预测
    • 六、个人总结
    • 七、源码

一、课题来源

分类预测/回归预测相关内容,从阿里天池或datafountain下载作业数据datafountain:系统访问风险识别

二、任务描述

系统访问风险识别
(1)本赛题中,参赛团队将基于用户历史的系统访问日志及是否存在风险标记等数据,结合行业知识,构建必要的特征工程,建立机器学习、人工智能或数据挖掘模型,并用该模型预测将来的系统访问是否存在风险。
(2)本赛题数据是从竹云日志库中抽取某公司一定比例的员工从2022年1月到6月的系统访问日志数据,主要涉及认证日志与风险日志数据。部分字段经过一一对应脱敏处理,供参赛队伍使用。其中认证日志是用户在访问应用系统时产生的行为数据,包括用户名、认证时间、认证城市、接入系统、访问URL等关键信息。

三、课题背景

随着国家、企业对安全和效率越来越重视,作为安全基础设施之一——统一身份管理(IAM,Identity and Access Management)系统也得到越来越多的关注。 在IAM领域中,其主要安全防护手段是身份鉴别,身份鉴别主要包括账密验证、扫码验证、短信验证、人脸识别及指纹验证等方式。这些身份鉴别方式一般可分为三类,即用户所知(如口令)、所有(如身份证)、特征(如人脸识别及指纹验证)。这些鉴别方式都有其各自的缺点——比如口令,强度高了不容易记住,强度低了又容易丢;又比如人脸识别,做活体验证用户体验不好,静默检测又容易被照片、视频、人脸模型绕过。也因此,在等保2.0中对于三级以上系统要求必须使用两种及以上的鉴别方式对用户进行身份鉴别,以提高身份鉴别的可信度,这种鉴别方式也被称为双因素认证。
对用户来说,双因素认证在一定程度上提高了安全性,但也极大地降低了用户体验。也因此,IAM厂商开始参考用户实体行为分析(UEBA,User and Entity Behavior Analytics)、用户画像等行为分析技术,来探索一种既能确保用户体验,又能提高身份鉴别可信度的方法。而在当前IAM的探索过程中,目前最容易落地的方法是基于规则的行为分析技术,因为它可理解性较高,且容易与其它身份鉴别方式进行联动。
但基于规则的行为分析技术局限性也很明显,首先这种技术是基于经验的,有“宁错杀一千,不放过一个”的特点,其次它也缺少从数据层面来证明是否有人正在尝试窃取或验证非法获取的身份信息,又或者正在使用窃取的身份信息。鉴于此,我们举办这次竞赛,希望各个参赛团队利用竞赛数据和行业知识,建立机器学习、人工智能或数据挖掘模型,来弥补传统方法的缺点,从而解决这一行业难题。

四、数据获取分析及说明

本赛题数据是从竹云日志库中抽取某公司一定比例的员工从2022年1月到6月的系统访问日志数据,主要涉及认证日志与风险日志数据。部分字段经过一一对应脱敏处理,供参赛队伍使用。其中认证日志是用户在访问应用系统时产生的行为数据,包括用户名、认证时间、认证城市、接入系统、访问URL等关键信息。

(1)登录https://www.datafountain.cn并获取相关数据

在这里插入图片描述

在这里插入图片描述

找不到数据集的可以私信我。

(2)数据集文件说明

在这里插入图片描述

在这里插入图片描述

(3)训练集和测试集含义说明

在这里插入图片描述

五、实验过程详细描述及程序清单

(1)数据处理

在这里插入图片描述

读取数据

在这里插入图片描述

在这里插入图片描述

统计每类数据的平均风险概率

在这里插入图片描述

查询包含Nan值的行
在这里插入图片描述

查看数据描述
在这里插入图片描述

进行一定的数据处理以及数据初始化,调用Sklearn库中的特征预处理API sklearn.preprocessing 进行特征预处理使用labelEncoder函数将离散型的数据转换成 0 到 n − 1 之间的数,这里 n 是一个列表的不同取值的个数,可以认为是某个特征的所有不同取值的个数。
在这里插入图片描述

填充空值并使用Corr函数,使用相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。默认空参情况下传入值为Pearson
在这里插入图片描述

继续处理数据并将后续数据归一化,通过对原始数据进行变换把数据映射到(0,1)之间
在这里插入图片描述

(2)特征抽取

1.时间特征提取

在这里插入图片描述

2.离散数据处理
在这里插入图片描述

在这里插入图片描述

3.数据集分割
在这里插入图片描述

(3)模型训练

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)预测

在这里插入图片描述

保存至相应csv文件
在这里插入图片描述

1表示有风险,0表示没有风险
在这里插入图片描述

六、个人总结

这次大作业让我对数据挖掘和分析这门课程有了更深一步的了解,学习利用机器学习算法中的LightGBM算法对离散数据进行分析,同时也对Python代码有了更深层次的认识,认识了机器学习算法的优势,通过这次大作业的学习学会了建模分析方法,同时也学会了如何用Python代码实现对数据的删除和清洗,对模型本身的算法、适用范围、参数、优劣性有充分的了解。同时掌握了离散型数据的特征处理和时间处理,表格数据也可以轻易解决了。

七、源码

import pandas as  pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
%matplotlib inlineplt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体  
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示问题`
train = pd.read_csv('D:/基于机器学习的系统访问风险识别dataset/train.csv', encoding='utf-8')
print("在训练集中,共有{}条数据,其中每条数据有{}个特征".format(train.shape[0], train.shape[1]))
test  = pd.read_csv('D:/基于机器学习的系统访问风险识别dataset/evaluation_public.csv', encoding='utf-8')
print("在测试集中,共有{}条数据,其中每条数据有{}个特征".format(test.shape[0], test.shape[1]))
df = pd.concat([train, test])df.info()#统计每类数据对应的平均风险概率
for f in ['user_name', 'department', 'ip_transform', 'device_num_transform', 'browser_version', 'browser', 'os_type', 'os_version', 'ip_type','op_city', 'log_system_transform', 'url']:for v in df[f].unique():print(f, v, df[df[f] == v]['is_risk'].mean())
print('*'*50)train.head()
# 查询包含Nan值的行
df[df.isnull().T.any()]
df.describe()
df['op_datetime'] = pd.to_datetime(df['op_datetime'])
df['hour'] = df['op_datetime'].dt.hour
df['weekday'] = df['op_datetime'].dt.weekday
df['year'] = df['op_datetime'].dt.year
df['month'] = df['op_datetime'].dt.month
df['day'] = df['op_datetime'].dt.day#去掉不用的特征
df.drop(columns = 'op_datetime', inplace=True)
df.drop(columns = 'op_month', inplace=True)#数据编码
from sklearn.preprocessing import LabelEncoderfor feat in ['user_name', 'department', 'ip_transform', 'device_num_transform', 'browser_version','log_system_transform', 'op_city','browser', 'os_type', 'os_version', 'ip_type','url']:lab = LabelEncoder()df[feat] = lab.fit_transform(df[feat])#填充空值
for feat in [item for item in df.columns if item != 'is_risk']:
df[feat].fillna(df[feat].median(), inplace=True)df.corr()['is_risk']features = [item for item in df.columns if item != 'is_risk']
traindata = df[~df['is_risk'].isnull()].reset_index(drop=True)
testdata = df[df['is_risk'].isnull()].reset_index(drop=Truedata_X = traindata[features].values[:40000]
data_Y = traindata['is_risk'].values[:40000].astype(int).reshape(-1, 1)
data_X_test = traindata[features].values[40000:]
data_Y_test = traindata['is_risk'].values[40000:].astype(int).reshape(-1, 1)
testdata = testdata[features].values# 归一化
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
data_X = mm.fit_transform(data_X)
data_X_test = mm.fit_transform(data_X_test)
testdata = mm.fit_transform(testdata)
print(data_X.shape)
print(data_X_test.shape)
print(testdata.shape)test.head()
print(train.shape)
print(test.shape)data=pd.concat([train, test])
data=data.fillna('NAN')# 时间特征
def add_datetime_feats(df):df['time'] = pd.to_datetime(df['op_datetime'])# df['year'] = df['time'].dt.yeardf['month'] = df['time'].dt.monthdf['day'] = df['time'].dt.daydf['hour'] = df['time'].dt.hourdf['dayofweek'] = df['time'].dt.dayofweek    
return dfdata=add_datetime_feats(data)#去掉不用的特征
data.drop(columns = 'op_datetime', inplace=True)
data.drop(columns = 'op_month', inplace=True)
data.drop(columns = 'time', inplace=True)print(data.columns.tolist())features=['user_name', 'department', 'ip_transform', 'device_num_transform', 'browser_version', 'browser', 'os_type', 'os_version', 'ip_type', 'op_city', 'log_system_transform', 'url']#数据编码
from sklearn.preprocessing import LabelEncoder
from tqdm import tqdmfor col in tqdm(features):lbl=LabelEncoder()lbl.fit(data[col])
data[col]=lbl.transform(data[col])data.head()
data.corr()
train, test = data[:len(train)], data[len(train):]from sklearn.model_selection import StratifiedKFold
from lightgbm import early_stopping
from lightgbm import log_evaluation # 要升级后,重启notebook
import numpy as np
import lightgbm as lgb# label转为int类型
train['is_risk']=train['is_risk'].apply(lambda i:int(i))  features.extend(['http_status_code','month','day','hour','dayofweek'])
print(features)def lgb_model(train, target, test, k):print('Current num of features:', len(features))oof_probs = np.zeros((train.shape[0],2))output_preds = 0offline_score = []feature_importance_df = pd.DataFrame()parameters = {'learning_rate': 0.03,'boosting_type': 'gbdt','objective': 'multiclass','metric': 'multi_error','num_class': 2,'num_leaves': 31,'feature_fraction': 0.6,'bagging_fraction': 0.8,'min_data_in_leaf': 15,'verbose': -1,'nthread': 4,'max_depth': 7}seeds = [2020]for seed in seeds:folds = StratifiedKFold(n_splits=k, shuffle=True, random_state=seed)for i, (train_index, test_index) in enumerate(folds.split(train, target)):train_y, test_y = target.iloc[train_index], target.iloc[test_index]train_X, test_X = train[features].iloc[train_index, :], train[features].iloc[test_index, :]dtrain = lgb.Dataset(train_X,label=train_y)dval = lgb.Dataset(test_X,label=test_y)lgb_model = lgb.train(parameters,dtrain,num_boost_round=20000,valid_sets=[dval],callbacks=[early_stopping(1000), log_evaluation(1000)],)oof_probs[test_index] = lgb_model.predict(test_X[features], num_iteration=lgb_model.best_iteration) / len(seeds)offline_score.append(lgb_model.best_score['valid_0']['multi_error'])output_preds += lgb_model.predict(test[features],num_iteration=lgb_model.best_iteration) / folds.n_splits / len(seeds)print(offline_score)# feature importancefold_importance_df = pd.DataFrame()fold_importance_df["feature"] = featuresfold_importance_df["importance"] = lgb_model.feature_importance(importance_type='gain')fold_importance_df["fold"] = i + 1feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)print('OOF-MEAN-AUC:%.6f, OOF-STD-AUC:%.6f' % (np.mean(offline_score), np.std(offline_score)))print('feature importance:')print(feature_importance_df.groupby(['feature'])['importance'].mean().sort_values(ascending=False).head(50))return output_preds, oof_probs, np.mean(offline_score), feature_importance_dfprint('开始模型训练train')
lgb_preds, lgb_oof, lgb_score, feature_importance_df = lgb_model(train=train[features],target=train['is_risk'],test=test[features], k=10)from sklearn.metrics import accuracy_score
accuracy_score(train['is_risk'],np.argmax(lgb_oof,axis=1))# 读取提交格式
sub = pd.read_csv('D:/基于机器学习的系统访问风险识别dataset/submit_sample.csv')
Sub# 修改列名ret为is_risk
sub['is_risk']=sub['ret']
sub.drop(columns = 'ret', inplace=True)sub['is_risk']=np.argmax(lgb_preds,axis=1)
sub['is_risk'].value_counts()
# 保存
sub.to_csv('D:\sub.csv',index=None)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】数组实现队列(详细版)

目录 队列的定义 普通顺序队列的劣势——与链队列相比 顺序队列实现方法: 一、动态增长队列 1、初始化队列 2、元素入队 3、判断队列是否为空 4、元素出队 5、获取队首元素 6、获取队尾元素 7、获取队列元素个数 8、销毁队列 总结: 动态增长队列…

气泵方案|车载充气泵的芯片和传感器

无线车载充气泵方案由一块PCBA板集成其所需的功能,其充气原理是发动机通过两根三角带驱动气泵曲轴,进而驱动活塞进行打气,打出的气体通过导气管导入储气筒。另一方面储气筒又通过一根导气管将储气筒内的气体导入固定在气泵上的调压阀内&#…

放大镜Scratch-第14届蓝桥杯Scratch省赛真题第3题

3. 放大镜(50分) 评判标准: 10分:满足"具体要求"中的1); 15分:满足"具体要求"中的2); 25分,满足"具体要求"中的3&#xff…

数据库攻防学习

免责声明 本文仅供学习和研究使用,请勿使用文中的技术用于非法用途,任何人造成的任何负面影响,与本号及作者无关。 Redis 0x01 redis学习 在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识,那么什么是redis?redis就是个数据库&#xff…

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…

k8s的网络

k8s的网络 k8s中的通信模式: 1、pod内部之间容器与容器之间的通信 在同一个pod中的容器共享资源和网络,使用同一个网络命名空间,可以直接通信的 2、同一个node节点之内,不同pod之间的通信 每个pod都有一个全局的真实的ip地址…

商智C店H5性能优化实战

前言 商智C店,是依托移动低码能力搭建的一个应用,产品面向B端商家。随着应用体量持续增大,考虑产品定位及用户体验,我们针对性能较差页面做了一次优化,并取得了不错的效果,用户体验值(UEI&…

122基于matlab的CSO-SVM,BA-SVM模式识别模型

基于matlab的CSO-SVM,BA-SVM模式识别模型。优化SVM的两个参数晚上最佳参数确定。输出分类识别结果和准确率。数据可更换自己的,程序已调通,可直接运行。 122鸡群优化算法蝙蝠优化算法 (xiaohongshu.com)

界面控件DevExpress Blazor Grid v23.2 - 支持全新的单元格编辑模式

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 在这篇文章中,我们将介…

大数据HCIE成神之路之特征工程——特征选择

特征选择 1.1 特征选择 - Filter方法1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析1.1.1.4 实验思路 1.1.2 实验操作步骤 1.2 特征选择 - Wrapper方法1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实验数据解析1.2.1.4 实验思路 1.2.2 实验操…

以 Serverfull 方式运行无服务器服务

当前 IT 架构中最流行的用例是从 Serverfull 转向 Serverless 设计。在某些情况下,我们可能需要以 Serverfull 方式设计服务或迁移到 Serverfull 作为运营成本的一部分。 在本文中,我们将展示如何将 Kumologica flow 作为 Docker 容器运行。通常&#x…

Element|InfiniteScroll 无限滚动组件的具体使用方法

目录 InfiniteScroll 无限滚动 基本用法 详细说明 v-infinite-scroll 指令 infinite-scroll-disabled 属性 infinite-scroll-distance 属性 总结 需求背景 : 项目统计管理列表页面,数据量过多时在 IE 浏览器上面会加载异常缓慢,导致刚…