Динамика нажатия клавиш, которая используется в моделях машинного обучения в этой статье для распознавания пользователей, представляет собой поведенческую биометрию. Динамика нажатия клавиш использует особый способ ввода текста каждым человеком для подтверждения своей личности. Это достигается путем анализа двух событий нажатия клавиши и отпускания клавиши, которые составляют нажатие клавиши на клавиатуре компьютера, для извлечения шаблонов набора текста. В статье будет рассмотрено, как эти модели машинного обучения можно использовать в реальных ситуациях для прогнозирования пользователя.
В предыдущей статье описывалось, как мы можем обучить 3 модели ML на наборе из +880 вводов с клавиатуры от 100 пользователей, которым было предложено написать один и тот же текст 12 раз.
Приложения, которые мы будем использовать для моделирования реальной жизненной ситуации.
Песочница : для тестирования реальных сценариев мы будем использовать
Производство : когда мы хотим запустить это приложение в производство, мы можем просто заменить биты кода Flask кодом для
Flask — это веб-фреймворк, который мы можем использовать для репликации шлюза Lambda + API.
Lambda — это бессерверный веб-сервис, размещенный в AWS, который может запускать код, управляемый событиями, написанный на разных языках, однако для этого приложения мы будем использовать Python.
Поток данных:
Как упоминалось ранее, весь код вы можете найти на странице проекта Github:
https://github.com/BogdanAlinTudorache/KeystrokeDynamics
{ "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 } }
Если мы хотим протестировать процесс в песочнице, прежде чем переносить все на AWS, мы должны реплицировать сквозной вызов с помощью Flask.
В GitHub вы найдете полную версию flask_lambda_function.py, а в любой IDE вам просто нужно запустить скрипт, поскольку он автоматически запустит приложение flask.
В моем случае я использую IntelliJ Idea, поэтому просто запускаю скрипт (щелкните правой кнопкой мыши → запустить):
После запуска сценария в нижней части IDE вы увидите консоль Python, сообщающую, что веб-сервис запущен на локальном хосте и порту 5000 (я думаю, это значение по умолчанию, однако это также можно настроить).
Теперь каждый раз, когда мы выполняем HTTP-запрос POST, мы будем запускать приложение flask, имитируя реальный сценарий.
@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(), и предоставляем в качестве входных данных тело json из 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]
Эта функция написана упрощенно: в зависимости от параметра модели мы решаем загрузить конкретную предварительно обученную модель ML.
С помощью предварительно обученной модели мы делаем прогноз пользователя и возвращаем его инициатору запроса. ( см. последнее фото ответа почтальона )
Обучение моделей проведено в первой части этой статьи, см. ссылку выше .
Если вам понравилась статья и вы хотите меня поддержать, обязательно:
🔔 Следуй за мной Богдан Тудораке