项目经验分享|openGauss 唐武国:成为开源项目的贡献者是一件骄傲的事情

2023年 9月 12日 32.4k 0

开源之夏

项目经验分享

2023 #01

# 项目基本信息

项目名称:openGauss用户操作模型

项目导师:汤学明

项目简述:使用机器学习根据openGauss审计日志中的用户操作提取用户操作特点,建立用户操作画像。

项目链接:https://summer-ospp.ac.cn/org/prodetail/23c9e0541

# 项目开发情况

1. 项目要求理解

项目要求探索openGauss已有的机器学习模块和用户操作模型构建算法,完成技术洞察博客一篇。在审计日志中提取出用户操作时间、操作客体等相关信息。根据用户操作信息提取用户操作特点,完成程序开发,实现用户操作画像功能,完成设计文档。

2. 方案描述

首先我们明确一下将用户的画像问题看作一个多分类任务,确定好模型的输入输出。模型的输入是设计好的用户操作特征,模型输出的是该用户的类型。而要从原始的审计日志到用户特征需要经过特征工程模块;在用户操作模型中选用的是以逻辑回归为基础分类器的多分类模型。

整体的流程如下图所示:

1. 首先需要收集指定时间段的审计审计日志

2. 通过分析改日志来筛除一些无效的数据,设计一些用户特征,例如用户的一次操 作需要包括主体、客体、操作类型(哪个用户对谁做了什么)等信息;

3. 接着需要处理数据集,例如给类别数据编号,划分数据集;

4. 使用为了评估模型分类的好坏,这里选择准确率作为指标;

5. 根据指标的好坏,我们可以调整模型的超参数,使得模型在训练集上分类得更好;

6. 选定好超参数后模型就可以使用了,之后数据库中又会产生许多的用户操作日志,我们可以重新收集日志来迭代模型。

3. 关键问题&解决办法

如何获取审计日志数据

我们的目标就是使用审计日志来进行用户画像,但是因为自己先前并没有使用过openGauss数据库手上没有现成的日志数据,于是只好在网上找找看有没有别人公开的。但是对于开发者来说数据库的日志属于很机密的数据很少会公开出来,查找了几天都没有结果,便只好自己模拟出来。所以在日志数据获取上花费的时间要比预期多些。

那具体怎么模拟呢?首先确定的是需要一个多用户操作的数据库,不然只给一名用户画像就没意义了;其次模拟既要尽可能地贴近真实同时也要简单。最后我选择设计一个多用户的教务管理系统并使用python脚本来自动模拟用户的操作,模拟结束后在openGauss中导出审计日志。

数据库设计

多用户设计

opengauss:超级管理员,创建用户pmpm:项目架构师;负责设计、创建数据库、表格、视图;创建下面的用户t_coder:老师端,主要对成绩表增、改,对教师表查询s_coder:学生端,成绩、学生表查询affair:教务处,负责增删学生表、老师表、课程表

用户画像怎么实现

一开始看到要对用户画像其实并不好怎么下手,于是我调研了一些用户画像的案例,学习一下当前做画像的主流算法和步骤,这样在心中也大概有谱了。

案例 算法

银行贷款用户的画像[1]

二分类 统计不同类型卡的用户年龄、收入分布实现画像;最后训练模型决定是否放贷

商店会员画像[2]

统计学 统计各年龄、性别消费者消费行为,以及不同时间段的消费行为

商店会员画像[3]

二分类 根据以往的预定信息判断是否会取消预定

黑客画像预警模型[4]

聚类 提取黑客的攻击时间、攻击方式、目标特征,进行聚类,建模群体画像

