Độ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ế.
Sandbox : Để kiểm tra các tình huống thực tế, chúng tôi sẽ sử dụng
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
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à:
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
{ "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.
{ "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 } }
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.
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):
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â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ế.
@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.
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