paint-brush
Động lực gõ phím — Dự đoán người dùng — Ứng dụng Lambdatừ tác giả@tudoracheabogdan
453 lượt đọc
453 lượt đọc

Động lực gõ phím — Dự đoán người dùng — Ứng dụng Lambda

từ tác giả Bogdan Tudorache8m2023/10/22
Read on Terminal Reader

dài quá đọc không nổi

Bài viết này đi sâu vào việc sử dụng động lực gõ phím như một dạng sinh trắc học hành vi để nhận dạng người dùng. Bằng cách sử dụng các mô hình học máy, bài viết nghiên cứu cách sử dụng kiểu gõ riêng của mỗi cá nhân — cụ thể là kiểu sự kiện nhấn phím và nhả phím — để xác minh danh tính. Tìm hiểu cách áp dụng các mô hình học máy này trong các tình huống thực tế để xác thực và dự đoán người dùng.
featured image - Động lực gõ phím — Dự đoán người dùng — Ứng dụng Lambda
Bogdan Tudorache HackerNoon profile picture
0-item
1-item
2-item

Động lực gõ phím được sử dụng trong các mô hình học máy của bài viết này để nhận dạng người dùng là sinh trắc học hành vi. Động lực gõ phím sử dụng cách gõ riêng biệt của mỗi người để xác nhận danh tính của họ. Điều này được thực hiện bằng cách phân tích 2 sự kiện nhấn phím trên Key-Press và Key-Release - tạo nên một lần nhấn phím trên bàn phím máy tính để trích xuất kiểu gõ. Bài viết sẽ xem xét cách sử dụng các Mô hình ML này trong các tình huống thực tế để dự đoán người dùng.


Bài viết trước đã mô tả cách chúng tôi có thể đào tạo 3 mô hình ML, trên một bộ đầu vào bàn phím +880 từ 100 người dùng được yêu cầu viết cùng một văn bản 12 lần.


Các ứng dụng mà chúng tôi sẽ sử dụng để mô phỏng tình huống thực tế.

Mô phỏng tình huống thực tế


Kiến trúc

Sandbox : Để kiểm tra các tình huống thực tế, chúng tôi sẽ sử dụng Người phát thơ + Bình giữ nhiệt .


Sản xuất : Khi muốn chuyển ứng dụng này sang sản xuất, chúng ta chỉ cần thay thế các bit của mã Flask bằng mã cho một AWS Lambda .


Flask là một khung web mà chúng ta có thể sử dụng để sao chép Cổng API Lambda +.


Lambda là một dịch vụ web không có máy chủ được lưu trữ trên AWS, có thể chạy mã hướng sự kiện được viết bằng nhiều ngôn ngữ khác nhau, tuy nhiên đối với ứng dụng này, chúng tôi sẽ sử dụng python.


Luồng dữ liệu là:

  1. Chúng tôi tải tiêu đề có dữ liệu nhận dạng và mô hình mà chúng tôi muốn sử dụng, về cơ bản đây là tải trọng json của chúng tôi. Trong tiêu đề, chúng tôi cũng sẽ thêm khóa ủy quyền (chỉ dành cho Prod)
  2. Chúng tôi thực hiện yêu cầu phương thức HTTP POST tới Cổng ứng dụng/API Flask
  3. API Gateway kiểm tra khóa ủy quyền (khóa api) và nếu nó chấp nhận yêu cầu, hãy gửi trọng tải đến Lambda để xử lý
  4. FlaskApp/Lambda chạy mã cơ bản
  5. Những gì chúng tôi nhận được trong phần nội dung trả về là ID của người dùng được dự đoán nếu sự kiện thành công, nếu không chúng tôi sẽ nhận được thông báo lỗi


Tổng quan về HiglLevel


Tổng quan cấp cao về kiến trúc + luồng dữ liệu


Như đã đề cập trước đó, tất cả mã bạn có thể tìm thấy trên trang dự án Github:

https://github.com/BogdanAlinTudorache/KeystroDynamics


Yêu cầu của người đưa thư

thô

 { "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": [] } ] }


Bạn có thể tải xuống tệp từ GitHub.

Thân hình

 { "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 } }


Ứng dụng Flask / Ứng dụng Lambda

Nếu chúng tôi muốn kiểm tra hộp cát quy trình trước khi chuyển mọi thứ sang AWS, chúng tôi phải sao chép cuộc gọi hai đầu bằng Flask.

Làm cách nào để khởi động ứng dụng Flask?

Trong GitHub, bạn sẽ tìm thấy phiên bản đầy đủ của jar_lambda_function.py và trong bất kỳ IDE nào, bạn chỉ cần chạy tập lệnh vì nó sẽ tự động khởi động ứng dụng bình.


Trong trường hợp của tôi, tôi đang sử dụng IntelliJ Idea nên tôi chỉ cần chạy tập lệnh (nhấp chuột phải → chạy):

IDE

Thử nghiệm một kịch bản thực tế

Khi tập lệnh được khởi động ở phần dưới cùng của IDE, bạn sẽ thấy bảng điều khiển python thông báo rằng dịch vụ web đã khởi động trên localhost và cổng 5000 (tôi nghĩ đây là mặc định tuy nhiên điều này cũng có thể được định cấu hình).

Bảng điều khiển Python với ứng dụng Flask đang chờ yêu cầu


Bây giờ, mỗi khi chúng tôi thực hiện một yêu cầu HTTP POST, chúng tôi sẽ kích hoạt ứng dụng bình, mô phỏng một tình huống thực tế.

ĐĂNG yêu cầu:

nội dung bài đăng

Trả lời bảng điều khiển Python:

trả lời bảng điều khiển

Người đưa thư trả lời:

Phản hồi của người đưa thư

Mã DeepDive

 @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)})


Đoạn mã trên được đặt thành jar-app tuy nhiên bằng cách nhận xét và bỏ ghi chú một số dòng nhất định, bạn có thể dễ dàng chuyển sang Lambda.


Cấu trúc rất đơn giản, chúng tôi chỉ đơn giản gọi một hàm khác là Predict_user() và cung cấp nội dung json làm đầu vào từ yêu cầu POST.

dự đoán_user()

 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]


Hàm này được viết đơn giản, tùy thuộc vào tham số mô hình mà chúng ta quyết định tải mô hình ML được đào tạo trước cụ thể.


Với mô hình được đào tạo trước, chúng tôi thực hiện dự đoán của người dùng và gửi lại cho người yêu cầu. ( xem ảnh phản hồi cuối cùng của Người đưa thư )


Việc huấn luyện các mô hình đã được thực hiện ở phần I của bài viết này, xem link trên .


Nếu bạn thích bài viết và muốn ủng hộ tôi, hãy đảm bảo:

🔔 Theo tôi Bogdan Tudorache

🔔 Kết nối với tôi: LinkedIn | Reddit