paint-brush
击键动力学 — 预测用户 — Lambda 应用程序经过@tudoracheabogdan
453 讀數
453 讀數

击键动力学 — 预测用户 — Lambda 应用程序

经过 Bogdan Tudorache8m2023/10/22
Read on Terminal Reader

太長; 讀書

本文深入探讨了如何使用击键动力学作为一种行为生物识别技术来进行用户识别。通过利用机器学习模型,本文研究了如何利用每个人独特的打字风格(特别是按键和释放事件的模式)来验证身份。 了解如何将这些机器学习模型应用于现实场景中以进行用户身份验证和预测。
featured image - 击键动力学 — 预测用户 — Lambda 应用程序
Bogdan Tudorache HackerNoon profile picture
0-item
1-item
2-item

本文用于用户识别的机器学习模型中使用的击键动力学是行为生物识别技术。击键动态使用每个人键入的独特方式来确认其身份。这是通过分析 Key-Press 和 Key-Release 上的 2 个击键事件来完成的 - 这些事件构成了计算机键盘上的击键以提取打字模式。本文将研究如何在现实生活中使用这些机器学习模型来预测用户。


上一篇文章描述了我们如何在来自 100 位用户的一组 +880 个键盘输入上训练 3 个 ML 模型,这些用户被要求编写相同的文本 12 次。


我们将使用这些应用程序来模拟现实生活中的情况。

模拟现实生活情况


架构

沙箱:为了测试现实生活场景,我们将使用邮差+烧瓶


生产:当我们想要将此应用程序投入生产时,我们可以简单地将 Flask 代码替换为AWS Lambda


Flask 是一个 Web 框架,我们可以用它来复制 Lambda + API 网关。


Lambda 是托管在 AWS 中的无服务器 Web 服务,可以运行用各种语言编写的事件驱动代码,但对于此应用程序,我们将使用 python。


数据流程为:

  1. 我们用识别数据和我们想要使用的模型加载标头,这基本上是我们的json 有效负载。标头中,我们还将添加授权密钥(仅限产品)
  2. 我们向 Flask App/API Gateway 发出 HTTP POST 方法请求
  3. API Gateway 检查授权密钥(api key),如果接受请求,则将负载发送到 Lambda 进行处理
  4. FlaskApp/Lambda 运行底层代码
  5. 如果事件成功,我们在返回正文中得到的是预测用户的 ID,否则我们会收到一条错误消息


高级概述


架构+数据流的高级概述


如前所述,您可以在 Github 项目页面上找到所有代码:

https://github.com/BogdanAlinTudorache/KeyrinkleDynamics


邮递员请求

生的

{ "info": { "_postman_id": "c62ddbda-e487-432f-998a-4dfc9313f0fa", "name": "BogdanTudorache", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "predict_user", "request": { "method": "POST", "header": [], "body": { "mode": "raw", "raw": "{\n \"Model\": \"RF\",\n \"HT\": {\n \"Mean\": 48.43,\n \"STD\": 23.34\n },\n \"PPT\": {\n \"Mean\": 120.43,\n \"STD\": 37.41\n },\n \"RRT\": {\n \"Mean\": 124.43,\n \"STD\": 45.34\n },\n \"RPT\": {\n \"Mean\": 132.56,\n \"STD\": 47.12\n }\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "http://127.0.0.1:5000", "protocol": "http", "host": [ "127", "0", "0", "1" ], "port": "5000" } }, "response": [] } ] }


您可以从 GitHub 下载该文件。

身体

{ "Model": "RF", "HT": { "Mean": 48.43, "STD": 23.34 }, "PPT": { "Mean": 120.43, "STD": 37.41 }, "RRT": { "Mean": 124.43, "STD": 45.34 }, "RPT": { "Mean": 132.56, "STD": 47.12 } }


Flask 应用程序 / Lambda 应用程序

如果我们想在将所有内容移至 AWS 之前对流程进行沙盒测试,我们必须使用 Flask 复制端到端调用。

如何启动 Flask 应用程序?

在 GitHub 中,您将找到 Flask_lambda_function.py 的完整版本,并且在任何 IDE 中您只需要运行该脚本,因为它会自动启动 Flask 应用程序。


就我而言,我使用的是 IntelliJ Idea,因此我只需运行脚本(单击右键 → 运行):

集成开发环境

测试现实生活场景

一旦脚本在 IDE 的底部启动,您将看到 python 控制台,通知 Web 服务已在 localhost 和端口 5000 上启动(我认为这是默认设置,但也可以配置)。

带有等待请求的 Flask 应用程序的 Python 控制台


现在,每次我们执行 HTTP 请求 POST 时,我们都会触发 Flask 应用程序,模拟现实生活场景。

发布请求:

发布正文

Python控制台回复:

控制台回复

邮递员回复:

邮递员回复

代码深入探讨

@app.route('/', methods=['GET', 'POST']) def index(): # Bellow code should be uncommented when running in AWS:Lambda # above should be commented as well as flask import + app definition # def lambda_handler(event, context): """ Lambda handler: When a request hits the API gateway linked to this lambda_function this is the function that gets called. The request data is passed as the event variable which is a dictionary object, in this case it the json of the POST request from which we extract the body details """ # Parses the details from the POST request: extracts model and input data # Based on model it imports the trained model from local # Outputs the predicted user based on input data try: prediction = functions.predict_user(request.get_json()) # Below code should be uncommented when running from AWS, above should be commented. # prediction = functions.predict_user(event) return jsonify({'statuscode': 200, 'status': 'success', 'predicted user': str(prediction) }) except Exception as e: return jsonify({'statuscode': 400, 'status': 'error', 'message': str(e)})


上面的代码设置为flask-app,但是通过注释和取消注释某些行,您可以轻松切换到Lambda。


结构非常简单,我们只是调用另一个函数,即 Predict_user() 并提供来自 POST 请求的 json 正文作为输入。

预测用户()

 def predict_user(event): """ Gets the input details from the body of the POST request and returns the predicted user """ # Print the event for debugging purposes print(event) # Check if the message has the correct body structure if ['Model', 'HT', 'PPT', 'RRT', 'RPT'] == list(event.keys()): print(f"Model is:", event['Model']) if event["Model"] == "SVM": # Load the trained SVM model from the joblib file model_path = os.path.join(basedir, 'models', 'svm_model.joblib') model = joblib.load(model_path) elif event["Model"] == "RF": # Load the trained Random Forest model from the joblib file model_path = os.path.join(basedir, 'models', 'rf_model.joblib') model = joblib.load(model_path) elif event["Model"] == "XGBoost": # Load the trained XGBoost model from the joblib file model_path = os.path.join(basedir, 'models', 'xgb_model.joblib') model = joblib.load('model_path') # Extract the features from the event dictionary features = [ event['HT']['Mean'], event['HT']['STD'], event['PPT']['Mean'], event['PPT']['STD'], event['RRT']['Mean'], event['RRT']['STD'], event['RPT']['Mean'], event['RPT']['STD'] ] # Make a prediction using the loaded model and the extracted features prediction = model.predict([features]) # Return the predicted user return prediction[0]


这个函数的编写很简单,根据我们决定加载特定的预训练 ML 模型的模型参数。


使用预先训练的模型,我们进行用户预测并将其返回给请求者。 (见最后邮递员回复照片


模型的训练已在本文第一部分中完成,请参阅上面的链接


如果您喜欢这篇文章并愿意支持我,请确保:

🔔 跟我来博格丹·图多拉奇

🔔 与我联系: LinkedIn | 红迪网