可以看到大多数用户行为的数据经过统计学分析,才确定好用户的特征,这些特征就是对用户的画像;接下来可以使用机器学习模型对用户进行分类。于是我认真分析了审计日志,并统计了主体、客体、操作类型的分布。原始的审计日志中每条数据包括下面这些属性:

    time: 操作的时间戳
    type: 操作类型
    result: 执行结果
    user_id: 用户ID
    username: 用户名
    database: 操作涉及到的数据库
    client_conninfo: 客户端连接信息,
    object_name: 操作的客体,例如用户是查询的哪个表,创建的哪个数据库,给哪个用户赋权等
    detail-info: 详细的操作信息

    用户操作类型的统计

    依据前面对操作类型的观察,可以发现操作主要分为:

    • 系统级操作,如登录,创建用户,分配权限,设置参数
    • 数据库级操作,创建数据库,模式,表
    • 表级操作,对表的增删改查

    因此,在设计操作特征的时候,也按照这些类别创建了各类操作的视图(所有视图均是统计每天的次数),最后便得到了下面的用户特征表,每一条数据表示某一天该用户的操作特征,包括以下8个属性:

    • query_login,用户每天的登录次数

    • query_sys,除了登录操作,其他的系统级操作次数
    • query_db,数据库级的操作次数
    • query_insert_all,所有对表的插入操作
    • query_insert_score,所有对score表的插入操作
    • query_insert_score,所有对score表的插入操作
    • query_sel_info,各类信息表的查询
    • query_sel_score,对成绩表的查询

    从日志中提取到操作特征后,计算出训练数据中各个特征的下四分位值a_25作为我们的判定阈值。即有75%的数据是大于这个a_25;同时防止该特征出现的很少例如操作数据库的特征,绝大部分数据都会等于0此时,对于这种情况我们手动设置该阈值为1。如果用户在该属性上大于阈值就赋予对应的标签于是就实现了用户画像。

    用户画像

    最后我还提出了使用用户操作特征的来识别危险的用户,具体做法是训练一个机器学习模型让模型学习区分各种类型的用户,这属于多分类模型,如果遇到异常的用户行为,由于与以往该用户的行为有区别,模型便会将其判断出来可疑的用户。

    例如在下面的测试中,将学生端的insert_score属性改为了1,模拟学生端用户修改了成绩表,这是异常操作,最后我们的模型确实能够识别出来。

      SELECT id, username, date,
      PREDICT BY log_m1 (FEATURES login, sys, db, insert_all, insert_score, sel_info, sel_score)
      as "PREDICT",
      name_id as "LABEL"
      FROM log_test2 where "PREDICT"!="LABEL" ;

      使用训练的log_m1模型预测用户类别

      包含异常数据的数据集

      识别的可疑用户

      # 开源之夏个人随访

      --项目经历--

      OSPP:请简单介绍一下自己吧。

      唐武国:大家好,我叫唐武国,是中南大学计算机学院的一名研二学生,这是我第一次参与开源之夏的活动,也是第一次参加开源项目。

      OSPP:你是如何了解并参与到开源之夏的?你认为完成一个项目任务的关键是什么?

      唐武国:其实最早我是在大四的时候从同学的口中了解到有开源之夏这个活动的,觉得这个活动形式非常好并决定挑战一下自己,但比较可惜的是当时已经过了报名时间,所以我一直都有关注OSPP的官网,并很早就将报名的时间记录到日程中。也算是比较幸运,第一次申请就成功了。

      相比OSPP中的各种开源项目都是“大”工程,自己以往的那些项目只能算是小demo,自己只管把功能实现了而没有考虑实际用户体验、性能和安全性。但正这些小项目也为我积累了许多的经验和试错机会,我也从中体会到团队合作的乐趣。我印象最深的是和队友做一个寻找走失老人的救援指挥系统,这是我第一次参与比较大的项目了,我们需要在几个月的时间内做好用于报案和救援的微信小程序,给队长指挥调度的网页应用。通过看教程、文档快速入门小程序开发和地图API的使用,最后经过与队友的共同努力还是顺利提交了作品。

      比赛答辩前一天还在修bug

      为了赶进度被关在实验楼

      --参与开源--

      OSPP:你眼中的开源是什么?

      唐武国:在我看来,开源组织和开源贡献者都是很了不起的。通过开源可以集中全球开发者的力量来做好一个项目,这件事听起来就让人激动。我在参加OSPP的过程中也了解到中国的开发者也在努力贡献自己的成果,领导开发了许多优秀的项目:openEuler、鸿蒙操作系统,openGauss数据库等等。

      OSPP:结合你自身经历,你认为高校学生参与开源有必要吗?学生会把参与开源作为一种优先级比较高的选择吗?

      唐武国:在我看来高校学生可能还是不会把参加开源项目作为优先选择,我身边的同学还是实习、参加竞赛的比较多。可能大多人知道开源这回事但并不知如何开始,也害怕参与开源项目的时候没有人指导。而刚好OSPP就提供了这样一个平台,对接了开源组织、导师、学生三方,还有奖励机制所以我还是很推荐大家参加的,我自己也希望能够继续参与开源之夏的活动。

      --收获与寄语--

      OSPP:有什么话想对计划参加开源之夏活动以及开源的学弟学妹们说?

      唐武国:参与开源真的是件很有意义的事,当你的名字出现在开源项目的贡献者名单中是很骄傲的。在整个参与这次开源的项目中,我确实收获了很多:了解如何参与开源、国产的开源数据库、如何构建用户画像等等,这种收获不仅是具体的知识也是学习能力的提升。在我开发的过程中也有幸能够得到与来自华中科大的汤学明老师、李浩然学长的悉心指导,让我不断改进代码,顺利完成项目要求。最后,可能你还是会担心项目太难、自己的能力不够。但相信我只要你肯投入一定的时间,你也可以的。

      [1]https://www.heywhale.com/mw/project/5ed9c13fb772f5002d6dc07c[2]https://www.heywhale.com/mw/project/64001b982bed561a3a9b9edc
      [3]https://www.kaggle.com/code/liamwoodly/eda-prediction[4]https://dl.ccf.org.cn/article/articleDetail.html?type=qkwz&_ack=1&id=5460231971866624END本文转自:开源之夏OSPP官微

      相关文章

      Oracle如何使用授予和撤销权限的语法和示例
      Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
      下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
      社区版oceanbase安装
      Oracle 导出CSV工具-sqluldr2
      ETL数据集成丨快速将MySQL数据迁移至Doris数据库

      发布评论