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

Динамика нажатия клавиш, которая используется в моделях машинного обучения в этой статье для распознавания пользователей, представляет собой поведенческую биометрию. Динамика нажатия клавиш использует особый способ ввода текста каждым человеком для подтверждения своей личности. Это достигается путем анализа двух событий нажатия клавиши и отпускания клавиши, которые составляют нажатие клавиши на клавиатуре компьютера, для извлечения шаблонов набора текста. В статье будет рассмотрено, как эти модели машинного обучения можно использовать в реальных ситуациях для прогнозирования пользователя.


В предыдущей статье описывалось, как мы можем обучить 3 модели ML на наборе из +880 вводов с клавиатуры от 100 пользователей, которым было предложено написать один и тот же текст 12 раз.


Приложения, которые мы будем использовать для моделирования реальной жизненной ситуации.

Имитация реальной жизненной ситуации.


Архитектура

Песочница : для тестирования реальных сценариев мы будем использовать Почтальон + Колба .


Производство : когда мы хотим запустить это приложение в производство, мы можем просто заменить биты кода Flask кодом для AWS Лямбда .


Flask — это веб-фреймворк, который мы можем использовать для репликации шлюза Lambda + API.


Lambda — это бессерверный веб-сервис, размещенный в AWS, который может запускать код, управляемый событиями, написанный на разных языках, однако для этого приложения мы будем использовать Python.


Поток данных:

  1. Мы загружаем заголовок с идентификационными данными и моделью, которую хотим использовать. По сути, это наша полезная нагрузка json. В шапку так же добавим ключ авторизации (только Прод)
  2. Мы выполняем запрос метода HTTP POST к шлюзу приложения Flask/API.
  3. API Gateway проверяет ключ авторизации (ключ API) и, если он принимает запрос, отправляет полезную нагрузку в Lambda для обработки.
  4. FlaskApp/Lambda запускает базовый код
  5. В возвращаемом теле мы получаем идентификатор прогнозируемого пользователя, если событие прошло успешно, иначе мы получаем сообщение об ошибке.


Обзор высокого уровня


Общий обзор архитектуры + поток данных


Как упоминалось ранее, весь код вы можете найти на странице проекта 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 } }


Приложение Flask / приложение Lambda

Если мы хотим протестировать процесс в песочнице, прежде чем переносить все на AWS, мы должны реплицировать сквозной вызов с помощью Flask.

Как запустить приложение Flask?

В GitHub вы найдете полную версию flask_lambda_function.py, а в любой IDE вам просто нужно запустить скрипт, поскольку он автоматически запустит приложение flask.


В моем случае я использую IntelliJ Idea, поэтому просто запускаю скрипт (щелкните правой кнопкой мыши → запустить):

IDE

Тестирование реального сценария

После запуска сценария в нижней части IDE вы увидите консоль Python, сообщающую, что веб-сервис запущен на локальном хосте и порту 5000 (я думаю, это значение по умолчанию, однако это также можно настроить).

Консоль Python с приложением Flask, ожидающим запросов


Теперь каждый раз, когда мы выполняем HTTP-запрос POST, мы будем запускать приложение flask, имитируя реальный сценарий.

ПОСТ-запрос:

Тело POST

Ответ консоли 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(), и предоставляем в качестве входных данных тело 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.


С помощью предварительно обученной модели мы делаем прогноз пользователя и возвращаем его инициатору запроса. ( см. последнее фото ответа почтальона )


Обучение моделей проведено в первой части этой статьи, см. ссылку выше .


Если вам понравилась статья и вы хотите меня поддержать, обязательно:

🔔 Следуй за мной Богдан Тудораке

🔔 Свяжитесь со мной: LinkedIn | Реддит